2012-08-29 27 views
5

Ho due file XML (XSD) generati da alcuni strumenti.
Lo strumento non conserva l'ordine degli elementi, quindi, sebbene il contenuto sia uguale, il confronto con il testo risulterà come se i file fossero diversi.
C'è qualche strumento che può ordinare gli elementi prima del confronto e abiliterà il confronto testuale dei documenti? Ovviamente l'ordinamento deve essere fatto in modo ricorsivo. esempioCome confrontare i file XML

dati:
File A:

<xml> 
    <A/> 
    <B/> 
</xml> 

File B:

<xml> 
    <B/> 
    <A/> 
</xml> 

risposta

4

ho avuto un problema simile e alla fine ho trovato: http://superuser.com/questions/79920/how-can-i-diff-two-xml-files

quel post suggerisce di fare un Canonical XML sorta poi fare un diff. Il seguente dovrebbe funzionare per voi se siete su Linux, Mac, o se si dispone di Windows con qualcosa come Cygwin installato:

$ xmllint --c14n FileA.xml > 1.xml 
$ xmllint --c14n FileB.xml > 2.xml 
$ diff 1.xml 2.xml 
-1

I campioni XML sono fondamentalmente differenti. Anche se il contenuto e la gerarchia possono essere identici, le relazioni tra pari sono differenti. Quando viene analizzato XML, viene analizzato in una struttura denominata DOM in cui le relazioni tra le unità sono molto importanti. Se si desidera scartare la natura delle relazioni tra entità peer, è probabile che sia necessario un software personalizzato. Consiglio di trovare alcuni semplici strumenti open source basati su XML e di aggiungere i requisiti aggiuntivi necessari. Ne ho scritto uno a http://prettydiff.com/ ma ti suggerisco di guardarti intorno per vedere cosa è disponibile prima di prendere una decisione, perché modificare gli algoritmi di qualcun altro potrebbe richiedere un po 'di sollievo.

0

Per quello che vale, ho creato uno strumento di Java (o Kotlin in realtà) per effecient e canonicalizzazione configurabile di file xml.

sarà sempre:

  • nodi Ordinare e attributi per nome.
  • Rimuovere gli spazi dei nomi (sì - potrebbe - ipoteticamente - essere un problema).
  • Impronta il risultato.

Inoltre, si può dire a:

  • Rimuovere un determinato elenco di nomi nodo - forse non si vuole sapere che il valore di un pezzo di metadati - dicono <RequestReceivedTimestamp> è cambiato.
  • Ordina un determinato elenco di raccolte nel contesto del genitore - forse non ti interessa che l'ordine delle voci <Contact> in <ListOfFavourites> sia cambiato.

Utilizza XSLT e fa tutto quanto sopra in modo efficiente utilizzando il concatenamento.

Limitazioni

Esso supporta l'ordinamento liste annidate - ordinamento liste più intimi prima esterna. Ma non può ordinare in modo affidabile livelli arbitrari di liste annidate ricorsivamente.

Se si dispone di tali esigenze è possibile, dopo aver utilizzato questo strumento, confrontare le matrici di byte ordinate dei risultati. saranno uguali se restano solo i problemi di smistamento delle liste.

dove trovarlo

Si può ottenere qui: XMLNormalize