2017-08-19 42 views
0

我嘗試比較兩個不同XDocument的元素,其中一些XElements在Linq中相互匹配,我也想試試如何顯示'srcTree'中不在'srcTree2'中的元素。我之前嘗試過Linq的'where',但是不幸的是沒有任何運氣。如何通過使用Linq來比較兩個XDocument之間的元素?

我下面的代碼:

class LearnXML { 
    static void Main() { 
     XDocument srcTree = new XDocument(
      new XComment("This is a comment"), 
      new XElement("Root", 
       new XElement("Child", "data1"), 
       new XElement("Child", "data2"), 
       new XElement("Child", "data3"), 
       new XElement("Child", "data4"), 
       new XElement("Info", "info5"), 
       new XElement("Info", "info6"), 
       new XElement("Info", "info7"), 
       new XElement("Info", "info8") 
      ) 
     ); 

     XDocument srcTree2 = new XDocument(
      new XComment("This is a comment"), 
      new XElement("Root", 
       new XElement("Child", "data1"), 
       new XElement("Child", "data4"), 
       new XElement("Info", "info6"), 
       new XElement("Info", "info8") 
      ) 
     ); 

     Console.WriteLine(srcTree); 

     XDocument doc = new XDocument(
      new XComment("This is a comment"), 
      new XElement("Root", 
       from el in srcTree2.Element("Root").Elements() 
       join rp in srcTree.Element("Root").Elements() 
       on !el.Element("Child").Value equals rp.Element("Child").Value 
       select el 
      ) 
     ); 

     Console.WriteLine(doc); 
    } 
} 

回答

1

問題在你的代碼是在您嘗試連接兩個Roots平等,然後逆它。所以你的代碼甚至不能編譯。

您可以使用嵌套查詢檢索兩個Roots之間的差異。所以下面的代碼不僅檢索節點的所有差異節點,還檢索"Child"節點。

 XDocument doc = new XDocument(
      new XComment("This is a comment"), 
      new XElement("Root", 
       from left in srcTree.Element("Root").Elements() 
       where left != null && !(from right in srcTree2.Element("Root").Elements() 
             where right != null 
             select right.Value).Contains(left.Value) 
       select left) 
     ); 

如果你真的想要檢索的節點"Child"之間的區別只是名稱得到元素:

 XDocument doc = new XDocument(
      new XComment("This is a comment"), 
      new XElement("Root", 
       from left in srcTree.Element("Root").Elements("Child") 
       where left != null && !(from right in srcTree2.Element("Root").Elements("Child") 
             where right != null 
             select right.Value).Contains(left.Value) 
       select left) 
     ); 
+0

對不起,晚了迴應,它運行良好。謝謝。 <3 – sunflower

相關問題