Como comparar ficheiros XML

tenho dois ficheiros XML (XSD) que são gerados por alguma ferramenta.
A ferramenta não preserva a ordem dos elementos, portanto, embora o conteúdo seja igual comparando-o como texto irá resultar como os arquivos são diferentes.
Existe alguma ferramenta que possa ordenar os elementos antes de comparar e irá permitir a comparação de texto dos documentos? É claro que a ordenação precisa ser feita recursivamente.

Exemplo de dados:
Ficheiro A:

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

Ficheiro B:

<xml>
  <B/>
  <A/>
</xml>
 6
Author: Avner Levy, 2012-08-29

5 answers

Tive um problema semelhante e acabei por encontrar: http://superuser.com/questions/79920/how-can-i-diff-two-xml-files

Esse post sugere fazer um tipo canónico de xml e depois fazer um 'diff'. O seguinte deverá funcionar para si se estiver no linux, mac ou se tiver janelas com algo como o cygwin instalado:

$ xmllint --c14n FileA.xml > 1.xml
$ xmllint --c14n FileB.xml > 2.xml
$ diff 1.xml 2.xml
 7
Author: James Oravec, 2017-07-24 21:06:57

Você pode usar o módulo perl DifferenceMarkup http://metacpan.org/pod/XML::DifferenceMarkup ou o xmldiff pecl.php.net/xmldiff extensão em PHP. Ambos irão produzir um documento XML diff legível por humanos.

 0
Author: Maximilian, 2017-05-15 18:12:49

Para que conste, criei uma ferramenta java (ou kotlin na verdade) para uma canonicalização eficaz e configurável de ficheiros xml.

Será sempre:

  • Ordenar nós e atributos pelo nome.
  • remover espaços de nomes (sim - poderia - hipoteticamente - ser um problema).
  • Prettyprint o resultado.

Além disso, pode dizer-lhe para:

  • Remova uma dada lista de nomes de nós-talvez não queira saber que o valor de um pedaço de metadados-say <RequestReceivedTimestamp> mudou.
  • Ordenar uma dada lista de colecções no contexto do Pai - talvez não se importe que a ordem de <Contact> entradas em <ListOfFavourites> tenha mudado.

Ele usa XSLT e faz tudo o acima de forma eficiente usando encadeamento.

Limitações

Suporta a ordenação de listas aninhadas-ordenação de listas mais íntimas antes das exteriores. Mas não pode classificar de forma confiável níveis arbitrários de listas aninhadas recursivamente.

Se tiver estas necessidades, pode - depois de ter usado esta ferramenta - compare as matrizes de bytes ordenadas dos resultados. serão iguais se restarem apenas questões de classificação de listas.

Onde arranjá-lo

Você pode obtê-lo aqui: XMLNormalize

 0
Author: Jens Krogsboell, 2018-02-16 09:50:21

As amostras de XML são fundamentalmente diferentes. Mesmo que o conteúdo e a hierarquia possam ser idênticos, as relações entre pares são diferentes. Quando o XML é analisado ele é processado em uma estrutura chamada DOM onde as relações entre unidades são muito importantes. Se você quiser descartar a natureza das relações entre as Entidades de pares, então você provavelmente vai precisar de software personalizado. Eu recomendo encontrar alguma ferramenta de diff simples de código aberto XML ciente e adicionar o adicional requisitos que você precisa. Eu escrevi um em http://prettydiff.com mas eu sugiro que você olhe em volta para ver o que está disponível antes de tomar uma decisão, porque editar algoritmos de outra pessoa pode exigir um pouco de trabalho pesado.

 -1
Author: austincheney, 2012-08-29 22:32:06