Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中从XML文档中筛选元素的最简单方法_C#_.net_Xml_Linq To Xml - Fatal编程技术网

C# 在.NET中从XML文档中筛选元素的最简单方法

C# 在.NET中从XML文档中筛选元素的最简单方法,c#,.net,xml,linq-to-xml,C#,.net,Xml,Linq To Xml,假设我有下面的医生 <sets version="2.0"> <setting> <id>set1</id> <value>80</value> <label>EVersion</label> <type>Val</type> <format>R</format> <bits>

假设我有下面的医生

<sets version="2.0">
  <setting>
    <id>set1</id>
    <value>80</value>
    <label>EVersion</label>
    <type>Val</type>
    <format>R</format>
    <bits>
      <addr>0</addr>
      <startBit>0</startBit>
      <bitWidth>8</bitWidth>
    </bitspec>
  </setting>
  <setting>
    <id>set3</id>
    <value>50</value>
    <label>GVersion</label>
    <type>Bin</type>
    <format>R</format>
    <bits>
      <addr>0</addr>
      <startBit>0</startBit>
      <bitWidth>8</bitWidth>
    </bitspec>
  </setting>
  </sets>

set1
80
外翻
瓦尔
R
0
0
8.
set3
50
GVersion
箱子
R
0
0
8.
我只需要ID和value元素-

<sets version="2.0">
  <setting>
    <id>set1</id>
    <value>80</value>
  </setting>
  <setting>
    <id>set3</id>
    <value>50</value>
  </setting>
  </sets>

set1
80
set3
50
如何使用XDocument和LINQ仅选择这些

var xdoc = XDocument.Load(@"c:\myxml.xml");

var settings = 
    xdoc.Element("sets").Elements("setting")
    .Select(s => new 
       { 
         Id = s.Element("id").Value, 
         Value = s.Element("value").Value 
       });
这将生成一个匿名类型的
IEnumerable
,其属性为
Id
Value
(两个字符串)

您可以创建自己的
设置
类型,并在投影中使用该设置,如果需要,还可以将“value”字符串值转换为整数

这将生成一个匿名类型的
IEnumerable
,其属性为
Id
Value
(两个字符串)


您可以创建自己的
设置
类型,并在投影中使用它,如果需要,还可以将“value”字符串值转换为整数。

我的第一个答案与其他答案非常相似,也不太清楚,因此我将其删除。然而,我认为编写一些linq将是一个很好的练习,当所需元素处于任意深度时,它将生成过滤后的XML。这就是我想到的:

Func<XElement, XElement> f = null; 
f = e => e.Name == "id" || e.Name == "value" ? e : //on a match, return the node
    new[] { new XElement(e.Name, e.Elements().Select(f)) } //else recurse
    .FirstOrDefault(y => y.Elements().Any()); //keeping subtrees with matches

XElement resultXmlElement = f(XDocument.Parse(yourXmlString).Root);
Func f=null;
f=e=>e.Name==“id”| | e.Name==“value”?e://在匹配项上,返回节点
new[]{new-XElement(e.Name,e.Elements().Select(f))}//else递归
.FirstOrDefault(y=>y.Elements().Any())//用匹配保持子树
XElement resultXmlElement=f(XDocument.Parse(yourXmlString.Root));

我的第一个答案与其他答案非常相似,也不太清楚,所以我删除了它。然而,我认为编写一些linq将是一个很好的练习,当所需元素处于任意深度时,它将生成过滤后的XML。这就是我想到的:

Func<XElement, XElement> f = null; 
f = e => e.Name == "id" || e.Name == "value" ? e : //on a match, return the node
    new[] { new XElement(e.Name, e.Elements().Select(f)) } //else recurse
    .FirstOrDefault(y => y.Elements().Any()); //keeping subtrees with matches

XElement resultXmlElement = f(XDocument.Parse(yourXmlString).Root);
Func f=null;
f=e=>e.Name==“id”| | e.Name==“value”?e://在匹配项上,返回节点
new[]{new-XElement(e.Name,e.Elements().Select(f))}//else递归
.FirstOrDefault(y=>y.Elements().Any())//用匹配保持子树
XElement resultXmlElement=f(XDocument.Parse(yourXmlString.Root));

使用linq转换为xml,代码如下:

var xml_str = @"<sets version=""2.0"">
  <setting>
    <id>set1</id>
    <value>80</value>
    <label>EVersion</label>
    <type>Val</type>
    <format>R</format>
    <bits>
      <addr>0</addr>
      <startBit>0</startBit>
      <bitWidth>8</bitWidth>
    </bits>
  </setting>
  <setting>
    <id>set3</id>
    <value>50</value>
    <label>GVersion</label>
    <type>Bin</type>
    <format>R</format>
    <bits>
      <addr>0</addr>
      <startBit>0</startBit>
      <bitWidth>8</bitWidth>
    </bits>
  </setting>
  </sets>";

var doc = XDocument.Parse(xml_str);

var settings = new XElement("sets",
    from setting in doc.Element("sets").Elements("setting")
    select new XElement("setting", setting.Element("id"), setting.Element("value")));

Console.WriteLine(settings);

使用linq到xml,代码如下:

var xml_str = @"<sets version=""2.0"">
  <setting>
    <id>set1</id>
    <value>80</value>
    <label>EVersion</label>
    <type>Val</type>
    <format>R</format>
    <bits>
      <addr>0</addr>
      <startBit>0</startBit>
      <bitWidth>8</bitWidth>
    </bits>
  </setting>
  <setting>
    <id>set3</id>
    <value>50</value>
    <label>GVersion</label>
    <type>Bin</type>
    <format>R</format>
    <bits>
      <addr>0</addr>
      <startBit>0</startBit>
      <bitWidth>8</bitWidth>
    </bits>
  </setting>
  </sets>";

var doc = XDocument.Parse(xml_str);

var settings = new XElement("sets",
    from setting in doc.Element("sets").Elements("setting")
    select new XElement("setting", setting.Element("id"), setting.Element("value")));

Console.WriteLine(settings);