본문으로 건너뛰기
AZ Tools

XML ↔ JSON 컨버터

XML → JSON·JSON → XML 양방향, 전체 속성 지원, 구성 가능 속성 프리픽스·텍스트 키. 브라우저 네이티브 DOMParser가 네임스페이스·CDATA·코멘트 처리.

사용법

  1. 방향을 선택하고 XML(또는 JSON)을 붙여 넣습니다. 샘플 데이터는 클릭 한 번으로 불러올 수 있습니다.
  2. 특정 스키마(x2js·fast-xml-parser·커스텀)에 맞춰야 한다면 속성 프리픽스와 텍스트 키를 조정합니다.
  3. JSON을 XML로 바꿀 때는 루트 요소 이름을 설정하고 <?xml ... ?> 선언을 켜거나 끌 수 있습니다. 준비되면 복사하세요.

자세한 설명

펼치기

대부분의 XML→JSON 도구가 버리는 것들을 지키는 양방향 변환기입니다. 속성, 혼합 내용, 반복되는 요소가 그것입니다. 속성은 설정 가능한 접두어가 붙은 키가 되므로 <book id="1">은 {"@id": "1"}이 되고, 속성과 나란히 있는 텍스트는 #text 키로 들어가며, 반복되는 자식 요소는 배열로 접힙니다. XML 쪽은 브라우저 자체의 DOMParser가 파싱하는데, application/xml 응답에 쓰이는 것과 같은 경로이므로 네임스페이스와 엔티티, CDATA가 여러분 페이지에서와 정확히 같게 동작합니다.

한쪽 방향에서는 본질적으로 손실이 생깁니다. 두 형식이 "문서란 무엇인가"에 대해 의견이 다르기 때문입니다. JSON에는 배열이 있고 XML에는 없어서 반복으로부터 추론합니다. 즉 JSON의 모양이 스키마가 아니라 데이터에 따라 달라집니다. <item>이 하나면 객체가 되고 둘이면 객체의 배열이 되므로, 항목 두 개짜리 표본을 보고 짠 코드는 고객이 하나만 보내는 날 깨집니다. 소비하는 쪽에 안정된 모양이 필요하다면, 입력이 계속 복수형이기를 믿는 대신 변환 후에 정규화하세요.

순서도 희생됩니다. XML은 모든 것의 순서를 보존하며, <p>Hello <b>world</b> again</p> 같은 혼합 내용에서 텍스트와 요소가 번갈아 놓인 순서까지 포함합니다. JSON 객체에는 의미 있는 순서가 없으므로 그 문장은 키만으로는 복원할 수 없습니다. 요소가 데이터를 감싸는 것이 아니라 산문 속에 들어가 있는 문서형 XML이라면, JSON 표현은 번역이 아니라 손실이 있는 요약입니다.

네임스페이스에는 더 미묘한 함정이 있습니다. x:title의 접두어는 임의적이고 그 문서 안에서만 유효하며, 어휘를 식별하는 것은 그 접두어가 묶여 있는 URI 쪽입니다. JSON으로 평탄화하면 접두어는 키 안의 텍스트로 남고 그 묶임은 사라집니다. 그래서 같은 것을 다른 접두어로 기술한 두 파일이 서로 다른 JSON을 만들어 내고, 서로 다른 어휘에 같은 접두어를 쓴 두 파일은 충돌하는 JSON을 만들어 냅니다. 만들려는 것에 네임스페이스가 중요하다면, 변환 후가 아니라 변환 전에 해석해 두세요.

자주 묻는 질문

속성에 프리픽스를 붙이는 이유는?

JSON은 속성과 자식 요소를 기본적으로 구분하지 못합니다. 프리픽스(@·_ 등 원하는 것)를 붙이면 속성이 라운드트립에서 살아남아, XML을 JSON으로 바꿨다가 다시 XML로 바꿔도 자식 요소가 아니라 속성으로 돌아옵니다. 이런 관례가 없으면 속성과 자식 요소의 이름이 충돌합니다.

혼합 콘텐츠(<p>hello <b>world</b>!</p>)는 어떻게 처리하나요?

부분적으로 처리합니다. 순수 텍스트는 문자열이 되고, 요소 자식과 함께 있는 텍스트는 자식들 옆의 { #text: '...' }로 들어갑니다. 텍스트와 요소가 번갈아 놓인 경우(hello <b>world</b>! 같은)는 #text 키에 합쳐진 텍스트로 축약되므로, 라운드트립은 되지만 원래 순서를 잃습니다. 혼합 콘텐츠가 많은 문서(HTML·DocBook)에는 전용 파서가 낫습니다.

항목이 하나인 목록이 배열이 아니라 객체가 된 이유는?

XML에는 어떤 요소가 반복된다고 말할 방법이 없기 때문입니다. 형제 태그 셋은 목록이 되고 하나는 단일 값이 되는데, 문서 안의 무엇도 한 개짜리 목록과 스칼라를 구분해주지 않습니다. 변환기는 추측할 수밖에 없어서, 평소 여러 항목을 주던 피드가 하나만 준 날 모양이 조용히 바뀝니다. 받는 쪽에서 두 형태를 모두 처리하거나, 어떤 요소가 반복 가능한지 명시한 스키마를 기준으로 변환하세요.

XML을 JSON으로 바꿨다가 되돌리면 무엇을 잃나요?

생각보다 많습니다. 네임스페이스는 접두사가 붙은 이름으로 납작해지고, 주석과 처리 지시는 사라지며, 속성과 자식 요소의 구분은 관례로만 살아남고, CDATA는 평범한 텍스트가 됩니다. 문서 순서는 배열 안에서는 유지되지만 이름이 다른 형제들 사이에서는 유지되지 않습니다. 이 변환은 데이터를 읽고 가공하는 데 쓰고, 원본대로 재현해야 하는 XML의 저장 형식으로는 쓰지 마세요.

관련 도구