我有两个具有相同架构/结构但具有不同数据的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结果。
这种方法似乎也在第一个订单序列上创建了笛卡尔积。
我想要的只是从文件中找到匹配或丢失的节点。
我在这里缺少什么?
答案 0 :(得分:1)
问题是matchingResults
正在进行XElement
(引用相等)的比较 - 而不是string
(字符串内容)。 orders
和orders2
正在选择firstName
和lastName
作为XElement
。因此,要获得您的期望,请更改orders
和orders2
以选择firstName
和lastName
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();