如何查找完全位于两个指定节点之间的节点

发布于 2024-10-07 05:40:53 字数 595 浏览 2 评论 0原文

在如下所示的 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),但它们将具有唯一的属性,因此易于识别。

In a XML document such as the following:

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

How can I use the wonder of LINQ to XML to find any nodes completely contained by the fish nodes? Note that in this example, I have deliberately placed the fish nodes at different levels in the document, as I anticipate this scenario will occur in the wild.

Obviously, in this example, I would be looking to get the two anotherNode nodes, but not the pointlessContainer node.

NB: the two 'delimiting' nodes may have the same type (e.g. fish) as other non-delimiting nodes in the document, but they would have unique attributes and therefore be easy to identify.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倒带 2024-10-14 05:40:53

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

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

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

For your sample, the following should do

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

But I haven't tested or thoroughly pondered whether it works for other cases. Maybe you can check for some of your sample data and report back whether it works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文