XML ↔ JSON 변환기
XML을 JSON으로(속성·반복 태그·네임스페이스·들여쓰기 5종·루트 제거), JSON을 XML로(속성·CDATA·주석·루트 이름) 한 페이지에서 바꿉니다.
브라우저가 그 주소에 직접 요청합니다 — 파일이 이 사이트를 거치지 않습니다.
간결 모드를 켜면 <name>Ada</name>가 "name": "Ada"로, 끄면 모든 요소가 객체가 되어 "name": { "#text": "Ada" }로 나옵니다. 속성은 항상 "@attributes" 아래에 들어갑니다.
브라우저에서 XML을 JSON으로 변환
형식이 올바른 XML을 붙여넣으면 입력하는 즉시 JSON이 만들어집니다 — 따로 변환 버튼을 누를 필요가 없습니다. 각 요소는 태그 이름을 키로 하는 JSON이 되고, 네임스페이스 접두사도 이름의 일부로 그대로 남아 <x:note>는 "x:note"가 됩니다. 요소의 속성은 @attributes 객체 아래에 모이며, 텍스트 내용은 #text 키에 보관됩니다. 같은 태그가 반복되면 배열로 변환되어 어떤 값도 사라지지 않습니다. 다만 JSON은 이름 하나에 키 하나라서 이름이 다른 형제 요소의 순서는 남지 않습니다 — <a/><b/><a/>는 a 두 개 다음에 b 순서로 나옵니다. & 같은 엔티티는 원래 문자로 돌아오고, CDATA 블록은 안의 텍스트가 그대로 유지됩니다.
간결 모드와 안전한 파싱
기본으로 켜져 있는 간결 모드는 속성도 자식 요소도 없이 텍스트만 있는 요소를 곧바로 문자열 값으로 축약해, 대부분의 API가 기대하는 깔끔한 JSON을 만듭니다. 끄면 같은 요소가 #text 키를 가진 객체로 표현되어 구조가 더 명시적으로 드러납니다. XML은 브라우저 기본 DOMParser로 파싱되므로, 태그가 맞지 않거나 문서 형식이 잘못되면 조용히 틀린 결과를 내는 대신 문제가 생긴 줄과 칸을 한국어로 짚어 줍니다. 속성과 중첩 요소는 그대로 옮기고, XML 선언은 읽기만 할 뿐 JSON에 적지 않습니다. 혼합 콘텐츠는 텍스트를 하나의 #text로 이어 붙이고 양끝 공백을 잘라 남기지만, 자식 요소 사이 어디에 있었는지는 남지 않습니다. 주석과 처리 명령은 버려집니다.
출력 모양 고르기
JSON 들여쓰기는 다섯 가지입니다 — 공백 2·4·8칸, 단계마다 탭 하나, 그리고 한 줄로 압축. 루트 감싸기는 위쪽을 어디까지 남길지 정합니다. 루트 요소 이름으로 감싼 전체 문서, 루트 요소의 값만, 또는 그 아래 한 단계까지 벗겨 낸 형태를 고를 수 있고, 마지막이 목록 문서에서 보통 원하는 모양입니다. <rows><row>a</row><row>b</row></rows>가 ["a","b"]가 됩니다. 다만 루트 아래 단계에 키가 정확히 하나가 아니면 추측하지 않고 거절하며, 거기서 찾은 키 이름을 그대로 알려 줍니다. 하나를 고르는 순간 나머지가 조용히 사라지기 때문입니다.
파일과 웹 주소
.xml·.svg·.rss·.atom·.xsd·.xsl·.plist·.txt 파일을 5MB까지 열 수 있습니다. 더 큰 파일은 일부만 변환하는 대신 파일 크기와 한도를 함께 알려 주며 거절합니다. 내려받는 파일 이름은 연 파일을 따라가서 orders.xml은 orders.json으로 저장됩니다. 웹 주소를 넣어 불러올 수도 있습니다. 요청은 브라우저가 그 주소로 직접 보내므로 문서가 이 사이트를 거치지 않습니다. 그 대가가 CORS입니다 — 다른 사이트의 페이지가 읽는 것을 허용하지 않는 서버는 불러올 수 없고, 그럴 때는 주소 탓으로 돌리지 않고 무엇이 막았는지 설명합니다. 주소 형태가 아닌 글자는 https://를 임의로 붙이지 않고 거절합니다. 문자 인코딩은 서버가 보낸 헤더, 그다음 문서의 <?xml encoding?> 선언, 마지막으로 UTF-8 순서로 정해지므로 charset 헤더 없이 내려오는 EUC-KR 피드도 한글로 읽힙니다. 디스크에서 연 파일은 파일 열기 버튼 옆에서 고른 인코딩으로 읽습니다 — 자동, 또는 EUC-KR·Shift_JIS·GB18030·Big5를 포함한 열 가지 코드페이지. 반대 방향은 JSON을 XML로 변환하는 도구와 짝을 이룹니다. 그 도구의 속성 옵션을 켜 두면(기본값) 속성, 네임스페이스 접두사, 반복 태그, 모든 값이 그대로 돌아옵니다. 돌아오지 않는 것은 JSON에 애초에 담기지 않은 것 — 이름이 다른 형제 요소의 순서와, 혼합 텍스트가 자식 요소 사이 어디에 있었는지 — 뿐입니다.
JSON을 다시 XML로
위쪽의 JSON → XML을 누르면 반대 방향으로 바뀝니다. 이쪽은 XML → JSON 쪽과 입력을 따로 보관하며, 유효한 JSON을 깔끔하게 들여쓴 XML 문서로 즉시 바꿉니다. 객체는 각 속성 이름을 태그로 하는 중첩 요소가 되고, 배열은 키를 반복해 각 항목마다 자체 태그를 갖게 되며, 문자열·숫자·불리언 같은 기본값은 요소 안의 텍스트가 됩니다. 속성 옵션을 켜 두면(기본값) @로 시작하는 키는 속성이 되고, XML → JSON 쪽이 쓰는 모양인 @attributes 객체는 멤버마다 속성 하나가 되며, #text는 그 요소의 본문 텍스트가 됩니다. 접두사:이름 꼴의 키는 그 요소나 상위 요소의 xmlns:접두사 선언이 그 접두사를 묶어 줄 때만 접두사를 유지합니다(xml:은 언제나 묶여 있습니다). 그렇지 않으면 콜론이 _로 바뀝니다 — 아무도 선언하지 않은 접두사는 브라우저가 읽을 수 있는 XML이 아니기 때문입니다. 스키마에 맞게 루트 요소 이름을 바꿀 수 있고, 입력하는 즉시 출력이 갱신되고, 결과는 클릭 한 번으로 복사할 수 있습니다.
안전하고 읽기 좋은 결과
XML을 깨뜨릴 수 있는 &, <, >, " 문자는 텍스트 안에서 자동으로 이스케이프되므로, JSON에 HTML 조각이나 따옴표가 들어 있어도 XML이 올바른 형식으로 유지됩니다. 빈 객체는 빈 요소로 표현됩니다. 배열은 항목마다 키를 반복하므로 빈 배열은 그 키의 요소를 만들지 않습니다(최상위 []는 빈 루트 요소가 됩니다). 두 칸 들여쓰기 덕분에 깊게 중첩된 구조도 한눈에 읽기 쉽습니다. 결과를 독립된 .xml 파일로 저장할 때는 XML 선언 옵션을 켜서 <?xml version="1.0" encoding="UTF-8"?>를 맨 앞에 붙일 수 있습니다.
양쪽을 오가도 남는 것
“이 JSON을 다시 XML로”와 “이 XML을 다시 JSON으로”는 결과를 다른 쪽으로 넘겨 주고, 한쪽이 쓰는 @attributes·#text 모양은 다른 쪽이 그대로 읽습니다. 돌아오지 않는 것은 두 가지입니다. 이름이 다른 형제 요소의 순서는 JSON 객체에 담을 자리가 없어 <a/><b/><a/>가 a, a, b로 돌아오고, 자식 요소 사이에 끼어 있던 글자는 XML → JSON에서 #text 하나로 모입니다.
자주 묻는 질문
입력한 XML이 어딘가로 업로드되나요?
업로드되지 않습니다. 변환은 브라우저 안에서 내장 XML 파서로 모두 처리되며, 붙여넣거나 연 문서는 이 사이트의 서버로 전송되지 않습니다. 애초에 저장할 서버가 없습니다. 이 도구가 보내는 요청은 사용자가 시킨 것 하나뿐입니다 — “웹 주소에서 XML 불러오기”를 쓰면 브라우저가 그 주소로 직접 요청하므로 지정한 그 서버는 요청을 보게 되지만, 문서는 이 사이트를 거치지 않고 곧바로 사용자에게 옵니다.
속성과 반복 태그는 어떻게 표현되나요?
속성은 요소의 @attributes 객체에 담기고 텍스트는 #text 키에 보관됩니다. 같은 부모 안에서 같은 태그 이름이 여러 번 나오면 해당 요소들이 JSON 배열로 모여 모든 값이 보존됩니다. 다만 이름이 다른 형제 요소의 순서는 보존되지 않아 <a/><b/><a/>는 a, a, b 순서로 나옵니다.
간결 모드는 무엇을 하나요?
간결 모드는 속성도 자식 요소도 없이 텍스트만 있는 요소를 일반 문자열로 축약하며, 기본으로 켜져 있습니다. 끄면 같은 요소가 #text 키를 가진 객체로 표현되어 구조가 더 명시적으로 드러납니다.
XML 형식이 잘못되면 어떻게 되나요?
닫히지 않은 태그나 짝이 맞지 않는 태그 같은 파싱 오류를 잡아내, 파서가 멈춘 줄과 칸을 한국어로 알려 줍니다. 브라우저가 내놓는 영어 콘솔 문장을 그대로 보여 주지 않으며, 깨진 JSON을 돌려주지도 않습니다.
들여쓰기를 바꾸거나 한 줄로 압축할 수 있나요?
네. “JSON 들여쓰기”에 다섯 가지가 있습니다 — 공백 2칸·4칸·8칸, 단계마다 탭 하나, 한 줄로 압축. 공백만 달라지며 데이터 자체는 어느 설정에서나 같습니다.
결과에서 루트 요소를 없앨 수 있나요?
“루트 감싸기”에서 고르면 됩니다. “루트 요소 제거”는 { "root": … } 대신 루트의 값만 돌려주고, “루트와 그 아래 한 단계 제거”는 한 단계 더 벗겨 <rows><row>a</row><row>b</row></rows>를 ["a","b"]로 만듭니다. 다만 루트 아래 단계에 키가 정확히 하나가 아니면 — 예를 들어 루트에 속성이 함께 있으면 — 하나를 고르는 순간 나머지가 사라지므로, 찾은 키 이름을 알려 주고 거절합니다.
파일을 열어서 변환할 수도 있나요?
네. .xml·.svg·.rss·.atom·.xsd·.xsl·.plist·.txt 파일을 5MB까지 열 수 있습니다. 더 큰 파일은 일부만 변환하지 않고 파일 크기와 한도를 알려 주며 거절합니다. 내려받는 이름은 연 파일을 따라가 orders.xml은 orders.json이 됩니다. 디스크에서 연 파일은 파일 열기 버튼 옆에서 고른 인코딩으로 읽습니다 — 자동, 또는 EUC-KR·Shift_JIS·GB18030·Big5를 포함한 열 가지 코드페이지.
웹 주소에서 XML을 불러올 수 있나요?
네. http:// 또는 https:// 주소를 넣고 “불러오기”를 누르면 됩니다. 요청은 브라우저가 직접 보내므로 이 사이트를 거치지 않지만, 그래서 못 불러오는 주소도 있습니다. 다른 사이트의 페이지가 읽는 것을 서버가 허용하지 않는 경우(CORS), 20초 안에 응답이 없는 경우, HTTP 오류 상태, 5MB를 넘는 본문, 빈 문서는 각각 이유를 밝히며 거절합니다. 주소 형태가 아닌 글자에는 https:// 를 임의로 붙이지 않고 거절합니다.
EUC-KR 피드도 한글이 안 깨지나요?
웹 주소로 불러온 문서라면 그렇습니다. 서버가 Content-Type 헤더에 선언한 charset을 먼저 따르고, 없으면 문서 자체의 <?xml encoding="…"?> 선언을 보며, 둘 다 없을 때만 UTF-8로 읽습니다. 디스크에서 연 파일은 파일 열기 버튼 옆에서 고른 인코딩으로 읽습니다 — 자동, 또는 EUC-KR·Shift_JIS·GB18030·Big5를 포함한 열 가지 코드페이지.
네임스페이스·CDATA·엔티티는 그대로 보존되나요?
네임스페이스 접두사는 키의 일부로 남아 <x:note>는 "x:note"가 되고, xmlns 선언 자체는 그 요소의 @attributes 안에 들어갑니다. CDATA 블록은 안의 텍스트가 그대로 읽히고, & 같은 엔티티는 원래 문자로 복원됩니다.
JSON 배열은 XML로 어떻게 변환되나요?
각 배열 항목은 속성 이름을 반복하는 별도의 요소로 만들어집니다. 예를 들어 {"b":[2,3]}는 <root><b>2</b><b>3</b></root>가 됩니다. 최상위 배열은 빌려올 속성 이름이 없으므로 <item> 태그를 사용합니다.
루트 요소 이름을 바꿀 수 있나요?
네. 루트 요소 입력란에 원하는 이름을 입력하면 가장 바깥쪽 태그가 즉시 갱신됩니다. 비워 두면 <root>로 대체됩니다.
주석이나 끝 쉼표가 있는 JSON도 되나요?
네. JSON.parse가 실패하면 JSON5로 읽어 끝 쉼표·따옴표 없는 키·작은따옴표가 됩니다. JSON 주석은 버리고, XML 주석은 #comment 키로 씁니다.
CDATA 구역이나 주석, 처리 명령도 쓸 수 있나요?
네. "CDATA·주석·처리 명령 (#cdata / #comment / ?이름)"을 켜면 #cdata 키는 CDATA 구역으로, #comment 키는 XML 주석으로, ?로 시작하는 키는 처리 명령으로 씁니다. #cdata 하나만 있으면 요소 안에 본문으로 들어가고, 처리 명령의 값이 객체면 그 멤버가 속성처럼 적혀 "?xml-stylesheet": {"href": "a.xsl"}는 <?xml-stylesheet href="a.xsl"?>가 됩니다. 값이 배열이면 여러 개를 차례로 씁니다. 기본값은 꺼짐이라 우연히 이런 이름을 가진 키는 여전히 보통 요소가 됩니다. CDATA 안의 ]]>는 두 구역으로 나누고 주석 안의 --에는 공백을 넣어, 입력을 거부하지 않고 올바른 XML로 씁니다.