XML-bestanden vergelijken

Ik heb twee XML-bestanden (XSD) die zijn gegenereerd door een tool.
De tool behoudt de volgorde van de elementen niet, dus hoewel de inhoud gelijk is, zal het als resultaat worden vergeleken met tekst omdat de bestanden anders zijn.
Is er een tool die de elementen kan sorteren voordat ze worden vergeleken en waarmee tekstvergelijking van de documenten mogelijk is?
Natuurlijk moet het sorteren recursief gebeuren.

Gegevensvoorbeeld:
Bestand A:

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

Bestand B:

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

Antwoord 1, autoriteit 100%

Ik had een soortgelijk probleem en vond uiteindelijk: http://superuser .com/questions/79920/how-can-i-diff-two-xml-files

Dat bericht stelt voor om een canonieke XML-sortering te doen en vervolgens een diff. Het volgende zou voor u moeten werken als u Linux, Mac gebruikt of als u Windows hebt waarop iets als Cygwin is geïnstalleerd:

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

Antwoord 2, autoriteit 13%

Bekijk XSLT gebruiken om regressietesten te ondersteunendie een oplossing beschrijven met xslt


Antwoord 3, autoriteit 7%

Voor wat het waard is, ik heb een java-tool (of eigenlijk kotlin) gemaakt voor een efficiënte en configureerbare canonicalisering van xml-bestanden.

Het zal altijd:

  • Sorteer knooppunten en attributen op naam.
  • Verwijder naamruimten (ja – het zou – hypothetisch – een probleem kunnen zijn).
  • Druk het resultaat mooi af.

Bovendien kun je het vertellen aan:

  • Verwijder een gegeven lijst met knooppuntnamen – misschien wil je niet weten dat de waarde van een stuk metadata – zeg <RequestReceivedTimestamp>is veranderd.
  • Sorteer een bepaalde lijst met collecties in de context van de bovenliggende – misschien maakt het u niet uit dat de volgorde van <Contact>-items in <ListOfFavourites>gewijzigd.

Het gebruikt XSLT en doet al het bovenstaande efficiënt met behulp van chaining.

Beperkingen

Het ondersteunt het sorteren van geneste lijsten – het sorteren van binnenste lijsten voor buitenste. Maar het kan willekeurige niveaus van recursief geneste lijsten niet betrouwbaar sorteren.

Als je dergelijke behoeften hebt, kun je – nadat je deze tool hebt gebruikt – de gesorteerde bytearrays van de resultaten vergelijken. ze zullen gelijk zijn als er alleen nog problemen met het sorteren van de lijst overblijven.

Waar te verkrijgen

Je kunt het hier krijgen: XMLNormalize


Antwoord 4

De XML-voorbeelden zijn fundamenteel anders. Hoewel de inhoud en de hiërarchie identiek kunnen zijn, zijn de relaties tussen peers verschillend. Wanneer XML wordt geparseerd, wordt het geparseerd in een structuur die een DOM wordt genoemd, waarbij relaties tussen eenheden erg belangrijk zijn. Als u de aard van relaties tussen peer-entiteiten buiten beschouwing wilt laten, heeft u waarschijnlijk aangepaste software nodig. Ik raad aan om een eenvoudige open-source XML-bewuste diff-tool te vinden en de aanvullende vereisten toe te voegen die je nodig hebt. Ik heb er een geschreven op http://prettydiff.com/maar ik raad je aan rond te kijken om te zien wat er beschikbaar is voordat je een beslissing, omdat het bewerken van de algoritmen van iemand anders wat zwaar werk kan vergen.


Antwoord 5

U kunt de perl-module DifferenceMarkup http://metacpan.org/pod/XML:: gebruiken DifferenceMarkupof de xmldiff pecl.php.net/xmldiff extensie in PHP. Beide zullen een voor mensen leesbaar XML diff-document produceren.

Other episodes