W systemie Linux, jak mogę wygenerować różnicę między dwoma plikami XML?
Idealnie chciałbym być w stanie skonfigurować to do pewnych ścisłych rzeczy, lub poluzować niektóre rzeczy, takie jak białe znaki lub kolejność atrybutów.
Często dbam o to, że pliki są funkcjonalnie takie same, ale same w sobie różnią się, byłoby denerwujące w użyciu, szczególnie jeśli plik XML nie ma wielu podziałów liniowych.
Na przykład, naprawdę powinno być dla mnie w porządku:
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
vimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
Odpowiedź Jukki nie działała dla mnie, ale wskazywała na Canonical XML. Ani --c14n ani --c14n11 klasyfikowane atrybuty, ale zrobiłem znaleźć --exc-c14n przełącznik zrobił porządek atrybutów. --exc-c14n nie jest wymieniony na stronie podręcznika, ale jest opisany w wierszu poleceń jako „wyłączny format kanoniczny W3C”.
Ostrzeżenie --exc-c14n usuwa nagłówek xml, podczas gdy --c14n poprzedza nagłówek xml, jeśli go nie ma.
źródło
Próbowałem użyć odpowiedzi @Jukka Matilainen, ale miałem problemy z białą spacją (jeden z plików był ogromną jednostronną linią). Używanie
--format
pomaga pominąć różnice białych znaków.Uwaga: Użyj
vimdiff
polecenia do porównania plików XML.źródło
two.xml
został wygenerowanyone.xml
przez skrypt. Musiałem więc tylko sprawdzić, co zostało dodane / usunięte przez skrypt.--format
z--exc-c14n
; prawdopodobnie będzie jeszcze wolniej przetwarzać :(--exc-c14n
Opcja określa sortowania atrybutów. W twoich konkretnych plikach atrybuty prawdopodobnie były już posortowane, ale ogólna rada byłaby taka kombinacja--format --exc-c14n
.Diffxml poprawnie dostosowuje podstawową funkcjonalność, choć wydaje się, że nie oferuje wielu opcji konfiguracji.
Edycja: Project Diffxml jest migrowany do GitHub od 2013 roku.
źródło
Jeśli chcesz również zignorować kolejność elementów potomnych, napisałem do tego proste narzędzie pythonowe o nazwie
xmldiffs
:Pobierz na https://github.com/joh/xmldiffs
źródło
Mój skrypt xdiff.py w Pythonie do porównywania plików XML ignoruje różnice w spacji i kolejności atrybutów (w przeciwieństwie do kolejności elementów).
W celu porównania dwóch plików
1.xml
i2.xml
, by uruchomić skrypt w następujący sposób:W przykładzie PO nie wyprowadziłby nic i zwrócił status wyjścia
0
(bez różnic strukturalnych lub tekstowych).W przypadkach, gdzie
1.xml
i2.xml
różnią się strukturalnie, to naśladuje jednolitą wyjście GNU diff i zwraca kod zakończenia1
. Istnieją różne opcje sterowania wyjściem, takie jak-a
wyprowadzanie całego kontekstu,-n
wyprowadzanie bez kontekstu i-q
całkowite tłumienie wyjścia (przy jednoczesnym zwracaniu statusu wyjścia).źródło
Używam Beyond Compare do porównywania wszystkich typów plików tekstowych. Tworzą wersje dla systemu Windows i Linux.
źródło
Nasz SD Smart Differencer porównuje dokumenty na podstawie struktury, a nie faktycznego układu.
Jest XML Smart Differencer. W przypadku XML oznacza to dopasowanie kolejności znaczników i treści. Należy zauważyć, że ciąg tekstowy we wskazanym fragmencie był inny. Obecnie nie rozumie pojęcia XML atrybutów znacznika wskazującego, czy białe znaki są znormalizowane czy znaczące.
źródło
Nie jestem pewien, czy (zależność) narzędzia online liczy się jako rozwiązanie, ale, o ile jest ono warte, uzyskałem dobry wynik w tym internetowym narzędziu porównywania XML . To po prostu działa.
źródło