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 에는 타입이 없으므로
true와42모두 텍스트true와42로 쓰입니다. - null —— 보통 빈/자기 닫는 요소:
<middleName/>. - 유효한 요소 이름이 아닌 키 —— 이름은 숫자로 시작할 수 없고 공백을 포함할 수 없습니다.
"1st place"는 유효한 태그가 아니라 정제(sanitize)하지 않으면 유효하지 않은 XML 이 됩니다.
이스케이프와 선언
텍스트와 속성 값은 &, <, >(속성 안에서는 " 도)을 이스케이프해야 합니다. 변환기는 출력이 완전한 문서가 되도록 XML 선언도 앞에 붙여야 합니다:
<?xml version="1.0" encoding="UTF-8"?>
<message>B & C are < 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 이 됩니다.
관련 도구와 가이드
- JSON ⇄ XML 변환기 —— 브라우저에서 양방향 변환
- XML to JSON: 속성, 텍스트 노드, 배열, 네임스페이스 —— 반대 방향
- CSV 와 XML 을 JSON 으로 변환하는 방법
- JSON 이란? —— 대상 포맷의 타입과 규칙