如何在两个指定节点之间完全找到节点

时间:2010-12-13 14:35:32

标签: c# xml linq-to-xml

在XML文档中,如下所示:

<root>
  <fish value="Start"/>
  <pointlessContainer>
    <anotherNode value="Pick me!"/>
    <anotherNode value="Pick me too!"/>
    <fish value="End"/>
  </pointlessContainer>
</root>

如何使用LINQ to XML的奇迹来查找fish节点包含的完全的任何节点?请注意,在此示例中,我故意将fish节点放在文档的不同级别,因为我预计这种情况会在野外发生。

显然,在这个例子中,我希望得到两个anotherNode节点,而不是pointlessContainer节点。

注意:两个“分隔”节点可能与文档中的其他非分隔节点具有相同的类型(例如fish),但它们具有唯一属性,因此易于识别。

1 个答案:

答案 0 :(得分:0)

对于您的样本,以下内容应该

        XDocument doc = XDocument.Load(@"..\..\XMLFile2.xml");
        XElement start = doc.Descendants("fish").First(f => f.Attribute("value").Value == "Start");
        XElement end = doc.Descendants("fish").First(f => f.Attribute("value").Value == "End");
        foreach (XElement el in 
            doc
            .Descendants()
            .Where(d => 
                XNode.CompareDocumentOrder(d, end) == -1 
                && XNode.CompareDocumentOrder(d, start) == 1 
                && !end.Ancestors().Contains(d)))
        {
            Console.WriteLine(el);
        }

但我没有测试或彻底思考它是否适用于其他情况。也许您可以检查一些样本数据并报告它是否有效。