두 개의 XML 파일을 어떻게 비교할 수 있습니까?


75

Linux에서 두 XML 파일간에 차이점을 어떻게 생성 할 수 있습니까?

이상적으로는 엄격하게 구성하거나 공백 또는 속성 순서와 같은 것을 느슨하게 구성하고 싶습니다.

나는 종종 파일이 기능적으로 동일하다는 것을 신경 쓰지 만, 특히 XML 파일에 줄 바꿈이 많지 않은 경우 그 자체만으로는 사용하기가 어려울 것입니다.

예를 들어, 다음은 나에게 정말 괜찮을 것입니다.

<tag att1="one" att2="two">
  content
</tag>

<tag att2="two" att1="one">
  content
</tag>

답변:


86

한 가지 방법은 두 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)

1
xmllint의 --c14n 스위치에 대해 전혀 몰랐습니다. 편리합니다.
qedi 2009

18
한 줄로도 가능합니다vimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
Nathan Villaescusa

OS의 X와 xmllint가 배송
ClintM

10
명확하지 않은 경우 c14n은 정규화 (canonicalization )의 약자입니다 .
Brandin

3
두 XML을 모두 포맷하기 전에 추가 단계를 실행하는 것이 좋습니다 (xmllint --format). 이 단계가 없으면 diff가 필요한 것보다 더 많은 차이점을 나타냅니다.
ka3ak

23

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 헤더를 앞에 추가합니다.


18

@ Juka Matilainen의 대답을 사용하려고했지만 공백에 문제가있었습니다 (파일 중 하나는 거대한 하나의 라이너였습니다). 를 사용 --format하면 공백 차이를 건너 뛸 수 있습니다.

xmllint --format one.xml > 1.xml  
xmllint --format two.xml > 2.xml  
diff 1.xml 2.xml  

참고 : vimdiffXML을 나란히 비교 하려면 명령을 사용하십시오 .


내 경우 에는 스크립트 two.xml에서 생성되었습니다 one.xml. 그래서 스크립트에 의해 추가 / 제거 된 내용을 확인해야했습니다.
GuruM

1
이것이 내가 필요한 옵션이었습니다. 가장 표준적인 버전은 다음 --format과 결합 하여 얻을 수 있습니다 --exc-c14n. 아마 여전히 느립니다 것은 :( 처리 할 수
ᴠɪɴᴄᴇɴᴛ

답을 쓴 지 꽤 시간이 지났지 만 --exc-c14n 플래그를 사용하는 것을 희미하게 기억합니다. 그러나 플래그가 있거나없는 출력의 차이는 차이가 없으므로 사용을 중단했습니다. 불필요하거나 사용하지 않는 플래그를 삭제하면 프로세스가 더 빨라질 수 있습니다.
GuruM

5
--exc-c14n옵션은 속성 정렬을 지정합니다. 특정 파일에서 속성이 이미 정렬되었을 수도 있지만 일반적인 조언은 조합을 사용하는 것 --format --exc-c14n입니다.
ᴠɪɴᴄᴇɴᴛ

6

Diffxml 은 기본 기능을 올바르게 제공하지만 구성에 대한 많은 옵션을 제공하지는 않습니다.

편집 : 프로젝트 Diffxml 이 2013 년부터 GitHub로 마이그레이션되었습니다.


아직은 없지만 적어도 유망한 것으로 보입니다.
qedi 2009

그래도 큰 파일에는 유용하지 않습니다. 두 파일을 ~ 20k 줄씩 비교할 때 40GB (RAM + SWAP)를 먹은 후에 죽었습니다
Grzegorz

이 프로젝트는 2013 년 마지막 업데이트와 함께 죽은 것으로 보인다주의
마테우스 Konieczny을

4

자식 요소의 순서를 무시하고 싶다면 다음과 같은 간단한 파이썬 도구를 작성했습니다 xmldiffs.

요소와 속성 순서를 무시하고 두 개의 XML 파일을 비교하십시오.

용법: xmldiffs [OPTION] FILE1 FILE2

추가 옵션이 diff명령에 전달됩니다 .

https://github.com/joh/xmldiffs 에서 다운로드 하십시오.


1

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출력 억제 (종료 상태를 여전히 리턴하는 중 ) 등 출력 제어를위한 다양한 옵션이 있습니다 .


0

Beyond Compare 를 사용 하여 모든 유형의 텍스트 기반 파일을 비교합니다. Windows 및 Linux 용 버전을 생성합니다.


1
일반 텍스트 비교에서는 두 줄이 다르다고 말하지만 OP는 두 줄이 동일하게보고되기를 원합니다.
ChrisF

4
즉, 정식 으로 XML을 비교 합니다.
Chris W. Rea

1
Beyond Compare는 이것을 정말 짜증나게합니다. XML 요소를 인식하지 못하고 대부분 텍스트 비교 만 수행하는 것 같습니다.
Rob K

Beyond Compare에는 XML 플러그인이 있지만 제대로 설치할 수 없었습니다. 그래 ... 그래 ...이 페이지에 와서 더 현명 해졌습니다.
Erk

-1

우리의 SD 스마트 Differencer을 기반으로 문서 비교 구조를 실제 배치에 반대.

XML Smart Differencer가 있습니다. XML의 경우 이는 태그와 내용의 일치 순서를 의미합니다. 지정한 특정 조각의 텍스트 문자열이 다릅니다. 현재 공백이 정규화되어 있는지 또는 유의성이 있는지를 나타내는 태그 속성의 XML 개념을 이해하지 못합니다.


1
SO 프로파일에서 고용주에 대한 완전한 공개를 제공합니다. BTW, 평가 사본을 다운로드하려고 시도했지만 요청 양식은 '스마트'(JS를 통해) Smart Differencer와의 조합 XML을 비활성화하기에 충분합니다. SD 제품 페이지에 따르면 가능하지만 Python과 함께 사용합니까?
ᴠɪɴᴄᴇɴᴛ

1
아 알림 주셔서 감사합니다. 이것은 명확한 SO 정책이 있기 전의 대답입니다. SO 정책 준수 답변의 관계를 알리기 위해 답변을 수정하고 있습니다.
Ira Baxter

다운로드 페이지를 확인하겠습니다. 모든 라이브 제품이 해당 목록에 포함되는 것은 아닙니다. 예, 이것들이 존재합니다.
Ira Baxter

다운로드 페이지를 확인했습니다. 예, XML 스마트 차이는 없습니다. 뒷방에있는 사람들이 그 문제를 해결하도록 노력하겠습니다. 최대 1-2 주 안에 도착해야합니다 (백 로그가 있거나 모두는 없습니까?) 그 동안 시도하고 싶다면 이메일을 보내십시오 (바이오 참조).
Ira Baxter

1
링크 된 페이지에는 "XML"이라는 단어가 없습니다.
Mateusz Konieczny

-1

온라인 도구의 의존성이 솔루션으로 계산되는지 확실하지 않지만 가치가있는 것은이 온라인 XML 비교 도구 에서 좋은 결과를 얻었습니다 . 간단하게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.