2010-05-27 25 views

Trả lời

10

số XmlDocument không ghi đè lên hành vi của các phương pháp Equals() vậy, nó là trong thực tế chỉ thực hiện bình đẳng tham khảo - đó sẽ thất bại trong ví dụ của bạn, trừ trường hợp các văn bản thực sự là trường hợp đối tượng tương tự.

Nếu bạn muốn so sánh nội dung (thuộc tính, phần tử, commments, PI, vv) của tài liệu, bạn sẽ phải tự mình thực hiện logic đó.Được cảnh báo: nó không tầm thường.

Tùy thuộc vào kịch bản chính xác của bạn, bạn có thể xóa tất cả khoảng trống không cần thiết khỏi tài liệu (bản thân nó có thể phức tạp) và so sánh văn bản xml kết quả. Điều này không hoàn hảo - nó không thành công cho các tài liệu giống hệt nhau về mặt ngữ nghĩa, nhưng khác với những thứ như cách không gian tên được sử dụng và khai báo, hoặc liệu các giá trị nhất định có được thoát hay không, thứ tự các phần tử, v.v. Như tôi đã nói trước đây, so sánh XML không phải là tầm thường.

Bạn cũng cần xác định rõ ý nghĩa của hai tài liệu XML là "giống hệt nhau". Yếu tố đặt hàng hoặc thuộc tính có yếu tố không? Trường hợp (trong các nút văn bản) có quan trọng không? Bạn có nên bỏ qua các phần CDATA thừa không? Hướng dẫn xử lý có được tính không? Điều gì về các không gian tên đủ điều kiện và đủ điều kiện một phần?

Trong bất kỳ mục đích chung nào, bạn có thể muốn chuyển đổi cả hai tài liệu thành một dạng chuẩn (có thể là XML hoặc một số biểu diễn khác) và sau đó so sánh nội dung chuẩn hóa.

Công cụ đã tồn tại thực hiện phân biệt XML, như Microsoft XML Diff/Patch, bạn có thể tận dụng để xác định sự khác biệt giữa hai tài liệu. Theo hiểu biết của tôi rằng công cụ không được phân phối dưới dạng nguồn ... để sử dụng nó trong ứng dụng nhúng, bạn cần phải viết kịch bản quy trình (nếu bạn định sử dụng nó, trước tiên bạn phải xác minh rằng các điều khoản cấp phép cho phép sử dụng và phân phối lại).

EDIT:Check-out @Max Toro's answer nếu bạn đang sử dụng NET 3.5 SP1, như dường như có một tùy chọn trong XLinq có thể hữu ích. Rất vui được biết nó tồn tại.

0

LBushkin đúng, điều này không quan trọng. Vì XML là dữ liệu chuỗi, bạn có thể thực hiện kỹ thuật một hàm băm của nội dung và so sánh chúng, nhưng điều đó sẽ bị ảnh hưởng bởi những thứ như khoảng trắng.

Bạn có thể thực hiện một khác biệt có cấu trúc (còn được gọi là 'XML diffgram') giữa hai tài liệu và so sánh kết quả. Đây là cách các bộ dữ liệu .NET theo dõi các thay đổi, ví dụ.

Ngoài việc bạn phải lặp qua DOM và so sánh các phần tử, thuộc tính và giá trị với nhau. Nếu có một lược đồ có liên quan thì bạn cũng sẽ phải tính đến các vị trí tài khoản và vân vân.

31

Thử phương thức DeepEquals trên API XLinq.

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

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

} 

Xem thêm Equality Semantics of LINQ to XML Trees

+0

Không biết về điều đó, cảm ơn bạn. –

+0

Rất đẹp. Tôi không biết điều này tồn tại. Dường như nó xử lý nhiều trường hợp mà tôi mô tả. – LBushkin

+0

Đẹp - điều này có nghĩa là tôi không cần phải nhập thư viện của bên thứ ba để thực hiện việc này cho tôi! –

8

Một cách đơn giản có thể là để so sánh 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); 
Các vấn đề liên quan