LINQ to XML:选择以其他值为条件的值

时间:2014-03-19 04:00:00

标签: c# xml linq linq-to-xml ienumerable

在下面的XML示例中,可以有许多“元素”条目。对于每个“元素”,只能有一个“系统”条目,但在同一个“元素”内的“系统”条目旁边可能有许多“设备”条目。

我想知道每个''元素',如何在C#中构建一个LINQ to XML查询,可以按如下方式选择数据:

对于每个''元素',''系统''包含''1A7'',只返回那些''设备'''''InfoB'' - ''设置'''''名称''值还有一个''Device'' - ''InfoA'' - '''Core''值为FALSE,然后将这些匹配值放入List。

在过去的一周里,LINQ对我来说非常困难。我没有发布代码片段,因为我认为我所完成的大量代码片段(并且失败了)都不会比上面的查询大纲更清楚地解释这个问题。我非常感谢一些帮助,我希望上面的查询对于LINQ to 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>

3 个答案:

答案 0 :(得分:1)

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>。在其上调用ToString即可获得具有实现结果的List<string>

答案 1 :(得分:0)

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();

答案 2 :(得分:-1)

我将在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