是否有更好的方法来读取LINQ-to-XML中的XML后代?

时间:2011-01-20 17:41:38

标签: c# generics linq-to-xml

我有这样的代码:

string result = xml.Root.Descendants("XYZ").Descendants("ABC").Descendants("MNO").Single().Value;

1)有没有更好的方法来读取价值?有些通用方法不依赖于我必须去的节点的nuber吗?

2)删除“XYZ”,“ABC”等硬编码依赖的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您不关心父节点依赖关系,您可以直接转到后代调用中的"MNO"

xml.Root.Descendants("MNO")

然而,这将产生一系列MNO后代,它们可能出现在XML结构中的任何位置。

<root>
   <MNO />
   <ABC>
      <MNO />
   </ABC>
   <ABC>
      <XYZ>
         <MNO />
      </XYZ>
   </ABC>
</root>

所有MNO元素都在序列中。

答案 1 :(得分:2)

目前还不清楚你的意思是什么,但这就是你所追求的目标吗?

public IEnumerable<XElement> PathDescendants(
    this XElement element,
    params XName[] names)
{
    return new[] { element }.PathDescendants(names);
}

public IEnumerable<XElement> PathDescendants(
    this IEnumerable<XElement> elements,
    params XName[] names)
{
    return names.Aggregate(elements,
                           (current, name) => current.Descendants(name));
}

然后你可以打电话:

string result = xml.Root.PathDescendants("XYZ", "ABC", "MNO").Single().Value;