【问题标题】:Finding Matching Nodes in two XML files using linqpad and linq to xml is finding 0 results使用 linqpad 和 linq to xml 在两个 XML 文件中查找匹配节点发现 0 个结果
【发布时间】:2013-11-26 21:52:29
【问题描述】:

我有两个具有相同架构/结构但数据不同的 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个结果。

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

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

我在这里错过了什么?

【问题讨论】:

  • xml结构是什么样的?

标签: linq linq-to-xml linqpad


【解决方案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();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多