XML 포매터
XML 문서를 정렬·압축합니다. 형식이 잘못된 곳은 줄과 열 번호로 알려 줍니다. 무료, 브라우저에서 처리.
- 브라우저에서 처리
- 데이터가 브라우저 밖으로 나가지 않습니다
- 무료 · 회원가입 불필요
WeChat으로 스캔하여 공유
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.
공공데이터포털 응답 정리하기
공공데이터포털의 「기상청_단기예보 조회서비스」(서비스 안내)는 요청 변수 dataType으로 XML 또는 JSON을 고를 수 있고, 기본값은 XML입니다. 2026-10-08에 서비스 키 없이 초단기실황(getUltraSrtNcst)을 호출하자 HTTP 401과 함께 아래 XML이 돌아왔습니다. <cmmMsgHeader> 줄은 들여쓰기 없이 왔습니다.
<?xml version="1.0" encoding="UTF-8"?>
<OpenAPI_ServiceResponse>
<cmmMsgHeader>
<errMsg>SERVICE_KEY_IS_NULL</errMsg>
<returnAuthMsg>서비스 접근거부</returnAuthMsg>
<returnReasonCode>20</returnReasonCode>
</cmmMsgHeader>
</OpenAPI_ServiceResponse>
공백 2개로 포맷하면 계층에 맞게 들여쓰기가 다시 붙습니다.
<?xml version="1.0" encoding="UTF-8"?>
<OpenAPI_ServiceResponse>
<cmmMsgHeader>
<errMsg>SERVICE_KEY_IS_NULL</errMsg>
<returnAuthMsg>서비스 접근거부</returnAuthMsg>
<returnReasonCode>20</returnReasonCode>
</cmmMsgHeader>
</OpenAPI_ServiceResponse>
로그 한 줄이나 테스트 코드의 문자열로 넣으려면 같은 응답을 “압축”합니다. XML 선언은 원문 그대로 앞에 남고, 한글 텍스트는 바뀌지 않습니다.
<?xml version="1.0" encoding="UTF-8"?><OpenAPI_ServiceResponse><cmmMsgHeader><errMsg>SERVICE_KEY_IS_NULL</errMsg><returnAuthMsg>서비스 접근거부</returnAuthMsg><returnReasonCode>20</returnReasonCode></cmmMsgHeader></OpenAPI_ServiceResponse>
이 도구는 응답 내용을 해석하지 않으므로, returnReasonCode가 무엇을 뜻하는지는 해당 API의 활용가이드에서 확인해야 합니다.
띄어쓰기가 있는 문장과 인라인 요소
한국어 문장은 띄어쓰기로 단어를 나누기 때문에, 텍스트 사이에 요소가 끼어 있는 XML은 압축 결과를 특히 확인해야 합니다.
<p>서울특별시 <b>강남구</b> 테헤란로</p>
압축 결과:
<p>서울특별시<b>강남구</b>테헤란로</p>
“서울특별시”와 “강남구” 사이, “강남구”와 “테헤란로” 사이의 공백이 사라졌습니다. 도구가 텍스트 조각마다 앞뒤 공백을 지운 뒤 그대로 이어 붙이기 때문입니다. 반대로 포맷하면 조각이 각각 다른 줄로 나뉩니다.
<p>
서울특별시
<b>강남구</b>
테헤란로
</p>
이런 문서(XHTML, 문장이 들어 있는 설정 파일 등)는 결과로 원본을 바로 덮어쓰지 말고, 데이터 위주의 XML에 쓰는 것이 안전합니다. 요소 이름을 <주소>처럼 한글로 쓰는 것은 문제가 없습니다. XML 1.0이 이름 첫 글자로 허용하는 범위 [#x3001-#xD7FF]에 한글 음절이 들어 있습니다(XML 1.0 §2.3).
자주 나는 오류
이 도구는 브라우저의 XML 파서로 입력을 파싱하며, 첫 번째 well-formedness 오류에서 멈추고 브라우저의 메시지를 보여 줍니다. 흔한 원인은 다음과 같습니다.
| 오류 | 예시 | 고치는 법 |
|---|---|---|
| 닫히지 않은 태그 | <person><name>Alice</person> | <name>을 </name>으로 닫기 |
| 태그 이름 불일치 | <b>bold</i> | 시작 태그와 끝 태그를 같은 이름으로(대소문자 구분) |
본문에 &나 <를 그대로 씀 | <company>AT&T</company> | &, <로 쓰기 |
| 루트 요소가 두 개 | <record/><record/> | <records> 같은 부모 요소로 감싸기 |
| 따옴표 없는 속성 값 | <item id=42/> | 따옴표로 감싸기: id="42" |
HTML에서 가져온 텍스트에는 같은 HTML 엔티티가 섞여 있기도 합니다. XML에 미리 정의된 엔티티는 < > & ' " 다섯 개뿐입니다(XML 1.0 §4.6). 2026-10-08 Chrome 152에서 확인한 결과, <주소>서울 강남구</주소>를 넣으면 상태 줄에 “오류:”와 error on line 1 at column 13: Entity 'nbsp' not defined가 표시됩니다.  (줄바꿈 없는 공백의 문자 참조)로 바꾸거나 일반 공백으로 고치면 됩니다. 메시지 본문은 브라우저의 영어 원문이고, Firefox에서는 표현이 다릅니다.
제한 사항
- DOCTYPE에서 선언한 엔티티는 펼쳐집니다. XML 선언과 DOCTYPE(내부 서브셋 포함)은 그대로 출력하지만, 거기서 선언한 엔티티 참조(
&company;등)는 치환된 텍스트로 씁니다. - 텍스트 앞뒤 공백이 잘립니다.
xml:space="preserve"도 반영되지 않습니다. - 빈 요소의 표기가 바뀝니다. 포맷하면
<note></note>와<note> </note>모두<note/>가 됩니다. 압축하면 내용이 없는<note></note>는<note/>, 공백만 있는<note> </note>는<note></note>가 됩니다. - 따옴표와 이스케이프는 한 가지 방식으로 씁니다. 속성 값은 늘 큰따옴표로 감싸고, 텍스트 안의
'"도'"로 씁니다. 의미는 같습니다. - well-formedness만 검사합니다. DTD나 XML Schema로 유효성을 검증하지 않고, 오류는 첫 번째 것만 보여 줍니다.
FAQ
XML 유효성 검사도 하나요?
형식이 올바른지(well-formedness)만 확인합니다. 브라우저의 DOMParser가 첫 번째 오류에서 파싱을 멈추고, 상태 줄에 “오류:”와 함께 브라우저의 영어 메시지(줄·열 번호 포함)를 보여 줍니다. Chrome 152에서 확인한 표시는 error on line N at column M 형식의 한 문장입니다. Safari가 같은 libxml2 형식으로 알려 주면 같은 방식으로 읽습니다. Firefox는 그 오류 형식(XML Parsing Error … Line Number N, Column M)에 맞춰 파싱해 첫 줄과 줄·열 번호를 보여 주지만, Firefox에서 직접 확인하지는 않았습니다. XML 스키마(XSD)나 DTD로 검증하지는 않습니다.
CDATA 구역이나 주석은 남나요?
남습니다. CDATA 구역, 주석, 처리 명령, XML 선언, DOCTYPE(내부 서브셋 포함)은 포맷한 뒤에도 그대로 출력됩니다. 요소의 자식이 CDATA 구역 하나뿐이면, 포맷할 때 CDATA를 시작 태그와 끝 태그 사이의 별도 줄에 둡니다.
네임스페이스(namespace)도 처리되나요?
네. x:v 같은 접두사가 붙은 이름과 xmlns 선언은 해석한 그대로 쓰고, 속성 순서도 바꾸지 않습니다. 속성 값은 모두 큰따옴표로 감쌉니다.
들여쓰기를 바꿀 수 있나요?
“들여쓰기” 메뉴에서 공백 2개, 공백 4개, 탭 중에서 고를 수 있습니다. 입력하는 동안의 자동 포맷은 선택된 들여쓰기를 쓰고, 메뉴를 바꾼 뒤에는 “포맷”을 눌러야 지금 출력에 반영됩니다.
텍스트의 띄어쓰기가 왜 바뀌나요?
텍스트 앞뒤의 공백을 지우고 공백만 있는 텍스트는 버리기 때문입니다. xml:space="preserve"도 따르지 않습니다. 텍스트와 요소가 섞여 있으면 포맷은 텍스트 조각을 각각 다른 줄로 나누고, 압축은 앞뒤 공백을 지운 조각을 그대로 이어 붙이므로 단어 사이의 띄어쓰기가 사라질 수 있습니다.
데이터가 서버로 전송되나요?
아니요. XML은 지금 보고 있는 브라우저 탭 안에서 해석하고 정렬하며, 서버로 보내지도 브라우저 저장소에 저장하지도 않습니다. “포맷” 또는 “압축”을 누르면 페이지 통계에 도구 이름과 그 동작이 기록되지만 XML 내용은 담지 않습니다.