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>
5 answers
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
Dê uma vista de olhos em Usando o XSLT para ajudar nos testes de regressão {[3] } que descrevem uma solução usando o xslt
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.
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
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.