두 파일에 동일한 데이터가 있지만 다른 줄에 있습니다.
파일 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>
파일 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>
diff file1 file2
명령을 사용하면 응답이 아래에 표시됩니다.
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>
그러나이 파일은 다른 줄에 동일한 데이터가 있기 때문에 차이가 없습니다.
답변
작은 Python 스크립트를 사용하여 원하는 것을 얻을 수 있습니다 ( lxml
툴킷 뿐만 아니라 Python도 설치해야 함 ).
tagsort.py
:
#!/usr/bin/python
import sys
from lxml import etree
filename, tag = sys.argv[1:]
doc = etree.parse(filename, etree.XMLParser(remove_blank_text=True))
root = doc.getroot()
root[:] = sorted(root, key=lambda el: el.findtext(tag))
print etree.tostring(doc, pretty_print=True)
이 스크립트는 XML 문서 루트 아래의 첫 번째 수준 요소를 두 번째 수준 요소의 내용으로 정렬하여 결과를 stdout으로 보냅니다. 다음과 같이 호출됩니다.
$ python tagsort.py filename tag
일단 얻은 후에는 프로세스 대체 를 사용 하여 출력을 기반으로 diff를 얻을 수 있습니다 (예제 파일에서 하나의 요소를 추가하고 비어 있지 않은 결과를 표시하도록 다른 요소를 변경했습니다).
$ diff <(python tagsort.py file1 Id) <(python tagsort.py file2 Id)
4a5
> <AddedTag>Something</AddedTag>
17c18
< <Role>X</Role>
---
> <Role>S</Role>
답변
나는 비슷한 문제가 있었고 결국 나는 /superuser/79920/how-can-i-diff-two-xml-files를 발견했다.
이 게시물은 표준 XML 정렬을 수행 한 다음 diff를 수행하도록 제안합니다. Linux, mac 또는 cygwin과 같은 Windows가 설치된 경우 다음이 적합합니다.
$ xmllint --c14n File1.xml > 1.xml
$ xmllint --c14n File2.xml > 2.xml
$ diff 1.xml 2.xml
답변
쉘 태그가 붙어 있지만 솔직히 파서와 함께 스크립팅 언어를 사용하는 것이 좋습니다. 이 경우 perl
에 XML::Twig
.
다음과 같이 진행됩니다.
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
sub compare_by_identity {
my ( $first, $second ) = @_;
foreach my $identity ( $first->get_xpath('//Identity') ) {
my $id = $identity->first_child_text('Id');
print $id, "\n";
my $compare_to =
$second->get_xpath( "//Identity/Id[string()=\"$id\"]/..", 0 );
if ($compare_to) {
print "Matching element found for ID $id\n";
foreach my $element ( $identity->children ) {
my $tag = $element->tag;
my $text = $element->text;
if ( not $element->text eq $compare_to->first_child_text($tag) ) {
print "$id, $tag has value $text which doesn't match: ",
$compare_to->first_child_text($tag), "\n";
}
}
}
else {
print "No matching element for Id $id\n";
}
}
}
my $first_file = XML::Twig->new->parsefile('test1.xml');
my $second_file = XML::Twig->new->parsefile('test2.xml');
compare_by_identity( $first_file, $second_file );
compare_by_identity( $second_file, $first_file );
한 번에 하나의 ‘Identity’요소를 명시 적으로 비교하고 한 필드의 모든 필드가 다른 필드에 동일한 값으로 존재하는지 확인하고 있습니다.
두 번째 파일 에는 추가 항목 이있을 수 있기 때문에이를 되돌립니다.