본문으로 건너뛰기
jsonbeautifiers
한국어

XML을 JSON으로

속성, CDATA, 엔터티를 처리하고 짝이 맞지 않는 태그를 정확히 짚어 줍니다.

XML
JSON

붙여 넣은 것은 여러분의 브라우저를 떠나지 않습니다. connect-src 허용 목록 덕분에 이는 약속이 아니라 브라우저가 강제하는 보장입니다. 직접 확인하기

XML을 JSON으로 변환합니다. 속성, CDATA 구역, 엔터티 참조를 처리하고, 잘못된 XML은 뭉뚱그리지 않고 정확하게 알려 줍니다.

XML은 JSON이 담을 수 있는 것보다 많은 구조를 지니므로, 이 방향은 정해진 방식으로 정보를 잃습니다. 여러분 문서에 해당하는 것은 전부 노트에서 알려 줍니다.

진짜 문제를 짚어 주는 오류

브라우저에는 XML 파서가 들어 있지만, 그 오류 보고는 지역화된 HTML 조각이라 안정적으로 읽어 낼 수 없습니다. 이 페이지는 자체 파서를 써서 진단 품질을 JSON 쪽과 맞춥니다.

짝이 맞지 않는 태그
닫는 태그와, 그것이 닫았어야 할 요소를 둘 다 알려 줍니다. XML은 HTML과 달리 중첩을 엄격하게 따집니다.
닫히지 않은 요소
문서가 끝났을 때 아직 열려 있던 것을 전부 나열합니다.
두 번째 루트 요소
XML 문서의 루트는 정확히 하나입니다. 파일 두 개를 이어 붙였을 때 흔히 나옵니다.
HTML 습관
checked 같은 값 없는 속성이나, 따옴표 없는 속성 값입니다. 둘 다 HTML로는 정당하고 XML로는 둘 다 부당합니다.
끝나지 않은 주석과 CDATA
그 구역이 시작된 위치에서 보고합니다.

JSON이 표현하지 못하는 것

혼합 내용
텍스트와 자식 요소를 함께 가진 요소입니다. JSON에는 텍스트를 자식들과의 순서 관계를 유지한 채 담을 방법이 없어서, 텍스트는 #text라는 키 하나로 모이고 변환이 그 사실을 알려 줍니다.
이름이 다른 요소들 사이의 순서
이름이 같은 형제들은 배열이 되어 순서를 지키지만, 이름이 다른 형제들 사이의 상대적 순서는 사라집니다. JSON 객체의 키에는 순서가 없기 때문입니다.
네임스페이스
접두사는 이름의 일부로 남고, 네임스페이스 선언 자체는 평범한 속성이 됩니다.
요소 하나 대 여럿
요소가 하나뿐인 목록은 원소 하나짜리 배열이 아니라 단일 값이 됩니다. 뒤쪽에서 생기는 버그의 고전적인 원인입니다. "항상 배열로"를 켜면 피할 수 있습니다.

타입

XML은 텍스트입니다. 추론을 켜지 않는 한 전부 문자열이고, 켜더라도 float64 왕복을 견디지 못할 값은 문자열로 남습니다. CSV 변환기와 같은 방침이고 이유도 같습니다.

How to do this in code

코드에서의 변환.

py Python
import xmltodict, json

data = xmltodict.parse(xml_text)
print(json.dumps(data, indent=2))

# force_list keeps single elements as arrays, which stops the
# classic "sometimes a list, sometimes an object" bug.
data = xmltodict.parse(xml_text, force_list={'item'})
js JavaScript
import { XMLParser } from 'fast-xml-parser';

const parser = new XMLParser({
  ignoreAttributes: false,
  attributeNamePrefix: '@',
  isArray: (name) => name === 'item',
});
const data = parser.parse(xmlText);
sh Shell
# xq, the XML front end to jq
xq . input.xml

# Or with Python, no extra install beyond xmltodict
python -c 'import sys,xmltodict,json; print(json.dumps(xmltodict.parse(sys.stdin.read()), indent=2))' < in.xml

자주 묻는 질문

제 목록 중 하나가 왜 배열이 아닌가요?
요소가 정확히 하나였기 때문입니다. 자식이 하나면 원소 하나짜리 목록과 구별할 수 없습니다. "항상 배열로"를 켜세요. 출력이 사람이 아니라 코드로 들어갈 때는 언제나 켤 값어치가 있고, 버그 한 부류를 통째로 없애 줍니다.
제 네임스페이스는 어떻게 됐나요?
접두사는 키 이름의 일부로 살아남고 xmlns 선언은 평범한 속성이 됩니다. JSON에는 네임스페이스 개념이 없어서 둘 사이의 의미적 관계는 사라집니다.
제 HTML은 왜 파싱되지 않나요?
HTML은 XML이 아니기 때문입니다. 닫히지 않은 <br>, 값 없는 속성, 따옴표 없는 값은 모두 HTML로는 정당하고 XML로는 하나도 정당하지 않습니다. HTML에는 HTML 파서가 필요하지, 이건 아닙니다.