ToolDeck

XML to JSON 변환기

XML을 JSON 형식으로 변환

예시 시도

XML 입력

JSON 출력

로컬에서 실행 · 시크릿 붙여넣기 안전
JSON이 여기에 표시됩니다…

XML to JSON 변환이란?

XML to JSON 변환은 확장 가능한 마크업 언어(XML)의 데이터를 JavaScript Object Notation(JSON)으로 변환하는 과정입니다. 두 형식 모두 구조화된 계층적 데이터를 표현하지만, 서로 다른 문법과 데이터 모델을 사용합니다. XML은 선택적 속성이 있는 여는 태그와 닫는 태그를 사용하고, JSON은 키-값 쌍, 배열, 기본 타입을 사용합니다. XML을 JSON으로 변환하면 JavaScript 런타임, REST API, NoSQL 데이터베이스처럼 JSON이 기본 형식인 환경에서 XML 데이터를 사용할 수 있습니다.

변환이 항상 일대일로 이루어지는 것은 아닙니다. XML에는 JSON에 직접적으로 대응하는 것이 없는 구성 요소가 있습니다: 속성, 혼합 콘텐츠(텍스트와 자식 요소가 혼재), 처리 지시문, 주석, CDATA 섹션, 네임스페이스 선언이 그것입니다. 변환 라이브러리마다 이러한 구성 요소를 다르게 처리하기 때문에 여러 관례가 존재합니다. 가장 일반적인 방식은 속성 이름에 @를 접두사로 붙이고, 같은 요소에 속성이 있을 때 텍스트 콘텐츠를 #text 필드에 넣는 것입니다.

XML to JSON 변환은 SOAP에서 REST로 마이그레이션하거나, 레거시 엔터프라이즈 API를 사용하거나, XML을 필수로 하는 정부 및 금융 데이터 피드를 처리할 때 흔히 사용됩니다. 생산자와 소비자를 동시에 재작성하는 대신, 경계 레이어에서 XML 페이로드를 변환하고 JSON을 하위로 전달합니다. AWS API Gateway, Apache Camel, MuleSoft 모두 이 패턴을 기본으로 지원합니다.

XML input
<bookstore>
  <book category="fiction">
    <title lang="en">The Great Gatsby</title>
    <author>F. Scott Fitzgerald</author>
    <year>1925</year>
    <price>10.99</price>
  </book>
  <book category="non-fiction">
    <title lang="en">Sapiens</title>
    <author>Yuval Noah Harari</author>
    <year>2011</year>
    <price>14.99</price>
  </book>
</bookstore>
JSON output
{
  "bookstore": {
    "book": [
      {
        "@category": "fiction",
        "title": {
          "@lang": "en",
          "#text": "The Great Gatsby"
        },
        "author": "F. Scott Fitzgerald",
        "year": "1925",
        "price": "10.99"
      },
      {
        "@category": "non-fiction",
        "title": {
          "@lang": "en",
          "#text": "Sapiens"
        },
        "author": "Yuval Noah Harari",
        "year": "2011",
        "price": "14.99"
      }
    ]
  }
}

온라인 XML to JSON 변환기를 사용하는 이유

일회성 변환 스크립트를 작성하는 것은 시간이 걸립니다. 특히 XML에 JSON 배열이 되어야 할 속성, 네임스페이스, 반복 요소가 포함된 경우에는 더욱 그렇습니다. 브라우저 기반 변환기는 몇 초 만에 JSON 출력을 제공하므로 구조를 확인하고 바로 작업을 계속할 수 있습니다.

즉시 변환
XML을 붙여넣으면 즉시 JSON 출력을 얻습니다. 라이브러리 설치, 스크립트 작성, 빌드 도구 설정이 필요 없습니다.
🔒
개인정보 보호 우선 처리
모든 변환은 JavaScript를 사용하여 브라우저에서 실행됩니다. XML 데이터가 기기를 벗어나지 않으며 어떤 서버에도 업로드되지 않습니다.
🔀
속성 및 배열 처리
속성은 @ 접두사 키에 매핑됩니다. 반복되는 형제 요소는 Parker 또는 BadgerFish 관례에 따라 자동으로 JSON 배열로 그룹화됩니다.
📋
계정 불필요
페이지를 열고, XML을 붙여넣고, JSON 결과를 복사하세요. 회원가입, API 키, 사용량 제한이 없습니다.

XML to JSON 활용 사례

프론트엔드 개발
XML API 응답을 JSON으로 변환하여 클라이언트 번들에 XML 파싱 라이브러리를 추가하지 않고도 React, Vue, Angular 컴포넌트에서 데이터를 렌더링할 수 있습니다.
백엔드 엔지니어링
SOAP 페이로드, RSS/Atom 피드, XML-RPC 응답을 API 게이트웨이 레이어에서 JSON으로 변환한 뒤, JSON 입력을 기대하는 마이크로서비스에 데이터를 전달합니다.
DevOps 및 CI/CD
XML 테스트 보고서(JUnit, NUnit, xUnit)를 JSON으로 변환하여 대시보드, Slack 봇, 맞춤형 CI 알림 파이프라인에서 사용합니다.
QA 및 테스트
변환된 JSON 스냅샷을 예상 출력과 비교하여 XML 생성 서비스의 응답 구조가 릴리스 간에 변경되지 않았음을 확인합니다.
데이터 엔지니어링
정부 포털, 금융 피드(FIX, FIXML), 의료 시스템(HL7 CDA)의 XML 내보내기를 JSON으로 변환하여 BigQuery, Snowflake, Elasticsearch에 로드합니다.
데이터 형식 학습
데이터 교환을 학습하는 학생들이 XML 샘플을 변환기에 붙여넣어 요소, 속성, 중첩이 JSON 키, 객체, 배열에 어떻게 매핑되는지 직접 확인할 수 있습니다.

XML to JSON 매핑 참조

XML과 JSON은 서로 다른 데이터 모델을 가집니다. 아래 표는 가장 일반적인 관례(속성에는 @, 속성과 함께 있는 텍스트에는 #text)에 따라 각 XML 구성 요소가 JSON으로 어떻게 매핑되는지 보여줍니다. 혼합 콘텐츠나 주석 같은 일부 구성 요소는 표준 JSON 표현이 없습니다.

XML 구성 요소XML 예시JSON 동등값
Element<name>text</name>"name": "text"
Nested elements<a><b>1</b></a>"a": { "b": "1" }
Attributes<el attr="v"/>"el": { "@attr": "v" }
Text + attributes<el a="1">text</el>"el": { "@a": "1", "#text": "text" }
Repeated elements<r><i>1</i><i>2</i></r>"r": { "i": ["1", "2"] }
Mixed content<p>A <b>B</b> C</p>Varies by convention
CDATA<![CDATA[raw]]>"#cdata": "raw" or flattened
Namespacesxmlns:prefix="uri"Prefix preserved or stripped
Empty element<el/>"el": null or ""
Comments<!-- note -->Discarded (no JSON equivalent)

XML to JSON 관례 비교

XML이 JSON으로 매핑되는 방식을 규정하는 단일 표준은 없습니다. 세 가지 관례가 널리 사용되며, 각각 속성 처리, 배열 감지, 텍스트 보존에서 서로 다른 장단점이 있습니다.

BadgerFish
모든 텍스트 노드는 $ 키에 들어갑니다. 속성에는 @ 접두사 키가 붙습니다. 네임스페이스는 @xmlns 항목으로 보존됩니다. 장황하지만 무손실입니다: 데이터 손실 없이 XML로 역변환이 가능합니다.
Parker
속성을 완전히 제거하고 텍스트 전용 요소를 순수 값으로 변환합니다. 반복 요소는 배열이 됩니다. 간결하고 깔끔하지만 파괴적입니다: 속성과 네임스페이스 정보가 폐기됩니다.
GData (Google Data)
텍스트 콘텐츠에 $t를 사용하고 속성을 접두사 없이 최상위 키로 보존합니다. BadgerFish의 장황함과 Parker의 간결함 사이의 절충안입니다. 과거 Google API에서 사용되었습니다.

코드 예제

아래는 JavaScript, Python, Go, 명령줄에서 XML을 JSON으로 변환하는 실제 예제입니다. 각 예제는 중첩 요소와 반복되는 형제 태그를 처리합니다.

JavaScript (browser)
// Using the DOMParser API to walk XML and build a JSON object
function xmlToJson(xml) {
  const parser = new DOMParser()
  const doc = parser.parseFromString(xml, 'application/xml')

  function nodeToObj(node) {
    const obj = {}
    // Handle attributes
    if (node.attributes) {
      for (const attr of node.attributes) {
        obj['@' + attr.name] = attr.value
      }
    }
    // Handle child nodes
    for (const child of node.childNodes) {
      if (child.nodeType === 3) { // text
        const text = child.textContent.trim()
        if (text) obj['#text'] = text
      } else if (child.nodeType === 1) { // element
        const key = child.nodeName
        const val = nodeToObj(child)
        if (obj[key]) {
          if (!Array.isArray(obj[key])) obj[key] = [obj[key]]
          obj[key].push(val)
        } else {
          obj[key] = val
        }
      }
    }
    // Simplify text-only nodes
    const keys = Object.keys(obj)
    if (keys.length === 1 && keys[0] === '#text') return obj['#text']
    return obj
  }

  return nodeToObj(doc.documentElement)
}

const xml = '<user><name>Alice</name><role>admin</role></user>'
console.log(JSON.stringify(xmlToJson(xml), null, 2))
// → { "name": "Alice", "role": "admin" }
Python
import xmltodict
import json

xml = """
<user>
  <name>Alice</name>
  <roles>
    <role>admin</role>
    <role>editor</role>
  </roles>
</user>
"""

# xmltodict converts XML to an OrderedDict
result = xmltodict.parse(xml)
print(json.dumps(result, indent=2))
# → {
# →   "user": {
# →     "name": "Alice",
# →     "roles": { "role": ["admin", "editor"] }
# →   }
# → }

# With the standard library (xml.etree.ElementTree)
import xml.etree.ElementTree as ET

def etree_to_dict(elem):
    d = {}
    if elem.attrib:
        d.update({f"@{k}": v for k, v in elem.attrib.items()})
    for child in elem:
        child_data = etree_to_dict(child)
        if child.tag in d:
            if not isinstance(d[child.tag], list):
                d[child.tag] = [d[child.tag]]
            d[child.tag].append(child_data)
        else:
            d[child.tag] = child_data
    if elem.text and elem.text.strip():
        if d:
            d["#text"] = elem.text.strip()
        else:
            return elem.text.strip()
    return d

root = ET.fromstring(xml)
print(json.dumps(etree_to_dict(root), indent=2))
Go
package main

import (
    "encoding/json"
    "encoding/xml"
    "fmt"
    "strings"
)

// For simple, known schemas — define a struct
type User struct {
    XMLName xml.Name `xml:"user"`
    Name    string   `xml:"name"`
    Roles   []string `xml:"roles>role"`
}

func main() {
    data := `<user><name>Alice</name><roles><role>admin</role><role>editor</role></roles></user>`
    var user User
    xml.NewDecoder(strings.NewReader(data)).Decode(&user)

    out, _ := json.MarshalIndent(user, "", "  ")
    fmt.Println(string(out))
    // → { "Name": "Alice", "Roles": ["admin", "editor"] }
}
CLI (xmllint + jq / yq)
# Using xq (part of yq, a jq wrapper for XML)
# Install: pip install yq  OR  brew install yq
echo '<user><name>Alice</name></user>' | xq .
# → { "user": { "name": "Alice" } }

# Using xmlstarlet + jq
xmlstarlet sel -t -v '//name' input.xml | jq -R '{ name: . }'

# Node.js one-liner with xml2js
echo '<a><b>1</b></a>' | node -e "
  const {parseString} = require('xml2js');
  let d=''; process.stdin.on('data',c=>d+=c);
  process.stdin.on('end',()=>parseString(d,(e,r)=>console.log(JSON.stringify(r,null,2))))
"

자주 묻는 질문

XML to JSON 변환은 무손실인가요?
항상 그렇지는 않습니다. XML 속성, 주석, 처리 지시문, 네임스페이스 선언은 JSON에 직접적으로 대응하는 것이 없습니다. 대부분의 변환기는 @ 접두사 관례를 사용하여 속성을 보존하지만, 주석과 처리 지시문은 폐기됩니다. 완전히 역변환 가능한 방식이 필요하다면 BadgerFish와 같은 무손실 관례를 사용하세요.
XML 속성은 JSON에서 어떻게 표현되나요?
가장 일반적인 방식은 속성 이름에 @를 접두사로 붙이는 것입니다. 예를 들어 <book id="1">은 {"@id": "1"}이 됩니다. 일부 변환기는 대신 중첩된 "_attributes" 객체를 사용합니다. 구체적인 관례는 사용하는 라이브러리에 따라 다릅니다.
반복되는 XML 요소는 어떻게 처리되나요?
같은 부모 아래 요소가 두 번 이상 나타나면 변환기가 이를 JSON 배열로 그룹화합니다. 예를 들어 두 개의 item 형제 요소는 {"item": ["a", "b"]}가 됩니다. 강제 배열 모드가 활성화되지 않은 한 단일 item 요소는 순수 문자열 값으로 유지됩니다.
JSON을 다시 XML로 변환할 수 있나요?
네, 하지만 결과는 원래 변환 시 사용된 관례에 따라 달라집니다. 속성이 @ 접두사와 함께 보존된 경우 JSON to XML 변환기가 이를 복원할 수 있습니다. 원래 변환에서 Parker(속성 제거)를 사용했다면 해당 정보는 사라집니다. ToolDeck에는 역방향 변환을 위한 JSON to XML 도구도 있습니다.
변환 중 XML 네임스페이스는 어떻게 처리되나요?
네임스페이스 처리는 라이브러리마다 다릅니다. 일부 변환기는 키 이름에 접두사를 보존하고(예: "ns:element"), 다른 것들은 xmlns 선언을 별도 필드에 매핑하며, 일부는 네임스페이스를 완전히 제거합니다. 특정 XML의 네임스페이스 동작을 확인하려면 출력 결과를 확인하세요.
XML to JSON 변환에 표준이 있나요?
공식 W3C 또는 IETF 표준은 없습니다. 가장 가까운 참조는 BadgerFish 관례, Parker 관례, OASIS XSLT-to-JSON 매핑입니다. 실제로 각 라이브러리가 자체 규칙을 구현하기 때문에, 같은 XML이 도구마다 약간 다른 JSON을 생성할 수 있습니다.
큰 XML 파일은 어떻게 처리하나요?
브라우저 기반 변환기는 수 메가바이트 크기의 파일에 잘 작동합니다. 더 큰 파일(10MB 이상)의 경우 Python의 iterparse(xml.etree.ElementTree)나 Node.js의 xml-stream 같은 스트리밍 파서를 사용하세요. 이들은 전체 트리를 메모리에 로드하지 않고 문서를 점진적으로 처리합니다.