나는 오후를 한 번 잃었다 그 "changed" 두 배포 사이에. 내 터미널의 diff 는 빨간색의 벽,줄 수백,그리고 배포 파이프라인이 파일을 다시 포맷했다는 것을 깨닫기 전에 실제 변화를 위해 사냥하는 데 한 시간을 보냈습니다: 그것을 reindented,몇 가지 속성을 재정렬,일부 긴 줄을 다시 포장했습니다. 파서가 신경 쓸 바이트가 실제로 변경되지 않았습니다. 노이즈에 묻혀있는 단일 값을 제외하고는 라인 기반 diff 가 XML 을 이해하지 못하기 때문에 라인 기반 diff 는 XML 을 비교할 가치가있는 방식으로 XML 을 비교하는 것에 관한 것입니다 XML 차이 검사기 Toolz.dev에서 구조적 비교가 형식에 익사하는 대신 중요한 변경 사항을 찾는 이유.
TL;DR: XML diff 는 두 문서를 텍스트 줄이 아닌 노드 트리로 비교하므로 속성을 다시 들여쓰거나 순서를 변경하거나 줄을 다시 래핑하는 것은 변경으로 등록되지 않습니다. 이는 각각 노드 경로에 고정된 요소,속성 및 텍스트 값이 추가,제거 또는 변경된 것을 보고합니다. XML diff 는 두 문서를 노드 트리로 비교합니다 XML 차이 검사기 업로드된 내용이 없이 브라우저에서 이 작업을 완전히 수행합니다.
XML diff 검사기란 무엇입니까?
XML diff 검사기는 두 개의 XML 문서를 비교하고 구조적 차이점의 집합으로 변경된 것을 보고합니다: 어떤 요소가 나타나거나 사라졌는지,어떤 속성이 변경된 값인지,텍스트 내용이 다른지. 파일을 한 줄씩 비교하는 대신 두 가지를 노드 트리로 구문 분석하고 데이터로 계산합니다. 원본은 왼쪽에,새 버전은 오른쪽에 붙여넣고 차이점 목록을 다시 가져옵니다. 각 항목에는 해당 문제가 발생한 트리의 정확한 경로가 표시되어 있습니다.
구조적 비교의 요점은 XML 이 많은 다른 바이트 레이아웃에 걸쳐 동일한 의미를 전달한다는 것입니다. The W3C XML 사양 는 일부 서페이스 세부 정보가 파싱된 문서에 영향을 미치지 않는다는 것을 명시합니다: 요소의 속성 순서는 중요하지 않으며 요소 사이의 공백은 일반적으로 형식만 지정합니다. 들여쓰기,속성 순서,줄 끝 또는 빈 요소가 다음과 같이 작성되는지 여부가 다르지만 두 파일은 구조적으로 동일할 수 있습니다 <tag></tag> 또는 <tag/>. 일반 텍스트 diff는 이 모든 것을 플래그 지정합니다; 구조적 diff는 이를 무시하고 파서가 실제로 다르게 읽는 것만 보여줍니다.
Toolz.dev 에서는 워크플로가 짧습니다. 두 문서를 모두 붙여넣고 공백,속성 또는 대소문자를 무시할지 여부를 선택한 다음 비교를 누릅니다. 이 도구는 두 트리를 구문 분석하고 모든 차이점을 경로별로 나열하고,추가, 제거 및 변경으로 그룹화하며,이전 값과 새 값을 나란히 배치합니다.
XML diff는 텍스트 diff와 어떻게 다릅니까?
Git 과 대부분의 편집기에 내장된 종류인 텍스트 diff 는 파일을 줄의 시퀀스로 비교하고 하나를 다른 것으로 바꾸는 삽입과 삭제의 가장 짧은 집합을 찾습니다. 이는 줄들이 의미 있는 단위인 소스 코드에 정확히 맞는 것입니다. 의미는 트리에 살고 줄 바꿈은 장식인 XML 에 대한 잘못된 모델입니다.
실패 모드는 예측 가능합니다. 문서를 다시 들여쓰기하면 텍스트 diff 가 변경된 거의 모든 줄을 표시합니다. 한 요소에서 두 속성을 재정렬하면 요소가 파서와 동일하더라도 해당 줄에 플래그가 지정됩니다. 상단 근처에 하나의 자식을 추가하고 그 아래의 모든 줄이 이동하므로 diff 는 실제로 변경되지 않는 일련의 이동을 표시합니다. 결국 수백 개의 플래그가 지정된 줄을 스캔하여 중요한 줄을 찾습니다. 위에서 설명한 오후입니다.
구조적 diff 는 먼저 구문 분석하여 그 모든 것을 회피합니다. 각 문서에서 트리를 구축 한 다음 노드를 비교하여 두 트리를 함께 걷습니다. 포맷 차이는 단순히 트리 수준에 존재하지 않으므로 출력에 표시 될 수 없습니다. 남아있는 것은 XML 을 소비하는 소프트웨어의 동작 방식을 변경하는 일련의 변경 사항이며,이는 거의 항상 실제로 신경 쓰는 집합입니다. 데이터가 XML 이 아닌 JSON 인 경우 동일한 원칙이 적용됩니다 JSON 차이점 도구는 거기에서 동등한 구조적 비교를 수행합니다.
무엇이 바뀌었는지 어떻게 결정하나요?
비교는 각 요소의 세 레이어에서 이루어지며, 이를 분리하면 출력을 읽을 수 있습니다.
XML 에서 속성 순서가 중요하지 않기 때문에 속성은 태그에 나타나는 순서와 관계없이 이름으로 비교됩니다. 각 요소에 대해 도구는 양쪽에 어떤 속성이 존재하는지 확인하고 값이 다를 때 변경된 속성을 보고하거나 오른쪽에만 나타날 때 추가하거나 왼쪽에만 나타날 때 제거 순서를 다시 지정합니다 <a x="1" y="2"/> 에 <a y="2" x="1"/> 전혀 차이가 없습니다.
텍스트 내용은 각 요소의 직접 텍스트로 비교됩니다. 공백 처리가 켜지면 공백과 개행이 축소되고 선행 및 후행 공백이 트리밍되므로 문서를 예쁘게 인쇄해도 팬텀 텍스트 변경이 발생하지 않습니다. 태그 사이의 단어에 대한 진정한 변경만 보고됩니다.
자식 요소는 흥미로운 부분입니다. 태그 이름을 공유하는 요소는 모양 순서에 따라 짝을 이룹니다: 첫 번째 <item> 왼쪽은 첫 번째와 비교됩니다 <item> 오른쪽,두 번째에서 두 번째 등등. 한쪽이 다른 쪽보다 더 많이 발생했을 때,추가 항목은 정렬 불량을 강요하는 것이 아니라 추가되거나 제거된 것으로 보고됩니다. 이 순서 규칙은 반복되는 한 요소의 작은 변화가 모든 형제의 차이점으로 계단식으로 이어지는 것을 막는 것입니다.
두 비교 모델이 쌓이는 방법은 다음과 같습니다:
| 측면 | 텍스트 차이 | XML 차이(구조적) |
|---|---|---|
| 비교된 단위 | 텍스트 줄 | 트리의 노드 |
| 순열 | 변경사항으로 표시됩니다 | 무시되었습니다 |
| 속성 재정렬 | 변경으로 표시됩니다 | 무시되었습니다 |
| 보고서 변경 위치 | 라인 번호 | 노드 경로, 예를 들어 /catalog/book[2]/@id |
| 요소 vs 속성 vs 텍스트를 구별합니다 | 아니요 | 예 |
| 위한 최고의 | 소스 코드, 산문 | XML 구성, API 페이로드, SVG, 사이트맵 |
구체적인 예제는 레이어링을 명확하게 합니다. 두 버전 사이에서 하나의 book's 카테고리 속성이 픽션에서 미스터리로 바뀌고,동일한 book's 가격 텍스트가 12,99 에서 14,99 로 바뀌고,두 번째 책이 새로운 isbn 요소를 얻는 작은 책 카탈로그를 가져 가라. 선 diff 는 세 가지 모두와 그 주변의 순입력을 함께 뒤죽박죽으로 표시 할 것입니다. 구조적 diff 는 정확히 세 가지 차이점을보고합니다: 카테고리 경로에서 변경된 속성,가격 경로에서 변경된 텍스트 노드,isbn 경로에서 추가 된 요소 각각은 종류가 태그되어 있으므로 두 개는 기존 데이터에 대한 편집이었고 하나는 진짜 추가임을 한눈에 알 수 있습니다. 그 분리는 보고서를 읽는 것과 해독하는 것의 차이입니다.
이 도구는 또한 결과를 실행 카운트가있는 추가,제거 및 변경된 탭으로 그룹화하므로 "did anything get deleted,"와 같은 거친 질문에 먼저 대답 할 수 있습니다 세부 사항을 드릴링하기 전에 큰 문서에서이 주문 사항: 삭제 된 요소가 필요한 필드를 자동으로 벗겨 낼 수 있기 때문에 제거는 종종 가장 위험한 변경이며 관련없는 편집을 통해 넘어 가지 않고 격리 할 수 있다는 것은 실시간 보호기입니다.
차이의 노드 경로는 무엇을 의미합니까?
모든 차이점에는 트리의 위치를 정확히 알려주는 경로가 표시되어 있으므로 파일을 스캔하는 대신 해당 경로로 이동할 수 있습니다. 경로는 요소 이름으로 구성되며 루트 아래의 슬래시로 연결됩니다. 요소에 동일한 이름의 형제가 있는 경우 괄호 안의 1 기반 인덱스는 어느 것을 명확하게 하는지 알려줍니다 /catalog/book[2] 는 두번째 책입니다. 속성은 an 으로 씁니다 @ 접두사는 다음과 같습니다 /catalog/book[1]/@category및 텍스트 변경으로 표시됩니다 text(), 에서와 같이 /catalog/book[2]/price/text().
이 표기법은 의도적으로 가깝습니다 XPath는, XML 문서에 있는 마디를 다루는 W3C 언어, 그래서 당신이 이미 XPath를 읽는 경우에 경로 친밀하게 느낄 것입니다 그리고 당신은 수시로 동일한 마디를 선정하기 위하여 당신의 자신의 장식새김으로 유사한 표현을 풀칠할 수 있습니다 XPath를 모른 조차, 경로가 자연스럽게 읽힌다: 이름은 나무의 아래, 부류 선택합니다 형제를, 갑니다 @ 는 속성, 그리고 text() 는 내용이다.
경로가 변화의 종류를 너무 지명하기 때문에,보고서는 한 번에 3 개의 질문에 응답한다: 무엇이 변화했는지,어디에 살고 있는지,그리고 그것이 요소인지,속성인지, 텍스트인지. 그것은 일반적으로 더 이상 사냥하지 않고 올바른 파일을 열고 올바른 줄을 고치기에 충분하다.
이걸 실제로 언제 쓰게 될까요?
Configuration drift 는 내가 가장 많이 친 경우이다. 서비스가 두 환경 사이에서 다르게 동작하고 유일한 용의자가 XML config 일 때,두 파일을 비교하면 구조적으로 값이 진정으로 변경되었는지 또는 누군가가 방금 파일을 다시 포맷했는지 몇 초 만에 알려준다. XML 을 다시 작성하는 파이프 라인을 빌드하고 배포하는 경우에도 마찬가지이며,변환이 예상했던 것만 변경했는지 확인해야 한다.
API 및 통합 작업은 그 다음입니다. SOAP 응답,RSS 및 Atom 피드,이전 REST API 는 여전히 XML 을 사용하며,페이로드가 올바르게 구문 분석을 중지하면 알려진 양호한 샘플에 대한 구조적 diff 가 문제가 되는 요소를 빠르게 정확히 찾아냅니다. SVG 도 XML 이므로 내보낸 두 아이콘을 비교하면 편집기가 변경된 경로 또는 속성이 정확히 표시됩니다. 사이트맵,Android 레이아웃 파일,Maven POM 및 .docx 내부는 모두 후드 아래에 있는 XML이며 모두 동일한 처리의 이점을 얻습니다. 스택을 가로질러 빌드하면 XML이 사람들이 예상하는 것보다 더 많은 모서리에 나타나기 때문에 이것이 바로 XML 옆에 사는 이유입니다 XML 포맷터 그리고 JSON 에 XML 을 내 북마크에서. 나는 이것이 더 넓은 키트에 어떻게 맞는지 스케치했습니다 JSON-XML 가이드.
코드-리뷰 각도도 있습니다. 풀 요청이 XML 픽스처나 생성된 파일에 닿으면,리뷰 UI 의 원시 diff 는 포맷터가 전체를 다시 작성했기 때문에 종종 읽을 수 없습니다. 구조적 비교를 통해 전후를 실행한 다음,리뷰에 짧은 보고서를 붙여넣으면,리뷰어에게 빨간색 벽을 신뢰하라고 요청하는 대신 실제로 한 눈에 무엇이 바뀌었는지 알려줍니다. tool's 복사 가능한 텍스트 보고서는 정확히 그것을 위해 존재합니다: 추가,제거, 변경된 모든 노드에 대한 컴팩트한 요약으로,그 전후 값으로 티켓,커밋 메시지 또는 채팅 스레드에 드롭할 준비가 되어 있습니다.
이웃 비교 도구는 XML diff가 다루지 않는 경우를 다룹니다. 데이터가 표 형식인 경우 CSV 차이 행과 셀을 비교하고 두 개의 일반 목록에 대해 다음을 비교합니다 목록 비교 도구는 차이점을 설정합니다. 그들은 같은 철학을 공유합니다: 먼저 데이터를 자연스러운 모양으로 구문 분석 한 다음 비교하므로 diff 는 레이아웃이 아닌 의미를 반영합니다.
한계는 무엇이며, 내 XML은 비공개입니까?
도구는 구조를 비교합니다. 즉,구조가 포착하지 못하는 차이의 종류를 의도적으로 보고하지 않습니다. 두 속성을 재정렬하거나 들여쓰기를 변경하거나 자동 닫기 구문을 바꾸는 것은 모두 변경이 없는 것으로 처리됩니다. 설계상 사용 사례에 진정으로 바이트-정확한 비교가 필요한 경우 텍스트 diff 가 올바른 도구이고 이는 그렇지 않습니다. 구조적 diff 는 또한 반복되는 요소를 위치별로 쌍으로 연결하므로 동일한 레코드가 다른 순서로 섞이면 도구는 이동된 요소를 재배치된 것이 아니라 변경된 것으로 봅니다; 두 문서를 먼저 안정적인 키로 정렬하면 의미가 있을 때 가장 깨끗한 결과를 얻을 수 있습니다.
잘못된 형식의 XML 은 추측이 아닌 보고됩니다. 만약 문서에 일치하지 않거나 닫히지 않은 태그,또는 루트 요소가 하나 이상 있다면,도구는 문제의 이름을 지정하고 어느 쪽에서 왔는지 알려주기 때문에,깨진 입력으로부터 오해의 소지가 있는 diff 를 절대 얻지 못합니다. 일반적인 실제 구문은 파서가 반드시 처리해야 합니다: 단일 또는 이중 따옴표의 속성,자동 닫는 태그,CDATA 섹션,댓글, 처리 지침,그리고 표준 엔터티 참조와 같은 < 그리고 &.
프라이버시에서는 모든 것이 브라우저에서 실행됩니다. 두 문서 모두 로컬에서 구문 분석 및 비교되며 업로드,로그 또는 저장되는 것은 없습니다. 즉,프로덕션 구성,내부 API 페이로드 또는 고객별 파일을 diff 하는 것이 안전하도록 만드는 속성입니다. 이 중 어느 것도 stranger's 서버에 속하지 않습니다. The 온라인 도구의 데이터 개인 정보 보호 가이드는 도구가 진정한 클라이언트 측인지 확인하는 방법을 설명합니다. 이는 민감한 내용을 웹 도구에 붙여넣기 전에 수행할 가치가 있습니다.
자주 묻는 질문
두 개의 XML 파일을 어떻게 비교합니까?
원본 XML 을 첫 번째 필드에 붙여넣고 변경된 XML 을 두 번째 필드에 붙여넣은 다음 비교를 누릅니다. 이 도구는 두 가지를 모두 노드 트리로 구문 분석하고 추가,제거 및 변경된 모든 요소,속성 및 텍스트 값을 나열하며 각각 노드 경로에 고정되지 않습니다.
XML diff는 일반 텍스트 diff와 어떻게 다릅니까?
텍스트 diff 는 파일을 한 줄씩 비교하므로 속성을 다시 입력하거나 순서를 변경하거나 줄을 다시 래핑하면 거의 모든 것이 변경된 것처럼 보입니다. XML diff 는 두 문서를 먼저 트리로 구문 분석하고 구조적으로 비교하므로 파서가 문서를 읽는 방법을 변경하는 차이점만 보고합니다.
재주문 속성은 변경으로 간주됩니까?
아니요. XML 에서 속성 순서가 중요하지 않기 때문에 태그에 나타나는 순서에 관계없이 이름으로 속성을 비교합니다. 변경된 값,추가된 속성 또는 제거된 속성만 보고됩니다.
두 문서 간에 반복되는 요소는 어떻게 일치합니까?
태그 이름을 공유하는 하위 요소는 모양 순서에 따라 쌍을 이루므로 첫 번째 항목은 첫 번째 항목과 비교되고 두 번째 항목은 두 번째 항목과 비교됩니다. 한 문서가 다른 문서보다 더 많이 발생하면 추가 항목이 추가되거나 제거된 것으로 보고됩니다.
각 차이의 노드 경로는 무엇을 의미합니까?
경로는 트리 안에서 변경이 어디에 있는지를 보여주는데, 요소 이름을 사용하여 같은 이름의 형제가 있을 때 괄호 안에 있는 1 기반 인덱스, 속성에 대한 @name, 텍스트 내용에 대한 text(), 예를 들어 /catalog/book[2]/@id는 두 번째 책의 id 속성을 가리킵니다.
공백이나 서식이 비교에 영향을 줍니까?
기본적으로 공백 전용 텍스트는 무시되고 텍스트 내부의 공백 실행은 축소되므로 문서를 다시 포맷해도 잘못된 차이가 발생하지 않습니다. 들여쓰기를 정확하게 일치시키기보다는 구조적 비교에 의존할 수 있습니다.
XML이 잘못된 경우 어떻게 되나요?
이 도구는 불일치 또는 닫히지 않은 태그와 같은 문제의 이름을 지정하는 명확한 오류를보고하고 어떤 문서에서 왔는지 알려줍니다. 수리시 추측하지 않으므로 깨진 입력에서 오해의 소지가있는 차이를 결코 얻지 못합니다.
내 XML 문서가 아무데나 업로드되어 있나요?
아니요. 모든 구문 분석 및 비교는 브라우저에서 JavaScript 로 발생합니다. 전송,로그 또는 저장되는 것은 없습니다. 네트워크 탭을 보거나 인터넷에서 연결을 끊으면 도구가 오프라인으로 계속 작동하여이를 확인할 수 있습니다.
자신의 문서를 무료 문서와 비교해 보세요 XML 차이 검사기. 그것은 아무것도를 올려주기하지 않는 당신의 브라우저에서, 완전히, 노드 경로에 의하여 구조상 다름을 보고합니다.



