XML → JSON 변환기

왼쪽에 XML을 붙여넣으면 오른쪽에 JSON으로 변환돼요. 속성은 @_ 접두사로 보존됩니다. 모든 처리는 브라우저 안에서 진행되며 업로드가 필요 없어요.

  1. 왼쪽 텍스트 영역에 XML을 붙여넣어 주세요.
  2. "JSON으로 변환" 버튼을 누르면 XML의 중첩이 JSON 객체 중첩으로 변환돼요.
  3. 결과를 복사하거나 data.json 파일로 다운로드할 수 있어요.
  4. 반복되는 자식 요소는 자동으로 배열로 묶여요.
어떤 도구인가요?

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를 직접 사용하세요. 같은 라이브러리입니다.