Perdi uma tarde uma vez num ficheiro de configuração que o & quot; changed" entre duas implementações O diff no meu terminal era uma parede de vermelho, centenas de linhas, e passei uma hora a caçar a mudança real antes de perceber que o pipeline de implantação tinha reformatado o ficheiro: reindented-lo, reordenou alguns atributos, rebrapped algumas linhas longasNem um byte com o qual um analisador se importaria tinha realmente mudado, exceto um único valor enterrado no ruído Um diff baseado em linha não poderia dizer-me isso, porque um diff baseado em linha não compreende XML Este guia é sobre comparar XML da forma que merece ser comparado, usando o Verificador de diferença XML em Toolz.dev, e por que uma comparação estrutural encontra a única mudança que importa em vez de afogá-la na formatação.
tl;dr: Um diff XML compara dois documentos como árvores de nós, não como linhas de texto, portanto, reindentar, reordenar atributos ou rebravar linhas não é registrado como uma alteração Ele relata quais elementos, atributos e valores de texto foram adicionados, removidos ou alterados, cada um fixado em um caminho de nó Verificador de diferença XML faz isso inteiramente no seu navegador, sem nada carregado.
O que é um verificador de diff XML?
Um verificador de diff XML compara dois documentos XML e relata o que mudou como um conjunto de diferenças estruturais: quais elementos apareceram ou desapareceram, quais atributos mudaram de valor e onde o conteúdo do texto difere Em vez de comparar os arquivos linha por linha, ele analisa ambos em árvores de nós e os compara como dados Você cola o original à esquerda, a nova versão à direita, e recebe de volta uma lista de diferenças, cada uma rotulada com o caminho exato na árvore onde aconteceu.
O ponto de uma comparação estrutural é que o XML carrega o mesmo significado em muitos layouts de bytes diferentes O Especificação W3C XML é explícito que alguns detalhes da superfície não afetam o documento analisado: a ordem dos atributos em um elemento não é significativa e o espaço em branco entre os elementos geralmente é apenas formatação. Dois arquivos podem ser estruturalmente idênticos, diferindo em recuo, ordem de atributos, terminações de linha ou se um elemento vazio é escrito como <tag></tag> ou <tag/>. Um diff de texto simples sinaliza tudo isso; um diff estrutural o ignora e mostra apenas o que um analisador realmente leria de maneira diferente.
No Toolz.dev o fluxo de trabalho é curto Cole ambos os documentos, escolha se deseja ignorar espaços em branco, atributos ou case e pressione Comparar A ferramenta analisa árvores e lista todas as diferenças por caminho, agrupadas em adicionado, removido e alterado, com os valores antigo e novo lado a lado.
Como um diff XML é diferente de um diff de texto?
Um diff de texto, do tipo incorporado no Git e na maioria dos editores, compara arquivos como sequências de linhas e encontra o conjunto mais curto de inserções e exclusões que transforma uma na outra Isso é exatamente certo para o código-fonte, onde as linhas são unidades significativas É o modelo errado para XML, onde o significado vive na árvore e as quebras de linha são decoração.
Os modos de falha são previsíveis Reindent o documento e um diff de texto marca quase todas as linhas alteradas Reordenar dois atributos em um elemento e sinaliza essa linha, mesmo que o elemento seja idêntico a um analisador Adicionar uma única criança perto do topo e cada linha abaixo dela muda, então o diff mostra uma cascata de movimentos que não são realmente mudanças Você acaba digitalizando centenas de linhas sinalizadas para encontrar o que importa, que é a tarde que descrevi acima.
Um diff estrutural contorna tudo isso analisando primeiro Ele constrói uma árvore de cada documento, depois caminha as duas árvores juntas comparando nós Diferenças de formatação simplesmente não existem no nível da árvore, então elas não podem aparecer na saída O que resta é o conjunto de mudanças que alterariam como o software que consome o XML se comporta, que é quase sempre o conjunto com o qual você realmente se importa Se seus dados são JSON em vez de XML, o mesmo princípio se aplica e o json diff a ferramenta faz a comparação estrutural equivalente lá.
Como é que decide o que mudou?
A comparação acontece em três camadas em cada elemento, e separá-las é o que torna a saída legível.
Os atributos são comparados pelo nome, independente da ordem em que aparecem na tag, porque a ordem dos atributos não é significativa em XML Para cada elemento a ferramenta verifica quais atributos existem em ambos os lados, e relata um atributo como alterado quando seu valor difere, adicionado quando aparece apenas à direita, ou removido quando aparece apenas à reordenação <a x="1" y="2"/> até <a y="2" x="1"/> não produz nenhuma diferença.
O conteúdo de texto é comparado como o texto direto de cada elemento Com o tratamento de espaços em branco ligado, as execuções de espaços e novas linhas são colapsadas e os espaços em branco iniciais e finais são cortados, portanto, a impressão bonita do documento não cria alterações de texto fantasma. Apenas uma alteração genuína nas palavras entre as tags é relatada.
Elementos filhos são a parte interessante Elementos que compartilham um nome de tag são emparelhados por sua ordem de aparência: o primeiro <item> à esquerda é comparado ao primeiro <item> à direita, o segundo para o segundo, e assim por diante Quando um lado tem mais ocorrências do que o outro, os extras são relatados como adicionados ou removidos em vez de forçar um desalinhamento Esta regra de ordenação é o que mantém uma pequena mudança em um elemento repetido de cascata em um diff de cada irmão.
Veja como os dois modelos de comparação se acumulam:
| Aspecto | Diferença de texto | Diferença XML (estrutural) |
|---|---|---|
| Unidade comparada | Linhas de texto | Nós em uma árvore |
| Reindentação | Mostra como alterações | Ignorado |
| Reordenação atributos | Mostra como uma mudança | Ignorado |
| Relatórios mudam de local | Número da linha | Caminho do nó, por exemplo,/catálogo/livro[2]/@id |
| Distingue elemento vs atributo vs texto | não | sim |
| melhor para | Código fonte, prosa | Configuração XML, cargas úteis API, SVG, sitemaps |
Um exemplo concreto deixa claro a estratificação Pegue um pequeno catálogo de livros onde, entre duas versões, um livro' s atributo de categoria muda de ficção para mistério, esse mesmo livro' s texto de preço muda de 12,99 para 14,99, e o segundo livro ganha um novo elemento isbn Um diff de linha sinalizaria todos os três mais qualquer reindentação em torno deles, confuso O diff estrutural relata exatamente três diferenças: um atributo alterado no caminho da categoria, um nó de texto alterado no caminho de preço e um elemento adicionado no caminho isbn Cada um é marcado com seu tipo, para que você possa dizer de relance que dois foram edições em dados existentes e um foi uma adição genuína Essa separação é a diferença entre ler um relatório e decodificar um.
A ferramenta também agrupa os resultados em guias adicionadas, removidas e alteradas com uma contagem contínua, para que você possa responder primeiro a perguntas grosseiras, como & quot; qualquer coisa foi excluída, & quot; antes de perfurar as especificidades. Em um documento grande, essa ordem é importante: as remoções geralmente são a alteração mais perigosa, porque um elemento descartado pode remover silenciosamente um campo obrigatório e ser capaz de isolá-los sem percorrer edições não relacionadas economiza tempo real.
O que significa o caminho do nó em uma diferença?
Cada diferença é rotulada com um caminho que informa exatamente onde está na árvore, para que você possa pular para ela em vez de digitalizar o arquivo. O caminho é construído a partir de nomes de elementos, unidos por barras da raiz para baixo. Quando um elemento tem irmãos de mesmo nome, um índice baseado em um entre colchetes desambigua qual deles, portanto /catalog/book[2] é o segundo livro Um atributo é escrito com um @ prefixo, como em /catalog/book[1]/@category, e uma alteração de texto é marcada com text(), como em /catalog/book[2]/price/text().
Esta notação é deliberadamente próxima de Caminho X, a linguagem W3 C para endereçar nós em um documento XML, então se você já ler XPath os caminhos vão parecer familiares e muitas vezes você pode colar uma expressão semelhante em seu próprio ferramental para selecionar o mesmo nó Mesmo sem conhecer XPath, os caminhos lidos naturalmente: os nomes vão para baixo da árvore, colchetes escolher um irmão, @ é um atributo e text() é o conteúdo.
Como o caminho também nomeia o tipo de mudança, o relatório responde a três perguntas ao mesmo tempo: o que mudou, onde mora e se era um elemento, um atributo ou um texto. Isso geralmente é suficiente para abrir o arquivo certo e corrigir a linha certa sem mais nenhuma caça.
Quando é que EU iria realmente usar isto?
O desvio de configuração é o caso que mais acertei Quando um serviço se comporta de maneira diferente entre dois ambientes e o único suspeito é uma configuração XML, comparar os dois arquivos diz estruturalmente em segundos se um valor realmente mudou ou alguém acabou de reformatar o arquivo O mesmo se aplica para construir e implantar pipelines que reescrevem XML, onde você precisa confirmar uma transformação alterada apenas o que deveria.
API e trabalho de integração é o próximo. respostas SOAP, RSS e Atom feeds, e mais antigos REST APIs ainda falam XML, e quando uma carga pára de analisar corretamente um diff estrutural contra uma amostra conhecida-bom identifica o elemento infrator rápido SVG é XML também, então comparar dois ícones exportados mostra exatamente qual caminho ou atributo um editor alterado Sitemaps, arquivos de layout Android, Maven POMs, e .docx os internos são todos XML sob o capô, e todos se beneficiam do mesmo tratamento Eu construo em toda a pilha, e XML aparece em mais cantos do que as pessoas esperam, e é por isso que isso vive ao lado do Formatador XML e xml para json nos meus favoritos. Esbocei como eles se encaixam em um kit mais amplo do Guia JSON para XML.
Há um ângulo de revisão de código também Quando uma solicitação pull toca um dispositivo XML ou um arquivo gerado, o diff bruto na UI de revisão geralmente é ilegível porque um formatador reescreveu a coisa toda Executar o antes e depois através de uma comparação estrutural, depois colar o relatório curto na revisão, diz ao seu revisor o que realmente mudou de uma só vez em vez de pedir-lhes para confiar em uma parede de vermelho O relatório de texto copiável do tool' s existe exatamente para isso: um resumo compacto de cada nó adicionado, removido e alterado com seus valores antes e depois, pronto para cair em um ticket, uma mensagem de commit ou um thread de bate-papo.
As ferramentas de comparação vizinhas cobrem os casos em que o diff XML não. Quando seus dados são tabulares, o Diferença CSV compara linhas e células e, para duas listas simples, o Lista Comparar tool faz definir diferenças Eles compartilham a mesma filosofia: analisar os dados em sua forma natural primeiro, em seguida, comparar, de modo que o diff reflete significado em vez de layout.
Quais são os limites e meu XML é privado?
A ferramenta compara estrutura, o que significa que ela deliberadamente não relata os tipos de diferenças que a estrutura não captura Reordenar dois atributos, alterar recuo ou trocar a sintaxe de fechamento automático são todos tratados como nenhuma mudança, por design Se o seu caso de uso realmente precisa de uma comparação byte-exato, um diff de texto é a ferramenta certa e isso não é O diff estrutural também emparelha elementos repetidos por posição, portanto, se os mesmos registros são embaralhados em uma ordem diferente, a ferramenta vê os movidos como alterados em vez de realocados; classificar ambos os documentos por uma chave estável primeiro, quando isso faz sentido, dá o resultado mais limpo.
XML malformado é relatado em vez de adivinhado em. Se um documento tem uma tag incompatível ou não fechado, ou mais de um elemento raiz, a ferramenta nomeia o problema e diz de que lado ele veio, para que você nunca obtenha um diff enganoso de entrada quebrada Ele lida com as construções comuns do mundo real um analisador deve: atributos em aspas simples ou duplas, tags de fechamento automático, seções CDATA, comentários, instruções de processamento e referências de entidade padrão como < e &.
Na privacidade, tudo é executado em seu navegador Ambos os documentos são analisados e comparados localmente, e nada é carregado, registrado ou armazenado Essa é a propriedade que torna seguro para diff uma configuração de produção, uma carga útil API interna, ou um arquivo específico do cliente, nenhum dos quais pertencem a um servidor stranger' s. O Privacidade de dados em ferramentas online o Guia explica como verificar se uma ferramenta é genuinamente do lado do cliente, o que vale a pena fazer antes de colar qualquer coisa sensível em qualquer ferramenta da web.
Perguntas frequentes
Como faço para comparar dois arquivos XML?
Cole o XML original no primeiro campo e o XML alterado no segundo, depois pressione Comparar A ferramenta analisa ambos em árvores de nós e lista cada elemento, atributo e valor de texto adicionado, removido e alterado, cada um fixado em seu caminho de nó Nada é carregado.
Como um diff XML é diferente de um diff de texto simples?
Um diff de texto compara arquivos linha por linha, portanto, reindentar, reordenar atributos ou rebrapar linhas faz com que quase tudo pareça alterado Um diff XML analisa ambos os documentos em árvores primeiro e os compara estruturalmente, portanto, relata apenas diferenças que mudariam a forma como um analisador lê o documento.
Reordenar atributos conta como uma mudança?
Não. Os atributos são comparados pelo nome, independentemente da ordem em que aparecem na tag, porque a ordem dos atributos não é significativa em XML. Apenas um valor alterado, um atributo adicionado ou um atributo removido são relatados.
Como os elementos repetidos são combinados entre os dois documentos?
Os elementos filhos que compartilham um nome de tag são emparelhados por sua ordem de aparição, de modo que o primeiro item é comparado ao primeiro item, o segundo ao segundo e assim por diante Se um documento tiver mais ocorrências do que o outro, os extras são relatados como adicionados ou removidos.
O que significa o caminho do nó em cada diferença?
O caminho mostra onde na árvore a mudança está, usando nomes de elementos, um índice baseado em um entre colchetes quando há irmãos de mesmo nome, @name para um atributo e texto () para conteúdo de texto Por exemplo, /catalog/book[2]/@id aponta para o atributo id do segundo livro.
Espaços em branco ou formatação afetam a comparação?
Por padrão, o texto somente em espaço em branco é ignorado e as execuções de espaço em branco dentro do texto são recolhidas, portanto, a reformatação do documento não cria diferenças falsas. Você pode confiar na comparação estrutural em vez de combinar exatamente o recuo.
O que acontece se o XML estiver malformado?
A ferramenta relata um erro claro nomeando o problema, como uma tag incompatível ou não fechada, e informa de qual documento ela veio. Ele não adivinha um reparo, então você nunca obtém um diferencial enganoso com entradas quebradas.
Meus documentos XML são carregados em algum lugar?
Não. Toda análise e comparação acontecem como JavaScript no seu navegador Nada é transmitido, registrado ou armazenado. Você pode confirmar isso assistindo à guia de rede ou desconectando-se da internet, a ferramenta continua funcionando offline.
Compare seus próprios documentos com o gratuito Verificador de diferença XML. Ele relata diferenças estruturais por caminho de nó, inteiramente no seu navegador, sem nada carregado.



