使用LINQ to XML来匹配更深层次的后代元素?

时间:2011-04-14 13:47:20

标签: c# linq-to-xml descendant

假设我有以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <project>
    <ixGroup>105</ixGroup>
    <sGroup>Place Group</sGroup>
  </project>
  <project>
    ...

我使用以下代码从中提取不同的<ixGroup><sGroup>文本值:

XDocument doc = XDocument.Load(@"C:\temp\xmlParse2.xml");

var projects = (from project in doc.Descendants("project")
                select new {
                    id = project.Element("ixGroup").Value,
                    name = project.Element("sGroup").Value
                }).Distinct();

foreach(var project in projects)
{
    project.id.Dump("id");
    project.name.Dump("name");
}

如果同一个xml文件有一个额外的元素,如下面添加的<projects>

<response>
  <projects>
    <project>
      <ixGroup>105</ixGroup>
      <sGroup>Place Group</sGroup>
    </project>
    <project>
      ...

如何修改上面的LINQ代码才能访问<project>元素?

3 个答案:

答案 0 :(得分:2)

您根本不需要修改代码。 Descendants方法将根据需要在树下搜索,以便找到匹配的元素,这既可以是诅咒也可以是祝福。在您的情况下,即使添加中间<projects>节点,所写的代码也将继续有效。

(仅搜索直接子方法的方法是Children()

答案 1 :(得分:2)

你不必。我刚刚测试了它,你当前的LINQ语句仍将返回所有<project>元素,无论它们是否嵌套在<projects>元素中。

答案 2 :(得分:0)

元素只搜索子节点,但是Descendants一直在树下。换句话说,你不必做任何事情。