Eu tenho dois arquivos com os mesmos dados, mas em linhas diferentes.
Arquivo 1:
<Identities>
<Identity>
<Id>048206031415072010Comcast.USR8JR</Id>
<UID>ccp_test_79</UID>
<DisplayName>JOSH CCP</DisplayName>
<FirstName>JOSH</FirstName>
<LastName>CCP</LastName>
<Role>P</Role>
<LoginStatus>C</LoginStatus>
</Identity>
<Identity>
<Id>089612381523032011Comcast.USR1JR</Id>
<UID>94701_account1</UID>
<DisplayName>account1</DisplayName>
<FirstName>account1</FirstName>
<LastName>94701</LastName>
<Role>S</Role>
<LoginStatus>C</LoginStatus>
</Identity>
</Identities>
Arquivo 2:
<Identities>
<Identity>
<Id>089612381523032011Comcast.USR1JR</Id>
<UID>94701_account1</UID>
<DisplayName>account1</DisplayName>
<FirstName>account1</FirstName>
<LastName>94701</LastName>
<Role>S</Role>
<LoginStatus>C</LoginStatus>
</Identity>
<Identity>
<Id>048206031415072010Comcast.USR8JR</Id>
<UID>ccp_test_79</UID>
<DisplayName>JOSH CCP</DisplayName>
<FirstName>JOSH</FirstName>
<LastName>CCP</LastName>
<Role>P</Role>
<LoginStatus>C</LoginStatus>
</Identity>
</Identities>
Se eu usar o diff file1 file2
comando, estou recebendo a resposta abaixo:
1,10d0
< <Identities>
< <Identity>
< <Id>048206031415072010Comcast.USR8JR</Id>
< <UID>ccp_test_79</UID>
< <DisplayName>JOSH CCP</DisplayName>
< <FirstName>JOSH</FirstName>
< <LastName>CCP</LastName>
< <Role>P</Role>
< <LoginStatus>C</LoginStatus>
< </Identity>
20a11,20
> <Identities>
> <Identity>
> <Id>048206031415072010Comcast.USR8JR</Id>
> <UID>ccp_test_79</UID>
> <DisplayName>JOSH CCP</DisplayName>
> <FirstName>JOSH</FirstName>
> <LastName>CCP</LastName>
> <Role>P</Role>
> <LoginStatus>C</LoginStatus>
> </Identity>
Mas não preciso fazer diferença, porque esses arquivos têm os mesmos dados em linhas diferentes.
bash
shell
xml
file-comparison
user32026
fonte
fonte
xmldiff
, mas acho que ainda notará a alteração da ordem, pois a ordem é relevante no XML genérico. Eu acho que sua melhor abordagem é usar um analisador e gerador de XML para colocar cada arquivo em uma ordem e formato canônicos e, em seguida, usexmldiff
ordiff
. Um trabalho para sua linguagem de script favorita (Perl, Ruby, Python, etc.).Respostas:
Você pode conseguir o que deseja com a ajuda de um pequeno script Python (você precisará do Python instalado, bem como do
lxml
kit de ferramentas).tagsort.py
:Esse script classifica os elementos de primeiro nível na raiz do documento XML pelo conteúdo de um elemento de segundo nível, enviando o resultado para stdout. É assim chamado:
Depois de conseguir isso, você pode usar a substituição de processo para obter um diff com base em sua saída (adicionei um elemento e alterei outro em seus arquivos de exemplo para mostrar um resultado não vazio):
fonte
Tive um problema semelhante e, finalmente, encontrei: /superuser/79920/how-can-i-diff-two-xml-files
Esse post sugere fazer uma classificação xml canônica e fazer uma comparação. O seguinte deve funcionar para você se você estiver no linux, mac ou se tiver o Windows instalado algo como o cygwin:
fonte
É marcado como shell, mas sinceramente prefiro usar uma linguagem de script com um analisador. Neste caso
perl
comXML::Twig
.É algo como isto:
Estou comparando explicitamente um elemento 'Identidade' de cada vez e verificando se todos os campos em um existem no outro, com o mesmo valor.
E depois revertendo isso, porque o segundo arquivo pode ter entradas extras.
fonte