본문으로 바로가기

XML 포맷터

XML을 요소마다 줄을 나눠 들여쓰거나 한 줄로 압축합니다. 잘 만들어진(well-formed) 문서가 아니면 몇 행 몇 열에서 막혔는지 보여 주고, 주석·CDATA·DOCTYPE은 그대로 둡니다.

0자 · 0줄
방식

0자 · 0줄

입력한 내용은 이 브라우저 안에서만 처리되며 서버로 전송되지 않습니다. 어떻게 동작하나요?

한 줄 XML을 중첩된 요소에 맞게 줄바꿈과 들여쓰기로 정리

사용 방법

“방식”에서 “포맷”을 고르면 요소마다 줄을 나누고 깊이만큼 들여씁니다. 들여쓰기는 그 아래 목록에서 “공백 2칸”, “공백 4칸”, “탭” 중에 고릅니다. “압축”을 고르면 요소 사이의 줄바꿈과 들여쓰기를 없애 한 줄로 붙이고, 들여쓰기 목록은 사라집니다.

한 줄로 붙어 있는 다음 입력을 공백 2칸으로 포맷하면 이렇게 나옵니다.

<order id="7"><item sku="A1" qty="2">Pen</item><item sku="B2" qty="1"/><note>  keep  spaces  </note></order>
<order id="7">
  <item sku="A1" qty="2">Pen</item>
  <item sku="B2" qty="1"/>
  <note>  keep  spaces  </note>
</order>

글자만 들어 있는 요소(item, note)는 한 줄에 두고 안의 글자를 공백까지 그대로 남깁니다. 결과 아래의 “줄 수”와 “크기”는 입력이 아니라 결과를 잰 값이고, 크기는 UTF-8 바이트 수입니다.

그대로 남는 것과 표기가 바뀌는 것

주석(<!-- -->), CDATA 구간(<![CDATA[ ]]>), 처리 지시문(<?name ?>)은 내용을 바꾸지 않습니다. 포맷에서는 각각 자기 줄에 들여써서 놓고, 압축에서는 앞뒤 줄바꿈만 없앱니다. 맨 앞의 XML 선언(<?xml version="1.0"?>)과 <!DOCTYPE ...> 선언은 안쪽 내용까지 원문 글자 그대로 옮깁니다.

요소와 속성은 브라우저가 문서를 읽어 들인 뒤 다시 적기 때문에, 뜻은 같아도 표기가 한 가지로 통일됩니다.

입력 결과
<b></b> <b/>
<c> </c> (공백만 든 요소) 그대로
x='1' x="1"
&apos; '
&#xE9;, &#65; é, A
&amp;, &lt;, &gt; 그대로

눈여겨볼 것은 둘째 줄입니다. 공백만 들어 있는 요소는 포맷과 압축 모두에서 빈 요소로 줄이지 않고 공백을 그대로 둡니다. xml:space="preserve"가 붙어 있지 않아도 마찬가지입니다. 공백 자체가 값인 문서(예: 구분자로 공백 한 칸을 담은 요소)도 그 값이 바뀌지 않습니다.

DOCTYPE 안에서 직접 정의한 엔터티도 풀려서 나옵니다. <!ENTITY co "ACME">를 정의하고 본문에 &co;를 쓰면 결과 본문에는 ACME가 적히고, DOCTYPE의 정의는 그대로 남습니다.

글자와 요소가 섞인 내용은 포맷과 압축이 다르게 다룹니다

<p>Hello <b>big</b> world <i>x</i></p>처럼 한 요소 안에 글자와 자식 요소가 함께 있는 경우(혼합 콘텐츠)입니다. 포맷은 글자 조각도 요소처럼 한 줄씩 나누고 앞뒤 공백을 잘라 냅니다.

<p>
  Hello
  <b>big</b>
  world
  <i>x</i>
</p>

읽기에는 좋지만 Hello와 <b> 사이에 있던 공백 한 칸이 줄바꿈과 들여쓰기로 바뀌었습니다. 문서 본문처럼 공백이 화면에 그대로 나타나는 XML(XHTML, DocBook 등)이라면 포맷 결과를 원본 대신 저장하지 말고 읽는 용도로만 쓰세요.

압축은 반대로 이런 요소를 건드리지 않습니다. 글자가 섞인 요소 안에서는 공백과 줄바꿈을 원래대로 두기 때문에, 위 입력은 압축해도 그대로이고 여러 줄에 걸쳐 있었다면 줄바꿈도 남습니다. 압축이 없애는 것은 요소만 들어 있는 자리의 들여쓰기입니다.

검사하는 것은 문법까지입니다

이 도구는 문서가 “잘 만들어진(well-formed)” XML인지만 확인합니다. 여는 태그와 닫는 태그의 짝이 맞는지, 속성값이 따옴표로 감싸여 있는지, 가장 바깥 요소가 하나뿐인지 같은 XML 자체의 문법입니다. DTD나 XSD 같은 스키마가 정한 구조(어떤 요소가 어떤 순서로 와야 하는지, 어떤 속성이 필수인지)를 따르는지는 “유효한(valid)” 문서인지의 문제이고, 이 도구는 확인하지 않습니다. 결과가 나왔다는 것은 문법이 맞다는 뜻일 뿐입니다.

문법 오류가 있으면 결과 대신 “잘 만들어진(well-formed) XML이 아닙니다. 1행 20열 부근을 확인하세요.” 같은 안내와 그 줄, ^ 표시가 나옵니다. 아래는 Chrome에서 확인한 예입니다.

입력 표시되는 위치 원인
<a><b>1</b><c>2</b></a> 1행 20열 <c>를 </b>로 닫음
<a>1</a><b>2</b> 1행 9열 가장 바깥 요소가 둘
<a b="1" b="2"/> 1행 15열 같은 속성이 두 번
<x:a><x:b/></x:a> 1행 5열 접두사 x의 네임스페이스 선언(xmlns:x)이 없음
공백 두 칸 뒤의 <?xml version="1.0"?> 1행 8열 XML 선언 앞에 다른 글자가 있음

마지막 경우는 파일 내용을 복사하다가 맨 앞에 빈 줄이나 공백이 딸려 올 때 생깁니다. 선언은 문서의 첫 글자부터 시작해야 합니다.

외부 엔터티가 있는 문서

DOCTYPE이 외부 파일을 가리키는 엔터티를 정의하고 있으면, 그 엔터티를 참조한 자리가 결과에서 비어 나올 수 있습니다.

Chrome에서 <!DOCTYPE a [<!ENTITY e SYSTEM "http://example.invalid/e.txt">]><a>&e;</a>를 포맷하면 DOCTYPE은 그대로 남고 본문은 <a/>가 됩니다. 외부 엔터티를 참조하던 자리가 오류 없이 비어 버리므로, 이런 문서의 포맷 결과를 원본 대신 저장하면 참조가 사라집니다. DOCTYPE에 외부 엔터티 선언이 있으면 결과 아래에 이 점을 알리는 경고가 나옵니다.

참고 자료

자주 묻는 질문

HTML을 붙여넣으면 오류가 납니다. 왜 그런가요?

HTML에서는 괜찮은 표기가 XML에서는 문법 오류이기 때문입니다. <br>처럼 닫지 않은 태그, &nbsp;처럼 XML에 정의되지 않은 엔터티, 따옴표 없는 속성값(x=1)이 대표적입니다. XML로 읽히게 하려면 <br/>, &#160;, x="1"로 바꿔야 합니다. 본문에 그냥 쓴 &도 같은 이유로 오류이며 &amp;로 적어야 합니다.

오류라고 표시된 줄에는 틀린 곳이 없습니다. 어디를 봐야 하나요?

표시된 위치는 브라우저가 문제를 알아챈 자리이고, 원인은 그보다 앞에 있을 수 있습니다. 예를 들어 3행에서 <c>를 닫지 않으면 Chrome은 그 요소를 감싼 </a>가 나오는 4행을 가리킵니다. 표시된 줄에서 닫히는 태그의 짝을 위로 거슬러 올라가며 찾아보세요. 오류는 처음 만난 하나만 알려 주고, 브라우저가 위치를 알려 주지 않으면 행과 열 없이 안내만 나옵니다.

XML 선언에 encoding="ISO-8859-1"처럼 UTF-8이 아닌 인코딩이 적혀 있으면 어떻게 되나요?

선언은 적힌 그대로 결과 맨 앞에 남습니다. 하지만 다운로드로 받는 파일은 선언과 상관없이 UTF-8로 저장됩니다. 받은 파일을 그대로 쓰면 선언과 실제 인코딩이 어긋나므로, 선언의 encoding 값을 UTF-8로 고치거나 파일을 원래 인코딩으로 다시 저장하세요. 이런 선언이 있으면 결과 아래에도 같은 내용의 경고가 나옵니다. 결과를 복사해 원래 파일에 붙여넣는 경우에는 편집기가 저장하는 인코딩을 따릅니다.

최종 수정일: