2013-10-26 132 views
-2

我有喜歡的LINQ to XML選擇

DOC1

<Item id="22"/> 
<Item id="33"/> 
<Item id="44"/> 
... 

DOC2一些元素兩個XML文檔

<Item id="33"/> 
<Item id="44"/> 
<Item id="66"/> 
<Item id="88"/> 
... 

我需要一個查詢來選擇 只能從doc1的是這些元素在doc2中缺少其他doc2元素。

在這種情況下,結果將是:

<Item id="22"/> 

我該怎麼辦呢?

回答

0

基本上,創建與從第二列表中的所有ID的列表,並檢查DOC1的每個項目,如果它是在列表中。 性能方面,我認爲它不是最好的選擇 - 但它應該工作

 var qry = from item in doc1.Descendants("Item") 
        where 
        !(from item2 in doc2.Descendants("Item") 
        select item2.Attribute("id"),Value 
        ).ToList().Contains(item.Attribute("id").Value) 
        select item; 

在上面的LINQ語句,我認爲在DOC1每個元素創建ID列表。更好的選擇是先創建列表,然後使用列表中的下一個語句:

 List<string> items = (from item2 in doc2.Descendants("Item") 
           select item2.Attribute("id").Value 
          ).ToList(); 

     var qry = from item in doc1.Descendants("Item") 
        where !items.Contains(item.Attribute("id").Value) 
        select item; 
0

可能是一些沿

doc1.Where(i1=>doc2.All(i2 => i2.id != i1.id)) 

線可以讓你那裏。

但是,這是對doc1中的每個元素在doc2上執行子查詢。確保它們很小!

+0

是啊,他們是相當大... – ereyes

+0

他們是否排序? – Sklivvz

0

最簡單的方法是使用MoreLinq庫中的ExceptedBy方法。假設Item元件直接在根元素下:

var doc1 = XDocument.Load("doc1.xml"); 
var doc2 = XDocument.Load("doc2.xml"); 

var doc1Elements = doc1.Root.Elements("Item"); 
var doc2Elements = doc2.Root.Elements("Item"); 

var diff = doc1Elements.ExceptBy(doc2Elements, e => e.Attribute("id").Value);