使用linqpad和linq到xml在两个XML文件中查找匹配节点,结果为0

时间:2013-11-25 21:21:51

标签: linq linq-to-xml linqpad

我有两个具有相同架构/结构但具有不同数据的XML文件。我正在尝试使用Linqpad(Linq to XML)来查找这两个文件之间的差异。

这是我的代码......

XElement FILE1 = XElement.Load (@"..\FILE1.XML");
XElement FILE2 = XElement.Load (@"..\FILE2.XML");

var orders = from file1 in FILE1.Descendants("Players").Elements("Player")
                        select new {
                            name=new {
                                firstName=file1.Element("FirstName"),
                                lastName=file1.Element("LastName")
                            }                           
                        };

var orders2 = 
             from file2 in FILE2.Descendants("Players").Elements("Player")
                        select new {
                            name=new {
                                firstName=file2.Element("FirstName"),
                                lastName=file2.Element("LastName")
                            }                           
                        };

var matchingResults = from i in orders from j in orders2 where (i.name.firstName==j.name.firstName && i.name.lastName==j.name.lastName)
                            select i;
matchingResults.Dump()                          

最后一个Dump()返回0结果。我知道这两个文件中有匹配的数据。

编辑我忘了提到如果我转储每个查询的结果,我会得到两个序列的结果(非常相似)。

我也试过这里显示的方法......
Compare two xml and print the difference using LINQ

(它将文件组合成一个序列然后进行比较)但是我得到了相同的结果... 0结果。

这种方法似乎也在第一个订单序列上创建了笛卡尔积。

我想要的只是从文件中找到匹配或丢失的节点。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

问题是matchingResults正在进行XElement(引用相等)的比较 - 而不是string(字符串内容)。 ordersorders2正在选择firstNamelastName作为XElement。因此,要获得您的期望,请更改ordersorders2以选择firstNamelastName

firstName = file1.Element("FirstName").Value

或在matchingResults中将它们作为

进行比较
i.name.firstName.Value == j.name.firstName.Value

以下是使用第一个选项的完整示例:

XElement FILE1 = XElement.Parse(
@"<Root>
    <Players>
        <Player><FirstName>Bob</FirstName><LastName>Smith</LastName></Player>
        <Player><FirstName>John</FirstName><LastName>Smith</LastName></Player>
    </Players>
</Root>");
    XElement FILE2 = XElement.Parse(
@"<Root>
    <Players>
        <Player><FirstName>Bob</FirstName><LastName>Smith</LastName></Player>
        <Player><FirstName>Mike</FirstName><LastName>Smith</LastName></Player>
    </Players>
</Root>");

var orders = from file1 in FILE1.Descendants("Players").Elements("Player")
                    select new {
                        name=new {
                            firstName=file1.Element("FirstName").Value,
                            lastName=file1.Element("LastName").Value
                        }
                    };

var orders2 = from file2 in FILE2.Descendants("Players").Elements("Player")
                    select new {
                        name=new {
                            firstName=file2.Element("FirstName").Value,
                            lastName=file2.Element("LastName").Value
                        }
                    };

//orders.Dump();
//orders2.Dump();

var matchingResults = from i in orders from j in orders2
                                where (i.name.firstName == j.name.firstName && i.name.lastName == j.name.lastName)
                                select i;
matchingResults.Dump();
相关问题