问题
I have two XML files with the same schema/structure but with different data. I am trying to use Linqpad (Linq to XML) to find the differences between the two files.
Here is my code...
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()
The last Dump() is returning 0 results. I KNOW there is matching data in the two files.
EDIT I forgot to mention that if I dump the results of each of the queries I get results (that are very similar) for both sequences.
I have also tried the approach shown here...
Compare two xml and print the difference using LINQ
(which combines the files into one sequence and then does the compare) but I am geting the same result...0 results.
That approach also seems to create a cartesian product on the first orders sequence.
All I want is to find matching or missing nodes from the files.
What am I missing here?
回答1:
The problem is that matchingResults
is doing a compare of XElement
(reference equality) - not string
(string contents). orders
and orders2
are selecting firstName
and lastName
as XElement
. So, to get what you expect, either change orders
and orders2
to select firstName
and lastName
as
firstName = file1.Element("FirstName").Value
or compare them in matchingResults
as
i.name.firstName.Value == j.name.firstName.Value
Here's a full example using the first option:
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();
来源:https://stackoverflow.com/questions/20203593/finding-matching-nodes-in-two-xml-files-using-linqpad-and-linq-to-xml-is-finding