在下面的XML示例中,可以有许多" Element "条目。对于每个"元素",只能有一个"系统"条目,但在同一个"元素"中,"系统"条目旁边可以有多个"设备"条目。
我想知道对于每个"元素",我如何在c#中构建一个LINQ到XML查询,可以选择如下数据:
对于"System"包含"1A7"的每个"Element",只返回那些"Device"-"InfoB"-"Settings"-"name"值同时具有"Device"-"InfoA"-"Core"值为FALSE的值,然后将这些匹配值放入List中。
上周的LINQ对我来说是非常困难的。我没有发布一个代码片段,因为我认为没有一个大量的代码片段,我已经工作过(和失败)将澄清这个问题比上面的查询大纲。我将非常感谢一些帮助,我希望上面的查询对这里的LINQ到XML专家来说是相当简单的。
XML:<?xml version="1.0" standalone="yes" ?>
<Base_TP>
<Element>
<System>
<id>341A7</id>
</System>
<Device>
<InfoA>
<id>12</id>
<Core>TRUE</Core>
</InfoA>
<InfoB>
<Settings>
<type>0</type>
<name>DeviceA</name>
</Settings>
</InfoB>
</Device>
<Device>
<InfoA>
<id>13</id>
<Core>FALSE</Core>
</InfoA>
<InfoB>
<Settings>
<type>0</type>
<name>DeviceB</name>
</Settings>
</InfoB>
</Device>
<Device>
<InfoA>
<id>14</id>
<Core>FALSE</Core>
</InfoA>
<InfoB>
<Settings>
<type>0</type>
<name>DeviceC</name>
</Settings>
</InfoB>
</Device>
</Element>
</Base_TP>
var doc = XDocument.Load("Input.xml");
var values = from e in doc.Root.Elements("Element")
where ((string)e.Element("System").Element("id")).Contains("1A7")
from d in e.Elements("Device")
where !(bool)d.Element("InfoA").Element("Core")
select (string)d.Element("InfoB").Element("Settings").Element("name");
返回IEnumerable<string>
。Call ToString
on it,得到List<string>
与物化结果。
XDocument xDoc = XDocument.Load("System.xml");
List<string> result = xDoc.Descendants("Element").Where(el => el.Element("System").Element("id").Value.Contains("1A7")).SelectMany(e => e.Descendants("Device").Where(d => d.Element("InfoA").Element("Core").Value.ToUpper() == "FALSE").Select(x => x.Element("InfoB").Element("Settings").Element("name").Value)).ToList();
我将在visual basic中做这个,因为它有原生的xml内联支持,但翻译非常简单。
Dim elements = From e In xml...<Element>
Where e.<System>.<Id>.Value.Contains("1A7")
Select e
Dim deviceBs = (From e In elements
Where e.<Device>.<InfoA>.<Core>.Value = "FALSE"
Select e.<Device>.<InfoB>.<name>.Value).ToList