← 전체 글

JSON에서 XML로: 루트 요소, 배열, 속성 매핑

JSON을 XML로 변환: 루트 요소 선택, @ 접두사 키를 속성으로 매핑, 배열을 반복 요소로, 이스케이프 처리 —— JS, Python, 온라인으로.

JSON 을 XML 로 변환하는 것은 손실이 있는 매핑의 역방향 작업이며, 이는 JSON 이 강요하지 않았던 선택을 해야 한다는 뜻입니다: 루트 요소는 무엇인가? 이 키는 속성이 되어야 하는가, 자식 요소가 되어야 하는가? JSON 배열은 어떻게 반복되는 XML 태그가 되는가? 본 가이드는 JavaScript, Python, 그리고 브라우저에서 JSON to XML 의 관례 —— 루트 요소, 배열, 속성, 이스케이프 —— 를 다룹니다.

루트 요소 선택

XML 은 정확히 하나의 루트 요소를 요구하지만 JSON 에는 그런 규칙이 없습니다. 첫 결정은 모든 것을 무엇으로 감쌀지입니다. JSON 이 단일 최상위 키를 가진 객체라면 그 키가 자연스러운 루트입니다:

{ "note": { "to": "Ada", "from": "Bob" } }

<note>
  <to>Ada</to>
  <from>Bob</from>
</note>

JSON 에 여러 최상위 키가 있거나(또는 배열이면) 단일 루트가 없으므로 변환기는 모든 것을 합성 요소로 감쌉니다. 예를 들어 <root>:

{ "to": "Ada", "from": "Bob" }

<root>
  <to>Ada</to>
  <from>Bob</from>
</root>

@ 접두사 키는 속성으로

XML→JSON 관례와 왕복하기 위해, @ 로 시작하는 키는 자식 요소가 아닌 속성으로 출력되며, #text 키는 그 요소의 텍스트 콘텐츠가 됩니다:

{
  "price": { "@currency": "USD", "#text": "9.99" }
}

<price currency="USD">9.99</price>

이 관례를 쓰지 않으면 모든 값이 자식 요소가 됩니다 —— 유효하지만 더 장황합니다. 이 @/#text 관례가 XML → JSON → XML 무손실 왕복을 가능하게 합니다.

배열은 반복 요소가 됩니다

JSON 배열은 여러 값을 가진 단일 요소가 되지 않습니다 —— 같은 요소가 반복되는 형태가 됩니다. XML 이 리스트를 그렇게 표현하기 때문입니다:

{ "tags": { "tag": ["a", "b", "c"] } }

<tags>
  <tag>a</tag>
  <tag>b</tag>
  <tag>c</tag>
</tags>

미묘한 결과: 최상위 객체 배열은 루트가 될 수 없습니다(여러 루트 요소가 생깁니다). 따라서 감싸야 하며, 일반적으로 <root> 가 반복되는 <item> 요소들을 담습니다.

깔끔하게 매핑되지 않는 값

  • 불리언과 숫자 —— XML 에는 타입이 없으므로 true42 모두 텍스트 true42 로 쓰입니다.
  • null —— 보통 빈/자기 닫는 요소: <middleName/>.
  • 유효한 요소 이름이 아닌 키 —— 이름은 숫자로 시작할 수 없고 공백을 포함할 수 없습니다. "1st place" 는 유효한 태그가 아니라 정제(sanitize)하지 않으면 유효하지 않은 XML 이 됩니다.

이스케이프와 선언

텍스트와 속성 값은 &, <, >(속성 안에서는 " 도)을 이스케이프해야 합니다. 변환기는 출력이 완전한 문서가 되도록 XML 선언도 앞에 붙여야 합니다:

<?xml version="1.0" encoding="UTF-8"?>
<message>B &amp; C are &lt; D</message>

XSD 를 겨냥하거나 xmlns 를 출력

소비자가 XML 을 XSD(XML Schema)에 대해 검증한다면, 키→요소 매핑 외에 변환이 몇 가지 추가 작업을 해야 합니다:

  • 요소 순서가 중요합니다. XML 속성은(사양상) 순서가 없지만 자식 요소는 순서가 있고, 대부분의 XSD 는 xsd:sequence 로 그 순서를 강제합니다. 객체 키 순회 순서가 아니라 스키마가 기대하는 순서로 자식을 출력하세요. 그렇지 않으면 검증이 실패합니다.
  • 네임스페이스 매핑. xmlns 선언을 루트의 @xmlns 속성으로 재현하고, 접두사 붙은 이름을 XML 에 반영하세요("soap:Envelope"<soap:Envelope>). 네임스페이스를 잃는 변환기는 네임스페이스가 필요한 XSD 에서 검증되지 않는 XML 을 만듭니다.
  • 타입 인식 값. XML 에는 네이티브 타입이 없으므로 xsd:int 이나 xsd:date 가 있는 XSD 는 단지 텍스트 콘텐츠가 일치하는지 확인합니다. JSON 값을 XSD 패턴이 기대하는 텍스트(ISO 날짜, 정수 문자열 등)로 포맷하세요.

코드로 JSON 을 XML 로 변환

// JavaScript —— 작은 재귀 빌더 또는 라이브러리:
import { XMLBuilder } from 'fast-xml-parser';
const builder = new XMLBuilder({ ignoreAttributes: false, attributeNamePrefix: '@' });
const xml = builder.build(jsonObject);

# Python —— dicttoxml, 또는 xml.etree.ElementTree 로 자작
from dicttoxml import dicttoxml
xml_bytes = dicttoxml({"note": {"to": "Ada"}}, attr_type=False)

JSON 을 XML 로 온라인 변환

JSON 을 JSON ⇄ XML 변환기 에 붙여 넣고 To XML 을 클릭하세요. 합리적인 루트를 고르고 @ 키를 속성으로 매핑하고 배열을 반복 요소로 전개하며 특수 문자를 이스케이프합니다 —— 모두 브라우저에서. JSON 에 구문 오류가 있으면 먼저 수리됩니다; JSON Fix 로 사전에 정리할 수도 있습니다.

자주 묻는 질문

JSON 을 XML 로 변환하려면?

루트 요소를 하나 고르고(단일 최상위 키 또는 합성 <root>), 재귀적으로 키를 자식 요소로, @-접두사 키를 속성으로, 배열을 반복 요소로 만드세요 —— 텍스트에서 &, <, > 를 이스케이프하세요.

JSON 배열은 XML 에서 어떻게 표현되나요?

각 배열 항목은 같은 태그 이름의 별개 요소가 됩니다. XML 은 리스트를 단일 다중 값 노드가 아닌 반복 요소로 표현하기 때문입니다.

JSON 값을 XML 속성으로 만들려면?

키에 @ 접두사를 붙이세요(예: "@id"). 요소의 텍스트는 #text 아래로 넣으세요. 표준 XML→JSON 관례와 일치하므로 변환은 왕복할 수 있습니다.

JSON 키가 유효한 XML 요소 이름이 아니면?

XML 태그 이름은 숫자로 시작하거나 공백을 포함할 수 없으므로 "1st place" 같은 키는 정제(예: _1st_place)해야 하며, 그렇지 않으면 출력이 형식이 잘못된 XML 이 됩니다.

관련 도구와 가이드