2010-01-06 49 views
5

什麼是C#的最好的方式得到一個集合對象代表改變兩者之間的XML文本,例如:如何獲取表示兩個XML文本之間差異的對象集合?

第一:

<Customer> 
    <Id>1</Id> 
    <FirstName>Angie</FirstName> 
    <LastName>Jones</LastName> 
    <ZipCode>23434</ZipCode> 
    <Contracts> 
    <Contract> 
     <Id>234</Id> 
     <Title>Test Contract 1</Title> 
    </Contract> 
    </Contracts> 
</Customer> 

二:

<Customer> 
    <Id>1</Id> 
    <FirstName>Angie</FirstName> 
    <MiddleName>S.</MiddleName> 
    <LastName>Jones-Smith</LastName> 
    <Contracts> 
    <Contract> 
     <Id>234</Id> 
     <Title>Test Contract 1</Title> 
    </Contract> 
    <Contract> 
     <Id>534</Id> 
     <Title>Test Contract 2</Title> 
    </Contract> 
    </Contracts> 
</Customer> 

的變化:

Kind:  Node:     Before  After 
-------- ----------    -------- ---------------- 
Change  Customer/LastName  Jones  Jones-Smith 
Addition Customer/MiddleName    S. 
Deletion Customer/ZipCode 
Addition Customer/Contracts[1]    <Contract> 
               <Id>534</Id> 
               <Title>Test Contract 2</Title> 
               </Contract> 

要點是然後傳遞變化對象的集合到GUI其可以適當地顯示它們。

什麼是最好的方法去做到這一點,即構建表示變化的類並且遍歷/檢查XML以便最準確地識別變化?

+0

還需要記住位置的變化 - 如果附加合同在索引[0]處,那麼這需要在[0]處被識別爲插入,還是在[0]處加上一個加法在[1]。 – 2010-01-06 16:22:35

回答

1

這似乎是一個重複的問題爲:Xml Comparison in C#

看一看那裏,看看是否有幫助。

報價:

我得在 XML和.NET Framework MSDN論壇an answer by Martin Honnen。 總之,他建議使用XQuery 1.0的深層平等功能並提供一些C#實現。似乎到 工作。

0

對於這種工作,我使用了由MSFT提供的XMLDiff patch。它會生成一個diffgram,然後您可以將其表示爲班級。

0

LINQ to XML有一個DeepEquals方法,我相信你可以在這種情況下使用。

那麼也許你可以使用名爲SAXON的XSLT/XQuery處理器來獲得差異。

+1

XNode.DeepEquals似乎返回一個布爾值,告訴我兩個XML文本是否相等。有沒有類似的東西給我一個差異的集合?就像「DeepCompare」一樣? – 2010-01-06 16:30:58

+0

@Edward答案更新爲包含對SAXON的引用 – 2010-01-06 16:43:33

相關問題