← 모두의 툴

XML을 JSON으로 바꾸면 사라지는 것 — 혼합 콘텐츠의 순서와 공백

가이드 · 2026-08-19 최종 확인

RSS 피드나 오래된 문서형 XML을 JSON으로 바꿔봤는데 결과가 이상하게 뭉개져 나온 적이 있다면, 그건 변환기가 고장난 게 아니라 XML과 JSON이 애초에 표현할 수 있는 구조가 다르기 때문입니다. 이 가이드는 "혼합 콘텐츠(mixed content)"라는 XML 고유의 개념이 JSON으로 바뀌는 과정에서 왜, 어떻게 정보를 잃는지 구조적으로 설명합니다.

1. JSON에는 없는 개념: 혼합 콘텐츠

XML은 원래 문서 마크업 언어로 태어났기 때문에, <p>Hello <b>world</b>!</p>처럼 텍스트와 자식 태그가 한 요소 안에 순서대로 뒤섞여 있는 걸 자연스럽게 허용합니다. 이런 구조를 "혼합 콘텐츠"라고 부릅니다. 반면 JSON은 애초에 데이터 직렬화를 위해 설계된 포맷이라, 객체는 그냥 키-값 쌍의 집합일 뿐입니다. "이 텍스트 조각, 이 자식 요소, 저 텍스트 조각이 정확히 이 순서로 나란히 있다"는 개념 자체가 JSON 객체 모델에는 없습니다. 그래서 어떤 XML→JSON 변환기든, 혼합 콘텐츠를 만나면 정보를 버리는 결정을 내릴 수밖에 없습니다.

2. 이 도구는 실제로 어떻게 처리하는가

이 사이트의 XML to JSON 변환기는 요소를 재귀적으로 순회하면서, 자식 텍스트 노드를 만나면 node.nodeValue.trim()으로 앞뒤 공백을 잘라낸 뒤 기존 #text 값에 그대로 이어붙입니다. 자식 요소(태그)는 별도의 키로 따로 모읍니다. 즉 텍스트 조각들과 자식 요소가 원래 어떤 순서로 섞여 있었는지는 완전히 버려지고, 텍스트는 텍스트끼리, 태그는 태그끼리 각자 그룹으로 재조립됩니다.

실제 예시: <p>Hello <b>world</b>!</p>를 이 도구에 넣으면
{"#text":"Hello!","b":"world"}가 나옵니다.
"Hello"와 "!" 사이에 있던 공백이 사라졌고("Hello!"로 붙어버림), "world"가 원래 "Hello"와 "!" 사이에 있었다는 위치 정보도 이 JSON만 보고는 전혀 알 수 없습니다.

3. 공백이 사라지는 정확한 이유

범인은 trim()을 텍스트 노드 단위로 개별 호출한다는 점입니다. XML 파서는 <p>Hello <b>world</b>!</p>를 세 개의 자식 노드로 쪼갭니다 — 텍스트 노드 "Hello "(뒤에 공백 포함), 요소 노드 <b>world</b>, 텍스트 노드 "!". 변환기는 각 텍스트 노드를 따로 trim()하기 때문에 "Hello "의 끝공백이 잘려 "Hello"가 되고, 이 값이 뒤에 오는 "!" 노드와 사이 공백 없이 그대로 이어붙습니다. 순수 데이터용 XML(설정 파일, API 응답)에서는 태그 사이 공백이 그저 들여쓰기용 서식이라 지워도 무해하지만, 문서형 XML에서는 그 공백이 실제로 읽었을 때 단어 사이를 띄우는 의미를 갖고 있어서, 지워버리면 내용이 왜곡됩니다.

4. 이 문제가 특히 눈에 띄는 XML 종류

RSS/Atom 피드의 <description> 필드처럼 텍스트 안에 HTML 태그가 섞여 들어간 경우, SVG의 텍스트 요소, DocBook 같은 문서형 마크업에서 이 현상이 두드러집니다. 반대로 설정 파일이나 API 응답처럼 각 요소가 순수 텍스트만 담거나 자식 요소만 담고 절대 섞이지 않는 "데이터형" XML이라면, 애초에 혼합 콘텐츠 자체가 발생하지 않으므로 이 문제와 무관합니다.

5. 실무 가이드

자주 묻는 질문

Q. 혼합 콘텐츠가 아닌 일반 XML도 이 문제가 생기나요?

A. 아니요. 요소가 텍스트만 담거나 자식 요소만 담고 절대 섞이지 않는 "순수 콘텐츠" 구조라면 텍스트 조각이 하나뿐이므로 순서·공백 손실 문제 자체가 발생하지 않습니다. 이 문제는 오직 한 요소 안에 텍스트와 자식 태그가 번갈아 나타날 때만 생깁니다.

Q. CDATA 섹션도 같은 문제를 겪나요?

A. 네. CDATA 내용도 일반 텍스트와 동일하게 #text로 추출되므로, 혼합 콘텐츠 안에 CDATA가 섞여 있으면 위와 똑같은 순서·공백 손실이 그대로 적용됩니다.

Q. 이 손실을 막을 방법은 없나요?

A. 완전히 막으려면 변환기가 각 자식 노드에 순서 인덱스를 부여하고 텍스트 노드를 trim하지 않는 식으로 재설계해야 하는데, 이렇게 하면 출력 JSON 구조가 훨씬 복잡해지고(배열 기반의 순서 있는 노드 리스트 등) 일반적인 "간단한 JSON"의 편의성을 잃게 됩니다. 대부분의 경량 변환기는 실용성을 위해 이 손실을 감수하는 쪽을 택합니다.

Q. 반대로 JSON→XML 변환은 이 문제가 없나요?

A. JSON→XML은 애초에 JSON에 혼합 콘텐츠 개념이 없어서 이 특정 손실은 발생하지 않지만, 대신 배열 표현 방식이나 null 처리 등 다른 종류의 구조적 한계가 있습니다. 자세한 내용은 JSON→XML 변환 가이드를 참고하세요.