Come posso diffondere due file XML?

In Linux, come potrei generare una differenza tra due file XML?

Idealmente, vorrei essere in grado di configurarlo ad alcune cose rigorose, o allentare alcune cose, come spazi bianchi o ordine degli attributi.

Mi preoccupa spesso che i file siano funzionalmente identici, ma differiscono di per sé, sarebbe fastidioso da usare, specialmente se il file XML non ha molti linebreaks.

Ad esempio, per quanto mi riguarda, dovresti essere giusto:

<tag att1="one" att2="two"> content </tag> <tag att2="two" att1="one"> content </tag> 

Un approccio sarebbe quello di prima trasformare entrambi i file XML in Canonical XML e confrontare i risultati utilizzando diff . Ad esempio, xmllint può essere utilizzato per canonicalizzare XML.

 $ xmllint --c14n one.xml > 1.xml $ xmllint --c14n two.xml > 2.xml $ diff 1.xml 2.xml 

Ha provato a usare la risposta di @Jukka Matilainen, ma ha avuto problemi con lo spazio bianco (uno dei file è stato un grande liner). L'utilizzo di --format aiuta a ignorare le differenze dello spazio bianco.

 xmllint --format one.xml > 1.xml xmllint --format two.xml > 2.xml diff 1.xml 2.xml 

Nota: utilizzare il command vimdiff per il confronto side-by-side dei xmls.

La risposta di Jukka non ha funzionato per me, ma ha fatto riferimento a Canonical XML. Né –c14n–c14n11 hanno ordinato gli attributi, ma ho trovato l'interruttore -exc-c14n ha ordinato gli attributi. –exc-c14n non è elencato nella pagina man, ma descritto nella row di command come "formato canonico esclusivo W3C".

 $ xmllint --exc-c14n one.xml > 1.xml $ xmllint --exc-c14n two.xml > 2.xml $ diff 1.xml 2.xml $ xmllint | grep c14 --c14n : save in W3C canonical format v1.0 (with comments) --c14n11 : save in W3C canonical format v1.1 (with comments) --exc-c14n : save in W3C exclusive canonical format (with comments) $ rpm -qf /usr/bin/xmllint libxml2-2.7.6-14.el6.x86_64 libxml2-2.7.6-14.el6.i686 $ cat /etc/system-release CentOS release 6.5 (Final) 

Attenzione –exc-c14n estrae l'intestazione xml mentre il -c14n prependisce l'intestazione xml se non lì.

Diffxml ottiene la funzionalità di base corretta, anche se non sembra offrire molte opzioni per la configuration.

Io uso Oltre Confronta per confrontare tutti i tipi di file basati su text. Producono versioni per Windows e Linux.

Se si desidera ignorare anche l'ordine degli elementi figlio, ho scritto un semplice strumento python per questo xmldiffs chiamato:

Confronta due file XML, ignorando l'elemento e l'ordine degli attributi.

Utilizzo: xmldiffs [OPTION] FILE1 FILE2

Tutte le opzioni aggiuntive vengono passate al command diff .

Ottenerlo all'indirizzo https://github.com/joh/xmldiffs

Il nostro SD Smart Differencer confronta i documenti basati sulla struttura rispetto al layout effettivo.

C'è un Smart Differencer XML. Per XML, questo significa l'ordine di corrispondenza dei tag e del contenuto. Deve notare che la string di text nel frammento specifico indicato era diversa. Attualmente non comprende la nozione XML degli attributi tag che indica se l'area bianca è normalizzata o significativa.

Non sono sicuro se (la dipendenza di) uno strumento online sia una soluzione, ma, per quello che vale la pena, ho trovato un buon risultato in questo strumento di confronto XML online . Funziona semplicemente.