XML → JSON 변환기
왼쪽에 XML을 붙여넣으면 오른쪽에 JSON으로 변환돼요. 속성은 @_ 접두사로 보존됩니다. 모든 처리는 브라우저 안에서 진행되며 업로드가 필요 없어요.
- 왼쪽 텍스트 영역에 XML을 붙여넣어 주세요.
- "JSON으로 변환" 버튼을 누르면 XML의 중첩이 JSON 객체 중첩으로 변환돼요.
- 결과를 복사하거나 data.json 파일로 다운로드할 수 있어요.
- 반복되는 자식 요소는 자동으로 배열로 묶여요.
어떤 도구인가요?
fast-xml-parser 규약을 따라 XML을 JSON 객체로 변환합니다. 자식 요소는 객체 속성이 되고, 반복되는 자식은 배열이 되며, 속성은 부모 객체 위에 `@_` 접두사로 보존돼요. 혼합 노드의 텍스트는 `#text` 키로 들어갑니다. `parseAttributeValue: true` 설정 덕분에 숫자/부울 속성 값은 자동으로 타입이 정해져요 — 예를 들어 XML의 `count="42"` 는 `"@_count": 42` 로 변환되며, 문자열 `"42"` 가 되지 않습니다.
예시
XML 입력:
<root version="1">
<name>Ada</name>
<tags>math</tags>
<tags>logic</tags>
</root> JSON 출력:
{
"root": {
"@_version": 1,
"name": "Ada",
"tags": ["math", "logic"]
}
} 자주 만나는 XML 함정과 대처법
XML에는 JSON에 없는 모서리 케이스가 많아요. 결과가 예상과 다를 때 살펴봐야 할 패턴들입니다.
- 자식이 하나일 때 vs 여러 개일 때. `<a><b/></a>` 는 `{"a":{"b":""}}` (객체 속성)이지만, `<a><b/><b/></a>` 는 `{"a":{"b":["",""]}}` (배열)이 돼요. 다운스트림 코드가 항상 배열을 기대한다면 변환 후 정규화해 주세요.
- 속성 vs 자식 요소. 속성은 자식과 같은 레벨에 `@_` 접두사로 표시돼요. `<user id="1"><name>Ada</name></user>` 는 `{"user":{"@_id":1,"name":"Ada"}}` 가 됩니다. 일부 도구는 속성을 일반 속성과 합치기도 하지만, 그건 다른 규약이에요.
- 혼합 콘텐츠 (텍스트 + 자식 요소). `<p>Hello <b>world</b></p>` 는 `{"p":{"#text":"Hello ","b":"world"}}` 가 돼요. 텍스트는 보존되지만 자식과의 순서 정보는 사라집니다 — JSON은 순서 있는 혼합 콘텐츠를 표현할 수 없어요. 설정용 XML에서는 보통 발생하지 않는 케이스입니다.
- 네임스페이스. 네임스페이스(`<x:foo xmlns:x="...">`)는 요소 이름의 일부(`x:foo`)로 보존돼요. 접두사를 제거하고 싶으면 변환 후 후처리로 처리하세요.
- CDATA 섹션. `<![CDATA[some text]]>` 는 일반 텍스트로 파싱돼서 부모의 `#text` 에 합쳐져요. CDATA 래핑 자체는 사라지므로, 의미가 있는 경우 별도로 표시해 두어야 합니다.
- 자체 닫힘 vs 빈 요소. `<x/>` 와 `<x></x>` 는 XML에서 동등하며 같은 JSON(빈 문자열 `""`)을 만들어요. 원래 표기는 JSON에서 복원할 수 없습니다.
자주 묻는 질문
왜 속성에 `@_` 접두사가 붙나요?
XML 속성과 자식 요소를 구분하기 위한 거예요. 접두사가 없으면 `<user id="1"><id>foo</id></user>` 같은 입력에서 `id` 키가 두 개가 되는데, JSON 객체는 같은 키를 가질 수 없어요. 접두사로 둘 다 왕복 변환이 가능해집니다. 필요 없으면 후처리에서 `"@_"` 를 빈 문자열로 치환하세요(충돌 위험은 감수).
루트 키 없이 JSON만 받을 수 있나요?
XML은 항상 단일 루트 요소를 가져요. 왕복 변환을 위해 JSON에도 그 래핑이 유지됩니다. 내부 객체만 필요하면 변환 후 `result.root` 로 꺼내 쓰세요.
XML 주석은 보존되나요?
아니요. JSON에는 주석 문법이 없고, 파서도 XML 주석을 무시하도록 설정돼 있어요. 주석 보존이 필요하면 주석을 표현할 수 있는 다른 중간 형식을 사용해야 해요.
속성 값도 타입이 정해지나요?
네, `parseAttributeValue: true` 설정이라서 `count="42"` 는 `"@_count": 42` (숫자), `enabled="true"` 는 `"@_enabled": true` (부울)이 돼요. 문자열로 보존하려면 후처리하거나 설정을 다르게 가져가야 합니다.
XML이 어디론가 업로드되나요?
아니요. 모든 처리는 브라우저 안에서 진행돼요. 변환 버튼을 눌러도 네트워크 요청이 발생하지 않는 것을 개발자 도구에서 직접 확인할 수 있어요.
아주 큰 XML 파일도 처리되나요?
약 30 MB 까지는 무리 없이 동작해요. 파서 자체는 선형으로 확장되지만 텍스트 영역이 병목이 돼요. 더 큰 입력은 명령줄에서 fast-xml-parser를 직접 사용하세요. 같은 라이브러리입니다.