XML 포매터
구문 강조와 함께 XML을 형식화하고 보기 좋게 출력
XML 입력
형식화된 XML
XML 형식화란?
XML 형식화(XML 보기 좋게 출력 또는 XML 뷰티파이케이션이라고도 함)는 XML 문서에 일관된 들여쓰기와 줄바꿈을 추가하여 계층 구조를 시각적으로 표현하는 과정입니다. API, 설정 생성기, 직렬화 도구에서 나온 원시 XML은 태그 사이에 공백 없이 한 줄로 전달되는 경우가 많습니다. XML 포매터는 해당 문서를 트리로 파싱한 뒤 예측 가능한 간격으로 재직렬화합니다. 결과물은 시각적으로 명확하고 이해하기 훨씬 쉬우며, 문서의 논리적 내용은 전혀 변경되지 않습니다.
XML 1.0 사양(W3C 권고안, 5판)은 모든 여는 태그에 대응하는 닫는 태그가 있거나 자체 닫는 태그여야 하고, 속성은 따옴표로 묶어야 하며, 다섯 가지 문자(<, >, &, ", ')는 엔티티 이스케이프가 필요한 엄격한 문법을 정의합니다. 포매터는 이러한 규칙을 준수하면서 문서의 정보 집합(infoset)을 변경하지 않는 불필요한 공백만 삽입해야 합니다.
형식화된 XML은 코드 리뷰 시 읽기 쉽고, 버전 관리에서 diff하기 쉬우며, 서비스가 예상치 못한 데이터를 반환할 때 디버깅하기 쉽습니다. 형식화 작업 자체는 무손실입니다. 문서의 논리적 내용은 동일하게 유지되고 표현 방식만 변경됩니다. git diff나 풀 리퀘스트 리뷰 플랫폼 같은 도구는 수정된 줄만 보여줍니다 — 일관되게 들여쓰기된 XML은 그 diff가 서식 변경이 아닌 실제 변경 사항을 반영하도록 보장합니다.
<catalog><book id="bk101"><author>Gambardella, Matthew</author><title>XML Developer's Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date></book><book id="bk102"><author>Ralls, Kim</author><title>Midnight Rain</title><genre>Fantasy</genre><price>5.95</price><publish_date>2000-12-16</publish_date></book></catalog>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
</book>
</catalog>온라인 XML 포매터를 사용하는 이유
XML을 손으로 형식화하는 것은 특히 깊은 중첩이나 혼합 네임스페이스가 있는 문서의 경우 오류가 발생하기 쉽고 느립니다. 브라우저 기반 포매터는 파일 크기에 관계없이 1초 안에 형식화된 결과를 제공합니다. 데스크톱 도구나 CLI 유틸리티와 달리 설치나 구성이 필요 없으며 — 페이지를 열고 바로 작업을 시작할 수 있습니다.
XML 포매터 활용 사례
XML 미리 정의된 엔티티 참조
XML은 자체 문법을 위해 다섯 가지 문자를 예약합니다. 이 문자들이 리터럴 텍스트 내용 또는 속성 값으로 나타날 때는 미리 정의된 엔티티 참조로 대체해야 합니다. 올바른 포매터는 보기 좋게 출력하는 동안 이러한 엔티티를 보존합니다.
| 문자 | XML에서의 역할 | 엔티티 |
|---|---|---|
| < | Start of tag | < |
| > | End of tag | > |
| & | Start of entity | & |
| " | Attribute delimiter | " |
| ' | Attribute delimiter | ' |
XML 들여쓰기 스타일 비교
XML 들여쓰기에 대한 단일 표준은 없습니다. 선택은 팀의 관례와 파이프라인의 도구에 따라 달라집니다. 다음은 세 가지 가장 일반적인 스타일입니다.
코드 예시: 프로그래밍 방식으로 XML 형식화
스크립트나 빌드 프로세스 내에서 XML을 형식화해야 할 때, 모든 주요 언어에는 내장 또는 표준 라이브러리 옵션이 있습니다. 아래는 직접 복사하여 사용할 수 있는 실제 예시입니다.
const raw = '<root><item>hello</item></root>'
const parser = new DOMParser()
const doc = parser.parseFromString(raw, 'application/xml')
const serializer = new XMLSerializer()
const xml = serializer.serializeToString(doc)
// Indent with XSLT (browser-native approach)
const xslt = new DOMParser().parseFromString(`
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>`, 'application/xml')
const proc = new XSLTProcessor()
proc.importStylesheet(xslt)
const formatted = proc.transformToDocument(doc)
console.log(new XMLSerializer().serializeToString(formatted))
// → <root>\n <item>hello</item>\n</root>import xml.dom.minidom raw = '<root><item>hello</item><item>world</item></root>' dom = xml.dom.minidom.parseString(raw) print(dom.toprettyxml(indent=' ')) # → <?xml version="1.0" ?> # → <root> # → <item>hello</item> # → <item>world</item> # → </root> # With lxml (handles namespaces, XSD, large files) from lxml import etree tree = etree.fromstring(raw.encode()) print(etree.tostring(tree, pretty_print=True).decode())
package main
import (
"encoding/xml"
"fmt"
"strings"
)
func formatXML(raw string) (string, error) {
decoder := xml.NewDecoder(strings.NewReader(raw))
var out strings.Builder
encoder := xml.NewEncoder(&out)
encoder.Indent("", " ")
for {
tok, err := decoder.Token()
if err != nil {
break
}
encoder.EncodeToken(tok)
}
encoder.Flush()
return out.String(), nil
}
// formatXML("<a><b>1</b></a>") → "<a>\n <b>1</b>\n</a>"# Format XML file with xmllint (part of libxml2, pre-installed on macOS/Linux) xmllint --format input.xml > formatted.xml # Format from stdin echo '<a><b>1</b></a>' | xmllint --format - # → <?xml version="1.0"?> # → <a> # → <b>1</b> # → </a> # Validate and format at the same time xmllint --format --schema schema.xsd input.xml