Utilitário para LOGICALLY comparar dois arquivos xml?

7

Neste momento, estamos tentando construir configurações de ouro para o nosso ambiente. Um software que usamos depende de grandes arquivos XML para conter a maior parte de sua configuração. Queremos levar nosso ambiente de laboratório, catalogá-lo como nossa "configuração de ouro" e depois poder auditar essa configuração no futuro.

Como diff é uma comparação no sentido anti-horário e NÃO é uma comparação lógica, não podemos usá-lo para comparar arquivos neste caso ( XML não é ordenado, então não funcionará). O que estou procurando é algo que pode analisar os dois arquivos XML e compará-los elemento por elemento. Até agora, ainda não encontramos nenhum utilitário que possa fazer isso. O SO não importa, eu posso fazer em qualquer coisa que funcione. A preferência é algo da prateleira.

Alguma idéia?

Edit: Um problema que encontramos é que os arquivos de configuração de um fornecedor ocasionalmente mencionam o mesmo elemento várias vezes, cada vez com atributos diferentes. Seja qual for a utilidade de diferenças que usamos, seria necessário identificar o conjunto de atributos ou identificá-los como parte de um elemento. Pedido alto:)

    
por Matthew 21.09.2012 / 16:53

5 respostas

4

Duas abordagens que uso são (a) canonizar os arquivos XML e, em seguida, comparar suas serializações e (b) usar a função deep-equal () do XPath 2.0. Ambas as abordagens são aceitáveis para dizer se os arquivos são os mesmos, mas não são muito bons em dizer onde eles diferem.

Uma ferramenta comercial especializada neste problema é o DeltaXML.

Se você tem coisas que considera equivalentes, mas que não são equivalentes no nível XML - por exemplo, elementos em uma ordem diferente -, talvez seja necessário estar preparado para fazer uma transformação para normalizar os documentos antes da comparação.

    
por 21.09.2012 / 19:13
1

Boa resposta aqui:

Question: How can I diff two XML files? | Super User

Answer: How can I diff two XML files? | Super User

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

Desculpas por qualquer falha em aderir às convenções de falha do servidor ... Tenho certeza de que alguém me avisará e eu irei corrigi-lo adequadamente.

    
por 27.01.2016 / 00:02
1

Com base em Python xmldiff parece uma solução muito atraente; ele afirma "extrair diferenças entre dois arquivos xml e retornar um conjunto de primitivos para aplicar na árvore de código-fonte para obter a árvore de destino".

Exemplo:

a1.xml

<root>
</root>

a2.xml

<root attr="test1">
</root>

xmldiff a1.xml a2.xml :

[append-first, /,
<root attr="test1"/>
]
[remove, /root[2]]
    
por 13.10.2012 / 00:27
1

Eu escrevi uma ferramenta python simples para isso chamada xmldiffs :

Compare two XML files, ignoring element and attribute order.

Usage: xmldiffs [OPTION] FILE1 FILE2

Any extra options are passed to the diff command.

Obtenha o link

    
por 23.03.2017 / 01:00
0

Existem comerciais e livre ferramentas que são" XML aware "e farão o que você precisa sem muita complicação. Também há aparentemente um plugineclipse que comparará o XML.

Como alternativa, você pode realizar pedidos dos campos por meio de xsl: sort ou especificando uma ordem de sequência no seu XSD (o que tornaria todos os documentos existentes inválidos por definição.) Em seguida, "normalize" os dois documentos antes de comparar com uma ferramenta de comparação não xml. A normalização primeiro remove todas as diferenças de formatação que não afetam o conteúdo real do XML. (Pense nisso como aplicar um filtro de estilo de código XML.)

    
por 21.09.2012 / 17:51

Tags