2012-09-05 72 views
1

我從兩個不同的文件中加載兩個XElement。一個是默認文件,另一個是活動XML。基本上我需要知道如何比較兩個XElements,並獲取活動文件中所有元素的集合,而不是默認文件中。從一個XElement中獲取不在另一個XElement中的元素

我不在乎檢查值我只關心活動文件中是否存在不在默認文件中的元素。

基本上我比較兩個Web.config文件,當用戶升級我們的產品時,我需要檢查他們的web.config以找到他們添加的不在我們的模板中的任何元素,並將它們添加到我們的模板之前我把它放下並覆蓋他們。

+1

對於每個元素,你需要完整的內容比較,或者是有什麼樣的ID字段你可以用? (示例XML將使這個問題更容易回答。) –

+0

不,沒有ID字段它是兩個IIS web.config文件,我只需要找到客戶端可能添加到他們的web.config中的元素,我們不需要隨我們的產品一起發貨 – twreid

回答

2

試試這個:

var addedNames = new HashSet<string>(
    liveXml.Elements().Select(e => e.Name).Except(
     defXml.Elements().Select(e => e.Name) 
    ) 
); 
var addedElements = liveXml 
    .Elements() 
    .Where(e => addedNames.Contains(e.Name)) 
    .ToList(); 

這種方法構造liveXml的名單「不存在於defXml S元素的名稱,把它們放在一組,然後使用該設置過濾liveXml的元素。

對於移除的元件,反向操作數將傳遞給Except順序,並過濾defXml

var droppedNames = new HashSet<string>(
    defXml.Elements().Select(e => e.Name).Except(
     liveXml.Elements().Select(e => e.Name) 
    ) 
); 
var droppedElements = defXml 
    .Elements() 
    .Where(e => addedNames.Contains(e.Name)) 
    .ToList(); 
+0

非常感謝你的工作。我現在需要做的就是得到這個搜索每個元素的子元素,這將是完美的。再次感謝。 – twreid

相關問題