2010-05-27 10 views

Odpowiedz

10

nr XmlDocument nie przesłonić zachowanie metody Equals() tak, to w rzeczywistości tylko wykonującego równości odniesienia - co będzie fail w przykładzie, chyba że dokumenty są rzeczywiście takie same instancji obiektu.

Jeśli chcesz porównać zawartość (atrybuty, elementy, commity, PI, itp.) Dokumentu, musisz sam wdrożyć tę logikę.Ostrzegam: to nie jest trywialne.

W zależności od konkretnego scenariusza, możesz usunąć wszystkie nieistotne spacje z dokumentu (co może być trudne) i porównać wynikowy tekst xml. Nie jest to doskonałe - kończy się niepowodzeniem w przypadku dokumentów, które są semantycznie identyczne, ale różnią się takimi rzeczami jak użycie i zadeklarowanie przestrzeni nazw, czy też niektóre wartości są unikane, kolejność elementów itd. Jak już mówiłem, porównanie XML nie jest banalne.

Należy również jasno określić, co oznacza, że ​​dwa dokumenty XML są "identyczne". Czy zamawianie elementów lub atrybutów ma znaczenie? Czy przypadek (w węzłach tekstowych) ma znaczenie? Czy należy ignorować zbędne sekcje CDATA? Czy liczą się instrukcje przetwarzania? A co z pełnymi kwalifikacjami a częściowo kwalifikowanymi przestrzeniami nazw?

W dowolnej implementacji ogólnego przeznaczenia prawdopodobnie będziesz chciał przekształcić oba dokumenty w pewną formę kanoniczną (np. XML lub inną reprezentację), a następnie porównać kanonizowaną treść.

Narzędzia już istnieją, które wykonują XML różnicowych, jak Microsoft XML Diff/Patch, Możesz być w stanie wykorzystać to w celu identyfikacji różnic pomiędzy dwoma dokumentami. Według mojej wiedzy to narzędzie nie jest rozprowadzane w formie źródłowej ... więc aby użyć go w aplikacji wbudowanej, musisz napisać skrypt (jeśli planujesz go użyć, najpierw sprawdź, czy warunki licencji pozwalają na jego użycie i redystrybucję).

EDIT:Wyjazd @Max Toro's answer jeśli używasz .NET 3.5 SP1, a najwyraźniej nie ma opcji w XLinq, które mogą być pomocne. Miło wiedzieć, że istnieje.

0

LBuszkin ma rację, to nie jest banalne. Ponieważ XML jest ciągiem danych, możesz technicznie wykonać mieszanie zawartości i porównać je, ale na to wpłyną takie rzeczy jak białe spacje.

Można wykonać różnicę strukturalną (zwaną również "diffgramem XML") między dwoma dokumentami i porównać wyniki. W ten sposób na przykład pliki .NET śledzą zmiany.

Poza tym trzeba będzie powtórzyć model DOM i porównać elementy, atrybuty i wartości ze sobą. Jeśli istnieje schemat, należy wziąć pod uwagę pozycje i tak dalej.

31

Wypróbuj metodę DeepEquals w interfejsie XLinq API.

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

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

} 

Zobacz również Equality Semantics of LINQ to XML Trees

+0

Nie wiedziałem o tym, dziękuję. –

+0

Bardzo ładne. Nie wiedziałem, że to istnieje. Wygląda na to, że obsługuje wiele przypadków, które opisuję. – LBushkin

+0

Nice - oznacza to, że nie musiałem importować biblioteki innej firmy, aby to dla mnie zrobić! –

8

Prostym sposobem mogłoby być porównanie 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);