2013-11-25 16 views
0

我有兩個具有相同模式/結構但具有不同數據的XML文件。我正在嘗試使用Linqpad(Linq to XML)來查找這兩個文件之間的差異。查找使用linqpad和linq到xml的兩個XML文件中的匹配節點找到0個結果

這裏是我的代碼...

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()       

上次轉儲()將返回0的結果。我知道這兩個文件中有匹配的數據。

編輯我忘了提及,如果我轉儲每個查詢的結果,我會得到兩個序列的結果(非常相似)。

我也曾嘗試這裏顯示的方法...
Compare two xml and print the difference using LINQ

(它結合了文件合併爲一個序列,然後就比較),但我在歌廳相同的結果... 0的結果。

該方法似乎也可以在第一個訂單序列上創建笛卡爾產品。

我只想從文件中找到匹配或缺失的節點。

我在這裏錯過了什麼?

+0

xml結構是什麼樣的? – Chris

回答

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(); 
+0

就是這樣......你達人。 –

+0

現在,如果你想幫助一個更有趣的問題,那就太好了。 http://stackoverflow.com/questions/20218821/how-do-you-use-linq-to-xml-to-find-matching-nodes-in-two-different-xml-files –