Linux에서 두 XML 파일간에 차이점을 어떻게 생성 할 수 있습니까?
이상적으로는 엄격하게 구성하거나 공백 또는 속성 순서와 같은 것을 느슨하게 구성하고 싶습니다.
나는 종종 파일이 기능적으로 동일하다는 것을 신경 쓰지 만, 특히 XML 파일에 줄 바꿈이 많지 않은 경우 그 자체만으로는 사용하기가 어려울 것입니다.
예를 들어, 다음은 나에게 정말 괜찮을 것입니다.
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
답변
한 가지 방법은 두 XML 파일을 모두 정식 XML 로 바꾸고 를 사용하여 결과를 비교하는 것 diff
입니다. 예를 들어 xmllint 를 사용하여 XML을 표준화 할 수 있습니다.
$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml
또는 하나의 라이너로.
$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
답변
Jukka의 대답은 효과가 없었지만 Canonical XML을 가리 켰습니다. 어느 –c14n 도 –c14n11는 속성을 분류,하지만 난 발견했다 –exc-C14N의 스위치 종류의 속성을했다. –exc-c14n 은 매뉴얼 페이지에 나열되어 있지 않지만 명령 줄에서 “W3C 단독 표준 형식”으로 설명되어 있습니다.
$ xmllint --exc-c14n one.xml > 1.xml
$ xmllint --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml
$ xmllint | grep c14
--c14n : save in W3C canonical format v1.0 (with comments)
--c14n11 : save in W3C canonical format v1.1 (with comments)
--exc-c14n : save in W3C exclusive canonical format (with comments)
$ rpm -qf /usr/bin/xmllint
libxml2-2.7.6-14.el6.x86_64
libxml2-2.7.6-14.el6.i686
$ cat /etc/system-release
CentOS release 6.5 (Final)
경고 –exc-c14n 은 xml 헤더를 제거하는 반면 –c14n은 xml 헤더를 앞에 추가합니다.
답변
@ Juka Matilainen의 대답을 사용하려고했지만 공백에 문제가있었습니다 (파일 중 하나는 거대한 하나의 라이너였습니다). 를 사용 --format
하면 공백 차이를 건너 뛸 수 있습니다.
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
참고 : vimdiff
XML을 나란히 비교 하려면 명령을 사용하십시오 .
답변
Diffxml 은 기본 기능을 올바르게 제공하지만 구성에 대한 많은 옵션을 제공하지는 않습니다.
편집 : 프로젝트 Diffxml 이 2013 년부터 GitHub로 마이그레이션되었습니다.
답변
자식 요소의 순서를 무시하고 싶다면 다음과 같은 간단한 파이썬 도구를 작성했습니다 xmldiffs
.
요소와 속성 순서를 무시하고 두 개의 XML 파일을 비교하십시오.
용법:
xmldiffs [OPTION] FILE1 FILE2
추가 옵션이
diff
명령에 전달됩니다 .
https://github.com/joh/xmldiffs 에서 다운로드 하십시오.
답변
XML 파일을 비교하는 내 Python 스크립트 xdiff.py 는 요소 순서와 달리 공백 또는 속성 순서의 차이를 무시합니다.
두 파일 1.xml
과 를 비교하기 위해 2.xml
다음과 같이 스크립트를 실행합니다.
xdiff.py 1.xml 2.xml
OP의 예에서는 아무것도 출력하지 않고 종료 상태를 반환합니다 0
(구조적 또는 텍스트 적 차이가 없음).
구조적 으로 1.xml
그리고 2.xml
다른 경우에는 GNU diff의 통합 출력을 모방하고 종료 상태를 반환합니다 1
. -a
모든 컨텍스트 -n
출력, 컨텍스트 없음 출력 및 -q
출력 억제 (종료 상태를 여전히 리턴하는 중 ) 등 출력 제어를위한 다양한 옵션이 있습니다 .