【问题标题】:How to find nodes entirely between two specified nodes如何在两个指定节点之间完全找到节点
【发布时间】:2010-12-13 14:35:32
【问题描述】:

在 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),但它们具有独特的属性,因此易于识别。

【问题讨论】:

  • 树中的选定节点是否比“开始”节点更高
  • 哦,你的意思是如果开始和结束节点在不同的分支上?我没有想到这一点。我想在技术上这是可能的。 tbh 我对这种类型的 XML (WordML) 了解不够,可以肯定。
  • 我认为这极不可能,尽管对于 MS Office 格式没有什么让我感到惊讶的。

标签: c# xml linq-to-xml


【解决方案1】:

对于您的示例,应该执行以下操作

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

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

【讨论】:

  • 有这么复杂的东西,我要进行一些严肃的单元测试,所以当我编写它们时我会告诉你是否通过了!
  • 嗯。我可以看到你的代码在做什么。谢谢,我要花几个小时才能找到像 XNode.CompareDocumentOrder() 这样的方法。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2017-12-25
  • 2018-02-14
  • 1970-01-01
相关资源
最近更新 更多