2012-02-29 153 views
0

是否可以比較2個XML文件並僅用增量生成XML?比較2個XML文件

例如,這是我的XML:

<?xml version="1.0" encoding="utf-8"?> 
<Events> 
<Event id="1" date="2012-02-29"> 
<Event id="2" date="2012-02-29"> 
<Event id="3" date="2012-02-29"> 
<Event id="4" date="2012-02-29"> 
<Event id="5" date="2012-02-29"> 
</Events> 

而這個XML:

<?xml version="1.0" encoding="utf-8"?> 
<Events> 
<Event id="1" date="2012-02-29"> 
<Event id="2" date="2012-02-29"> 
<Event id="3" date="2012-02-29"> 
<Event id="4" date="2012-02-29"> 
<Event id="5" date="2012-03-01"> 
<Event id="6" date="2012-03-01"> 
<Event id="7" date="2012-03-07"> 
</Events> 

所以我會得到終究會:

<?xml version="1.0" encoding="utf-8"?> 
<Events> 
<Event id="5" date="2012-03-01"> 
<Event id="6" date="2012-03-01"> 
<Event id="7" date="2012-03-07"> 
</Events> 

因爲: 事件ID 5改變了它的日期,6和7是新的。

任何想法如何處理C#?

+1

它絕對可以做到。你試過什麼了? – 2012-02-29 19:56:44

+0

其實沒有什麼,真的不知道如何訪問這樣的事情,我相信有人已經這樣做過.. – 2012-02-29 19:59:54

+0

我會看着XmlReader,並可能讀入這兩個文件這種方式到一些其他的數據結構,並通過檢查差異,最後使用XmlWriter輸出結果。 – user17753 2012-02-29 19:59:59

回答

1

這個特殊的例子是很容易得到的差異進行。如果真正的XML文件是這樣的事情,你可以儘量去適應這個代碼:

var doc1 = XDocument.Load(infile1); 
var doc2 = XDocument.Load(infile2); 
var dict = doc1.Root.Elements("Event").ToDictionary(el => 
    el.Attribute("id").Value); 
doc2.Root.Elements("Event").ToList().ForEach(el => { 
    XElement el2; 
    if (dict.TryGetValue(el.Attribute("id").Value, out el2) && 
     !el.Attributes().Select(a => new { a.Name, a.Value }).Except(
     el2.Attributes().Select(a => new { a.Name, a.Value })).Any()) 
      el.Remove(); 
}); 
doc2.Save(outfile); 
3

你可能要檢查出的xmldiff補丁和GUI工具。它可以讓你比較2個XML文件 - http://msdn.microsoft.com/en-us/library/aa302295.aspx

有在本頁面頂部的下載鏈接爲一個可執行文件 - http://msdn.microsoft.com/en-us/library/aa302294.aspx

+0

有沒有我可以使用的任何DLL?我無法找到下載頁面...你能幫忙嗎?你使用這個工具嗎? – 2012-02-29 20:21:44

+0

我編譯了它,並在https://bitbucket.org/opticyclic/xmldiffpatchgui/overview上提供了一個安裝程序 – opticyclic 2013-06-18 14:19:29

1

如果創建一個DOM樹了兩個XML文件,你可以穿越兩棵樹,以確保它們的等價。我相信C#中有一個DOM庫,可以讓你做到這一點。

或者,遞歸遍歷它在XSLT並使用XSLT庫在C#到應用變換,並輸出隨後的XML差異。