【问题标题】:How to compare elements between two XDocument's by using Linq?如何使用 Linq 比较两个 XDocument 之间的元素?
【发布时间】:2017-08-19 15:27:26
【问题描述】:

我尝试比较来自两个不同 XDocument 的元素,其中一些 XElement 在 Linq 中相互匹配,并且我还想尝试如何在 'srcTree' 中显示不在 'srcTree2' 中的元素。我之前尝试过使用 Linq 的“位置”,但不幸的是没有任何运气。

我的代码如下:

class LearnXML {
    static void Main() {
        XDocument srcTree = new XDocument(
            new XComment("This is a comment"),
            new XElement("Root",
                new XElement("Child", "data1"),
                new XElement("Child", "data2"),
                new XElement("Child", "data3"),
                new XElement("Child", "data4"),
                new XElement("Info", "info5"),
                new XElement("Info", "info6"),
                new XElement("Info", "info7"),
                new XElement("Info", "info8")
            )
        );

        XDocument srcTree2 = new XDocument(
            new XComment("This is a comment"),
            new XElement("Root",
                new XElement("Child", "data1"),
                new XElement("Child", "data4"),
                new XElement("Info", "info6"),
                new XElement("Info", "info8")
            )
        );

        Console.WriteLine(srcTree);

        XDocument doc = new XDocument(
            new XComment("This is a comment"),
            new XElement("Root",
                from el in srcTree2.Element("Root").Elements()
                join rp in srcTree.Element("Root").Elements()
                on !el.Element("Child").Value equals rp.Element("Child").Value
                select el
            )
        );

        Console.WriteLine(doc);
    }
}

【问题讨论】:

    标签: c# linq linq-to-xml


    【解决方案1】:

    您的代码中的问题是您尝试通过相等连接两个Roots,然后将其反转。所以你的代码甚至无法编译。

    您可以使用嵌套查询检索两个Roots 之间的差异。因此,下面的代码不仅检索"Child" 节点,还检索所有差异节点。

          XDocument doc = new XDocument(
                new XComment("This is a comment"),
                new XElement("Root",
                    from left in srcTree.Element("Root").Elements()
                    where left != null && !(from right in srcTree2.Element("Root").Elements()
                                            where right != null
                                            select right.Value).Contains(left.Value)
                    select left)
            );
    

    如果您真的想检索节点 "Child" 之间的差异,只需按名称获取元素:

            XDocument doc = new XDocument(
                new XComment("This is a comment"),
                new XElement("Root",
                    from left in srcTree.Element("Root").Elements("Child")
                    where left != null && !(from right in srcTree2.Element("Root").Elements("Child")
                                            where right != null
                                            select right.Value).Contains(left.Value)
                    select left)
            );
    

    【讨论】:

    • 抱歉回复晚了,这很好用。谢谢你。
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多