XML to JSON 변환기
XML을 붙여넣으면 즉시 JSON으로 변환됩니다. 속성을 @_ 키로 변환하고 반복 요소를 배열로 처리합니다. 100% 브라우저 내 처리, 업로드 없음, 회원가입 불필요.
옵션 · 2칸 · XML → JSON
XML-to-JSON 변환이란 무엇이며 어떻게 작동하나요?
XML(Extensible Markup Language)과 JSON(JavaScript Object Notation)은 모두 구조화된 데이터 형식이지만 근본적으로 다른 모델을 가집니다: XML은 속성과 혼합 내용(자식 요소와 텍스트가 혼합된)을 가진 요소의 트리이고, JSON은 객체, 배열, 문자열, 숫자, 불리언, null 값의 트리입니다. 두 형식 사이를 변환하려면 불일치를 해소하기 위한 관례가 필요합니다.
이 도구는 fast-xml-parser(Node.js), xmltodict(Python), JAXB(Java) 같은 인기 라이브러리에서 사용하는 것과 동일한 가장 널리 채택된 관례를 사용합니다:
**1. 속성 → @_ 접두사.** XML 속성에는 직접적인 JSON 대응물이 없습니다. 관례는 @_ 접두사가 붙은 키로 표현하는 것입니다. 따라서
**2. 속성이 있는 요소의 텍스트 내용 → #text.** 요소에 속성과 텍스트 내용이 모두 있는 경우 —
**3. 반복 형제 요소 → 배열.** XML은 같은 이름을 가진 여러 자식 요소를 허용하지만 JSON 객체는 중복 키를 가질 수 없습니다. 해결 방법은 같은 이름의 형제를 배열로 수집하는 것입니다. 하나의
**4. 타입 강제 변환 없음 — 모든 값이 문자열로 유지.** XML에는 텍스트 내용에 대한 고유 타입 시스템이 없습니다. XML의 "123" 값은 문자열입니다. JSON 숫자 123으로 변환하려면 작성자의 의도에 대한 가정이 필요합니다 — 우편번호("01234" → 1234), 전화번호, 패딩된 식별자, 정밀도에 민감한 소수 문자열에 대해 틀린 가정입니다. 이 도구는 모든 값을 문자열로 보존합니다. 타입을 알고 있는 필드에 대해 직접 코드에서 타입 강제 변환을 적용하세요.
**5. 주석, 처리 명령어, 네임스페이스에 대해 손실됨.** XML은 JSON에 없는 기능을 지원합니다: 주석(), 처리 명령어(), 네임스페이스 의미론. 이것들은 변환 중에 버려지거나 근사화됩니다. 무손실 XML 작업 — 재포맷팅, 최소화, 유효성 검사 — 에는 XML 포맷터를 사용하세요. 역방향 변환 — JSON에서 XML 생성 — 에는 JSON to XML 변환기를 사용하세요.
**왜 XML을 JSON으로 변환하나요?** JSON은 JavaScript의 네이티브 형식이며 REST API의 기본 교환 형식입니다. 레거시 SOAP 서비스, RSS 피드, 사이트맵, 기업 시스템에서 XML을 받는 경우 JSON으로 변환하면 표준 JavaScript 객체 접근, JSON 경로 쿼리, JSON 인식 데이터베이스나 API를 사용하여 데이터를 처리할 수 있습니다. 변환은 단방향 브리지입니다: 현대 스택에서 XML 데이터를 소비하는 데 유용하지만 XML 문서를 보존하거나 왕복 변환하기 위한 것은 아닙니다.
// Convert XML to JSON in Node.js using fast-xml-parser
import { XMLParser } from 'fast-xml-parser';
const xml = `<catalog>
<product id="P01">
<name>Wireless Headphones</name>
<price currency="USD">79.99</price>
</product>
</catalog>`;
const parser = new XMLParser({
ignoreAttributes: false, // preserve attributes
attributeNamePrefix: '@_', // @_ prefix for attributes
textNodeName: '#text', // #text for mixed element content
parseAttributeValue: false, // no type coercion on attributes
parseTagValue: false, // no type coercion on element text
});
const result = parser.parse(xml);
console.log(JSON.stringify(result, null, 2));
// {
// "catalog": {
// "product": {
// "@_id": "P01",
// "name": "Wireless Headphones",
// "price": {
// "@_currency": "USD",
// "#text": "79.99"
// }
// }
// }
// } 주요 기능
실시간 변환
XML을 입력하거나 붙여넣으면 JSON 출력이 즉시 업데이트됩니다 — 변환 버튼이 필요 없습니다. 대용량 입력(>200KB)은 자동으로 수동 모드로 전환하여 브라우저 응답성을 유지합니다.
@_ 속성 접두사 관례
XML 속성은 @_ 접두사가 붙은 JSON 키가 됩니다. fast-xml-parser와 xmltodict 관례를 따릅니다.
반복 요소 배열 자동 감지
같은 이름의 형제 요소는 자동으로 JSON 배열이 됩니다. 하나의
타입 강제 변환 없음 — 값이 문자열로 유지
모든 XML 값은 JSON 문자열로 보존됩니다. 선행 영, 전화번호, 패딩 코드, "true"나 "false" 같은 불리언처럼 보이는 문자열은 절대 자동으로 숫자나 불리언으로 변환되지 않습니다.
100% 브라우저 기반 개인 정보 보호
모든 변환은 JavaScript를 사용하여 브라우저에서 로컬로 실행됩니다. 자격 증명, 내부 설정, 민감한 페이로드를 포함한 XML은 어떤 서버로도 전송되지 않고, 기록되지 않으며, 저장되지 않습니다.
형식 오류 보고
XML이 올바른 형식이 아닌 경우 도구가 첫 번째 오류의 정확한 줄 번호와 열 번호를 보고하여 변환 전에 문제를 즉시 찾아 수정할 수 있습니다.
예시
설정 파일
<?xml version="1.0" encoding="UTF-8"?>
<appConfig version="2.1" env="production">
<database>
<host>db.example.com</host>
<port>5432</port>
<name>myapp_prod</name>
<pool max="10" min="2"/>
</database>
<cache enabled="true">
<ttl>3600</ttl>
<driver>redis</driver>
</cache>
</appConfig> 속성과 중첩 요소가 있는 소규모 애플리케이션 설정입니다. 속성은 JSON 출력에서 @_ 접두사가 붙은 키로 변환됩니다: version="2.1"은 appConfig 아래에서 "@_version": "2.1"이 되고, pool 요소의 max와 min 속성은 "@_max": "10"과 "@_min": "2"가 됩니다. port와 ttl을 포함한 모든 값은 변환기가 타입 강제 변환을 수행하지 않으므로 문자열로 유지됩니다.
사이트맵 조각
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://go-tools.org/tools/xml-to-json</loc>
<lastmod>2026-05-29</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://go-tools.org/tools/json-to-xml</loc>
<lastmod>2026-05-29</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
</urlset> 두 개의 URL이 포함된 sitemap.xml 조각입니다.
RSS 항목
<item> <title>XML to JSON: A Practical Guide</title> <link>https://go-tools.org/blog/xml-to-json-guide</link> <pubDate>Thu, 29 May 2026 00:00:00 GMT</pubDate> <category>Developer Tools</category> <description>Learn how XML attributes map to @_ keys, how repeated elements become arrays, and why values stay strings in any XML-to-JSON conversion.</description> <guid isPermaLink="true">https://go-tools.org/blog/xml-to-json-guide</guid> </item>
RSS 2.0 item 요소입니다. guid 요소에 isPermaLink 속성이 있으므로 JSON 출력의 guid는 "@_isPermaLink": "true"와 "#text": "https://go-tools.org/blog/xml-to-json-guide"를 가진 객체가 됩니다 — 속성과 요소의 텍스트 내용이 형제 키로 공존합니다. 다른 모든 요소는 텍스트 내용만 있으며 문자열 값으로 직접 변환됩니다.
사용 방법
- 1
XML 붙여넣기
위 입력 필드에 XML을 입력하거나 붙여넣으세요. '예시 불러오기'를 클릭하여 샘플을 사용해 볼 수도 있습니다 — 설정 파일, 사이트맵 조각, RSS 항목.
- 2
실시간 JSON 출력 확인
JSON이 즉시 출력 패널에 표시됩니다. 속성은 @_ 접두사가 붙은 키가 되고, 혼합 요소의 텍스트 내용은 #text가 되며, 반복 형제 요소는 배열이 됩니다. 필요에 따라 들여쓰기(2칸 또는 4칸)를 조정하세요.
- 3
복사 또는 다운로드
복사를 클릭하여 JSON을 클립보드에 저장하거나 다운로드를 클릭하여 애플리케이션, API, 데이터 파이프라인에 사용할 준비가 된 .json 파일로 저장하세요.
일반적인 변환 함정
값이 문자열로 유지된다는 사실 망각
변환기는 타입 강제 변환을 수행하지 않습니다. 다운스트림 코드에서 JSON 숫자를 예상하지만 XML에 숫자 문자열이 포함된 경우 변환 후 명시적으로 강제 변환해야 합니다. 암묵적인 문자열-숫자 강제 변환(JavaScript의 == 또는 산술 연산자)에 의존하는 것은 오류가 발생하기 쉽습니다 — 항상 parseInt(), parseFloat(), 또는 Number()를 의도적으로 사용하세요.
// XML: <timeout>30</timeout>
// JSON output: { "timeout": "30" } ← string, not number
// Dangerous: comparing as-is
if (config.timeout > 25) { ... } // "30" > 25 coerces, but fragile // XML: <timeout>30</timeout>
// JSON output: { "timeout": "30" }
// Safe: explicit coercion where you know the type
if (parseInt(config.timeout, 10) > 25) { ... } 단일 항목 대 배열 형태 불일치
// XML with one item: <root><item>a</item></root>
// JSON: { "root": { "item": "a" } } ← string, not array
result.root.item.forEach(i => console.log(i)); // TypeError: not a function // Normalize to array regardless of count const items = [].concat(result.root?.item ?? []); items.forEach(i => console.log(i)); // safe for 0, 1, or many
혼합 내용: 텍스트와 #text 키
요소에 속성과 텍스트 내용이 모두 있으면 텍스트는 #text 아래에 저장됩니다. 텍스트 값에 일반 문자열인 것처럼 접근하면 대신 객체가 반환됩니다. 속성이 가능할 때 요소 값이 문자열인지 #text 키가 있는 객체인지 항상 확인하세요.
// XML: <price currency="USD">29.99</price>
// JSON: { "price": { "@_currency": "USD", "#text": "29.99" } }
const amount = result.price; // { "@_currency": "USD", "#text": "29.99" }, not "29.99" // Handle both plain string and @_/#text object const raw = result.price; const amount = typeof raw === 'object' ? raw['#text'] : raw; // "29.99"
올바른 형식이 아닌 XML 입력
변환기는 올바른 형식의 XML을 요구합니다. 형식 오류의 일반적인 원인: 텍스트 내용에서 이스케이프되지 않은 &(대신 & 사용), 태그 불일치(
<!-- Unescaped & — well-formedness error --> <query>name = 'Alice' & role = 'admin'</query>
<!-- Escaped & — valid XML --> <query>name = 'Alice' & role = 'admin'</query>
강제 변환으로 인한 선행 영 값 손상
이 도구는 타입 강제 변환을 수행하지 않으므로 선행 영이 보존됩니다. 강제 변환을 수행하는 라이브러리(일부 JSON 스키마 검사기, ORM 매퍼)로 JSON을 후처리하면 선행 영이 손실될 수 있습니다. 스키마에서 항상 필드 타입을 명시적으로 문자열로 선언하세요.
// XML: <zipCode>01234</zipCode>
// This tool outputs: { "zipCode": "01234" } ← correct
// But if a downstream schema coerces:
// { zipCode: z.number() } → 1234 ← leading zero lost // Declare ZIP codes and other padded identifiers as strings
// { zipCode: z.string() } → "01234" ← correct 주요 사용 사례
- SOAP / 레거시 XML API 소비
- 은행, 보험, 물류 등의 레거시 기업 서비스는 XML을 반환하는 SOAP API를 노출하는 경우가 많습니다. 응답을 JSON으로 변환하여 현대 JavaScript 도구로 데이터를 처리하거나 문서 데이터베이스에 저장하거나 REST API 소비자에게 전달하세요.
- RSS 및 Atom 피드 처리
- RSS 2.0과 Atom 1.0 피드는 XML입니다. 피드 XML을 JSON으로 변환하여 XML 파싱 라이브러리 의존성 없이 피드 집계기, 콘텐츠 파이프라인, 알림 시스템에서 제목, 링크, 발행일, 설명을 추출하세요.
- 사이트맵 파일 파싱
- sitemap.xml 파일은 메타데이터와 함께 사이트의 URL을 열거합니다. 사이트맵을 JSON으로 변환하여 URL 커버리지를 분석하고, 크롤링 큐를 생성하고, 환경 간 사이트맵을 비교하거나 링크 검사기나 SEO 감사 도구에 URL을 공급하세요.
- 설정 파일 변환
- 많은 기업 시스템(Spring, Maven, Ant, JBoss, Tomcat)은 XML 설정 파일을 사용합니다. 분석, 마이그레이션 스크립팅, 문서 생성 또는 JSON을 네이티브로 지원하는 도구로 가져오기 위해 JSON으로 변환하세요.
- 모바일 및 Android 개발
- Android 리소스, 레이아웃 파일, AndroidManifest.xml은 모두 XML입니다. 분석 스크립트, 자동화된 감사, 또는 선언된 권한, 액티비티, 리소스 값에 대한 문서 생성을 위해 JSON으로 변환하세요.
- 데이터 마이그레이션 및 ETL
- 기업 시스템(ERP, CRM, 급여)에서의 데이터 내보내기는 종종 XML로 도착합니다. JSON으로 변환하여 MongoDB, Firestore, REST API 같은 JSON 네이티브 데이터 저장소에 데이터를 로드하는 ETL 파이프라인의 첫 번째 단계로 사용하세요.
기술 세부 정보
- XML 파싱을 위한 브라우저 DOMParser
- XML 입력은 브라우저의 네이티브 DOMParser에 'text/xml' MIME 타입을 사용하여 파싱됩니다 — SVG와 XHTML을 렌더링하는 데 사용되는 동일한 엔진입니다. 완전히 XML 1.0 규격을 준수하며 줄 및 열 정보와 함께 형식 오류를 보고합니다. 이 접근 방식은 서드파티 의존성 없이 네임스페이스, CDATA 섹션, 처리 명령어, 엔티티 참조를 올바르게 처리합니다.
- 재귀적 DOM-to-JSON 직렬화
- 파싱 후 도구가 DOM 트리를 재귀적으로 탐색합니다. 요소 노드는 JSON 객체가 되고, 속성은 @_ 접두사가 붙은 키가 되며, 텍스트만 있는 요소는 일반 문자열 값이 되고, 속성과 텍스트 내용이 모두 있는 요소는 텍스트 내용을 위해 #text 키를 갖습니다. 같은 이름의 형제 요소는 수집되어 JSON 배열로 출력됩니다. 요소 사이의 공백만 포함하는 텍스트 노드는 버려집니다.
- 타입 강제 변환 없음 — 문자열 보존
- 모든 속성 값과 텍스트 내용은 JSON 출력에 문자열로 작성됩니다. parseInt, parseFloat, 불리언 파싱이 적용되지 않습니다. 이는 선행 영 값, 정밀도에 민감한 소수, 불리언처럼 보이는 문자열에 대한 자동 데이터 손상을 방지하기 위한 의도적인 설계 선택입니다. 필요한 경우 타입 강제 변환은 다운스트림 코드에서 명시적으로 적용해야 합니다.
- 100% 브라우저 기반 — 업로드 없음, 서버 없음
- 모든 처리가 브라우저의 JavaScript 엔진에서 실행됩니다. 어떤 시점에서도 네트워크를 통해 데이터가 전송되지 않습니다. 200KB보다 큰 입력은 자동으로 실시간 모드에서 수동 모드(명시적인 변환 클릭 필요)로 전환되어 브라우저 응답성을 유지하고 무거운 DOM 탐색 중 메인 스레드 블로킹을 방지합니다.
모범 사례
- 먼저 XML 형식 일치성 유효성 검사
- XML 소스가 직접 작성되었거나 가끔 잘못된 형식의 출력을 생성하는 시스템에서 온 경우 변환 전에 유효성을 검사하세요. XML 포맷터의 유효성 검사 버튼을 사용하여 XML이 올바른 형식인지 확인하고 문제에 대한 정확한 오류 위치를 얻으세요.
- 일대다 필드를 배열로 정규화
- XML 스키마가 같은 이름의 자식 요소를 하나 또는 여러 개 허용하면 JSON 출력은 하나의 요소에 대해 객체가 되고 여러 요소에 대해 배열이 됩니다. 소비 코드에서 항상 이 필드들을 정규화하세요: const items = [].concat(result.items ?? []) — 이는 0, 1, 또는 여러 항목에 안전하며 TypeError를 방지합니다.
- 명시적이고 선택적으로 타입 강제 변환 적용
- 이 도구는 모든 값을 문자열로 보존하므로, 필요한 특정 필드에 대해 코드에서 의도적으로 타입 강제 변환을 적용하세요. 알려진 정수 필드에 parseInt(val, 10)을 사용하는 것은 안전합니다. Number(val)로 광범위하게 강제 변환을 적용하면 선행 영 값, 빈 문자열, 정밀도에 민감한 소수를 손상시킬 위험이 있습니다.
- 요소 값 접근 시 #text 확인
- 요소가 일부 페이로드에서 속성을 가질 수 있고 다른 경우에는 없을 수 있다면, JSON 값은 일반 문자열(속성 없음) 또는 @_ 키와 #text 키가 있는 객체(속성 있음)가 됩니다. 강건한 접근자를 작성하세요: const val = typeof node === 'object' ? node['#text'] : node. 이 패턴은 두 형태를 모두 처리하고 자동 undefined 값을 방지합니다.
- 무손실 XML 작업에는 XML 포맷터 사용
- XML-to-JSON 변환은 주석, 처리 명령어, 네임스페이스 의미론을 버립니다. 모든 XML 내용을 정확히 보존해야 한다면 XML 포맷터를 사용하여 데이터 손실 없이 정리, 최소화, 유효성 검사를 수행하세요. JSON 네이티브 컨텍스트에서 데이터를 처리해야 할 때만 JSON으로 변환하세요.
자주 묻는 질문
이 도구 사용 시 XML 데이터가 서버로 전송되나요?
XML 속성은 JSON 출력에서 어떻게 매핑되나요?
변환기가 숫자나 불리언을 강제 변환하나요?
반복(같은 이름을 가진 형제) 요소는 어떻게 처리되나요?
XML-to-JSON 변환은 무손실인가요?
JSON을 다시 XML로 변환하려면 어떻게 하나요?
XML 네임스페이스는 어떻게 처리되나요?
0123 이 123이 아닌 "0123"이 되는 이유는 무엇인가요?
이 도구와 XML 포맷터의 차이점은 무엇인가요?
파일 크기 제한이 있나요?
변환기가 CDATA 섹션을 처리하나요?
관련 도구
모든 도구 보기 →Base64 디코더 · 인코더 (Base64 Decoder & Encoder)
인코딩 & 포매팅
Base64를 온라인에서 무료로 인코딩하고 디코딩합니다. UTF-8과 이모지를 완벽 지원하는 실시간 변환으로, 100% 브라우저에서 처리되어 회원 가입이 필요 없습니다.
CSV to JSON 변환기 (CSV to JSON Converter)
인코딩 & 포매팅
브라우저에서 CSV를 JSON으로 변환합니다. RFC 4180, 타입 추론, 헤더 행, 큰 정수 안전 처리. 100% 비공개, 업로드 없음.
JSON Diff 비교
인코딩 & 포매팅
두 JSON 파일을 브라우저에서 즉시 Diff 비교하세요. 나란히 보기 하이라이팅, RFC 6902 JSON Patch 출력, 타임스탬프·ID 같은 노이즈 필드 무시. 비공개, 업로드 없음.
JSON 포맷터 (JSON Formatter)
인코딩 & 포매팅
브라우저에서 JSON을 즉시 포매팅하고 유효성 검사를 수행합니다. 온라인 도구로 구문 검사, 오류 감지, 최소화, 복사를 지원하며 데이터는 서버로 전송되지 않습니다.
JSON Schema 검증기
인코딩 & 포매팅
JSON Schema 온라인 검증기. Draft 2020-12, 2019-09, Draft-07 지원에 JSON Pointer 경로 단위 오류 메시지. 100% 브라우저 처리, 업로드 없음, 무료.
JSON to CSV 변환기 (JSON to CSV Converter)
인코딩 & 포매팅
브라우저에서 JSON을 CSV로 변환합니다. RFC 4180, Excel-EU, TSV, Pipe 프리셋 지원. 중첩 평탄화 또는 문자열화. 100% 비공개, 업로드 없음.