No Linux, como eu poderia gerar uma diferença entre dois arquivos XML?
Idealmente, eu gostaria de poder configurá-lo para algumas coisas estritas ou afrouxar algumas coisas, como espaço em branco ou ordem de atributos.
Eu sempre me importarei que os arquivos sejam funcionalmente iguais, mas o diff por si só seria irritante de usar, principalmente se o arquivo XML não tiver muitas quebras de linha.
Por exemplo, o seguinte realmente deve ser bom para mim:
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
vimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
A resposta de Jukka não funcionou para mim, mas apontou para XML canônico. Nem --c14n nem --c14n11 classificaram os atributos, mas eu achei a opção --exc-c14n classificando os atributos. --exc-c14n não está listado na página de manual, mas é descrito na linha de comandos como "formato canônico exclusivo do W3C".
Aviso --exc-c14n retira o cabeçalho xml, enquanto o --c14n precede o cabeçalho xml, se não estiver lá.
fonte
Tentou usar a resposta de @Jukka Matilainen, mas teve problemas com espaço em branco (um dos arquivos era um grande número de linhas). O uso de
--format
ajuda para ignorar as diferenças de espaço em branco.Nota: Use o
vimdiff
comando para comparar lado a lado os xmls.fonte
two.xml
foi gerado a partirone.xml
de um script. Então, eu só precisava verificar o que foi adicionado / removido pelo script.--format
com--exc-c14n
; provavelmente ainda será mais lento para processar :(--exc-c14n
opção especifica a classificação dos atributos. Nos seus arquivos específicos, os atributos provavelmente já foram classificados, mas o conselho geral seria usar a combinação--format --exc-c14n
.O Diffxml corrige a funcionalidade básica, embora não pareça oferecer muitas opções de configuração.
Editar: o projeto Diffxml foi migrado para o GitHub desde 2013.
fonte
Se você também deseja ignorar a ordem dos elementos filhos, escrevi uma ferramenta python simples para isso chamada
xmldiffs
:Obtê-lo em https://github.com/joh/xmldiffs
fonte
Meu script Python xdiff.py para comparar arquivos XML ignora diferenças no espaço em branco ou na ordem dos atributos (em contraste com a ordem dos elementos).
Para comparar dois arquivos
1.xml
e2.xml
, execute o script da seguinte maneira:No exemplo do OP, ele não produziria nada e retornaria o status de saída
0
(sem diferenças estruturais ou textuais).Nos casos em que
1.xml
e2.xml
diferem estruturalmente, ele imita a saída unificada do diff GNU e retorna o status de saída1
. Existem várias opções para controlar a saída, como-a
a saída de todo o contexto,-n
a saída de nenhum contexto e-q
a supressão total da saída (enquanto ainda retorna o status de saída).fonte
Eu uso o Beyond Compare para comparar todos os tipos de arquivos baseados em texto. Eles produzem versões para Windows e Linux.
fonte
Nosso SD Smart Differencer compara documentos com base na estrutura e não no layout real.
Existe um XML Smart Differencer. Para XML, isso significa ordem de correspondência de tags e conteúdo. Observe que a sequência de texto no fragmento específico que você indicou era diferente. Atualmente, ele não entende a noção XML de atributos de marca, indicando se o espaço em branco é normalizado versus significativo.
fonte
Não tenho certeza se (a dependência de) uma ferramenta online conta como uma solução, mas, pelo que vale, obtive um bom resultado nessa ferramenta de comparação XML online . Simplesmente funciona.
fonte