2010-05-27 19 views
12

如果我想比較一個XMlDocument的內容,是不是像這樣?比較XmlDocument是否相等(內容明智)

XmlDocument doc1 = GetDoc1(); 
XmlDocument doc2 = GetDoc2(); 

if(doc1 == doc2) 
{ 

} 

我不檢查它們是否都是相同的對象引用,但是如果xml的CONTENTS是相同的。

回答

10

號的XmlDocument不會覆蓋Equals()方法所以,它實際上只是執行基準平等的行爲 - 這會在你的榜樣失敗,除非該文件實際上是同一個對象實例。

如果您想比較文檔的內容(屬性,元素,評論,PI等),您必須自己實現該邏輯。被警告:這不是微不足道的。

根據您的具體情況,您可能能夠從文檔中刪除所有非本質的空白(本身可能會非常棘手),並且它們會比較生成的xml文本。這並不完美 - 文檔在語義上是相同的,但在命名空間的使用和聲明方式,某些值是否被轉義,元素順序等方面存在差異。正如我之前所說的,XML比較不是微不足道的。

您還需要明確定義兩個XML文檔「相同」的含義。元素或屬性排序是否重要?大小寫(文本節點中)是否重要?你應該忽略多餘的CDATA部分?處理指令是否計數?完全合格與部分合格的命名空間有什麼區別?

在任何通用目的實現中,您可能希望將這兩個文檔轉換爲一些規範形式(無論是XML還是其他表示形式),然後比較規範化內容。

已存在執行XML差異化的工具,例如Microsoft XML Diff/Patch,您可以利用該工具來識別兩個文檔之間的差異。據我所知,該工具不是以源代碼的形式發佈的......所以要在嵌入式應用程序中使用它,您需要編寫該過程的腳本(如果您打算使用它,則應首先驗證許可條款是否允許其使用和再分發)。

編輯:退房@Max Toro's answer如果你使用.NET 3.5 SP1,因爲顯然有在XLINQ一個選項,可能會有所幫助。很高興知道它存在。

0

LBushkin是對的,這不是微不足道的。由於XML是字符串數據,因此您可以在技術上對內容執行散列並對其進行比較,但這會受到諸如空白之類的內容的影響。

您可以在兩個文檔之間執行結構化差異(也稱爲'XML diffgram')並比較結果。例如,這就是.NET數據集如何跟蹤更改。

除此之外,您必須遍歷DOM並將元素,屬性和值相互比較。如果涉及到一個模式,那麼你還必須考慮職位等。

31

嘗試XLinq API上的DeepEquals方法。

XDocument doc1 = GetDoc1(); 
XDocument doc2 = GetDoc2(); 

if(XNode.DeepEquals(doc1, doc2)) 
{ 

} 

參見Equality Semantics of LINQ to XML Trees

+0

不知道,謝謝。 – 2010-05-27 20:00:29

+0

非常好。我不知道這存在。它看起來像處理了我描述的許多案例。 – LBushkin 2010-05-27 20:03:25

+0

不錯 - 這意味着我不需要導入第三方庫來爲我做這個! – 2014-05-23 22:16:18

8

一個簡單的方法可能是比較OuterXml

var a = new XmlDocument(); 
var b = new XmlDocument(); 

a.LoadXml("<root foo='bar' />"); 
b.LoadXml("<root foo='bar'/>"); 

Debug.Assert(a.OuterXml == b.OuterXml);