C#Linq XML查询父节点中基于子节点值的多个同名元素

时间:2015-04-27 04:37:04

标签: c# xml linq

我是新手,并尝试根据以下xml检索文件节点的所有值。

<Changes>
  <Change id="Rest">
    <Name>Restructure</Name>
    <TIDE>
      <Files>
        <File>REGION</File>
      </Files>
    </TIDE>
    <Click>
      <Files>
        <File>DISTRICT</File>
      </Files>
    </Click>
  </Change>
  <Change id="st">
    <Name>New ST</Name>
    <TIDE>
      <Files>
        <File>REGION</File>
      </Files>
    </TIDE>
    <Click>
      <Files>
        <File>DISTRICT</File>
      </Files>
    </Click>
  </Change>
</Changes>

我正在使用的代码给我一个错误&#34;序列不包含任何元素&#34;。我试图通过在这个论坛上搜索几个例子来构建这个代码。有人可以帮助我,非常感谢。

var items = (from i in xmldoc.Root.Elements("Change")
                         where (string)i.Element("Name").Value == listBox1.SelectedValue.ToString()
                         select i).First().Elements("File").ToList();

2 个答案:

答案 0 :(得分:1)

此LINQ查询返回Change个节点:

(from i in xmldoc.Root.Elements("Change")
 where (string)i.Element("Name").Value == listBox1.SelectedValue.ToString()
 select i)

...而Change个节点没有直接子节点File。在这种情况下,您可以使用Descendants()代替Elements()

var items = (from i in xmldoc.Root.Descendants("Change")
             where i.Element("Name").Value == listBox1.SelectedValue.ToString()
             select i).First().Descendants("File").ToList();

答案 1 :(得分:1)

您将收到此错误:

“序列不包含任何元素”

通过First()方法调用抛出。 First()预计至少会列出一个结果,并且Where子句中的过滤器会删除所有结果(可能没有从列表框中正确获取名称)。

我在我的机器上测试过,将listBox1.SelectedValue.ToString()替换为“Restructure”,错误不再发生。

即使未抛出异常,结果也不如预期,项目列表为空。要解决这个问题,你必须遵循har07响应,一切都会正常工作。