XML 포맷터 & 검증기

XML을 붙여넣고 포맷 버튼을 누르면 적절한 들여쓰기로 정리되고, 검증 버튼을 누르면 문법만 확인해요. 속성과 네임스페이스도 처리됩니다. 모든 처리는 브라우저 안에서 진행돼요.

  1. 왼쪽 텍스트 영역에 XML을 붙여넣어 주세요.
  2. 포맷 버튼을 누르면 fast-xml-parser를 거쳐 들여쓰기가 적용된 XML이 출력돼요.
  3. 검증 버튼은 입력을 변경하지 않고 잘 형성되었는지(well-formed)만 확인합니다.
  4. 오류는 문서 내 위치를 알려줘요.
어떤 도구인가요?

fast-xml-parser로 XML을 파싱한 뒤 일관된 들여쓰기로 다시 출력합니다. 각 요소 내 속성 순서와 요소 중첩이 그대로 보존돼요. 혼합 콘텐츠(텍스트와 자식 요소가 섞인 경우)와 네임스페이스(`prefix:tag`)도 그대로 유지됩니다. 출력은 잘 형성된 XML이지만, "잘 형성됨"과 "유효함"은 다른 개념이며 유효성 검사(스키마/DTD)는 이 도구의 범위가 아니에요.

예시

정리되지 않은 XML 입력:

<root version="1"><name>Ada</name><tags>math</tags><tags>logic</tags></root>

정리된 출력:

<root version="1">
  <name>Ada</name>
  <tags>math</tags>
  <tags>logic</tags>
</root>

자주 만나는 XML 오류와 해결 방법

XML의 well-formedness 규칙은 HTML 보다 엄격해요. 파서가 거부할 때 살펴볼 패턴들입니다.

  • 닫지 않은 태그. `<a><b></a>` 는 잘못됐어요 — `<b>` 도 어딘가에서 닫혀야 합니다 (`<b/>` 또는 `</b>`). XML은 HTML 스타일의 선택적 닫는 태그를 허용하지 않아요.
  • 대소문자 불일치. XML은 대소문자를 구분해요 — `<Foo></foo>` 는 다른 두 태그 이름입니다. 정확히 일치시키세요.
  • 특수 문자 미이스케이프. 텍스트나 속성 값 안의 `<`, `>`, `&`, 따옴표는 이스케이프해야 해요: `&lt;`, `&gt;`, `&amp;`, `&quot;`. 그런 문자가 많은 데이터는 CDATA로 감싸세요: `<![CDATA[...]]>`.
  • 루트가 여러 개. XML은 루트 요소가 정확히 하나여야 해요. 최상위에 `<a/><b/>` 가 있으면 잘못된 형태입니다. 감싸 주세요: `<root><a/><b/></root>`.
  • 잘못된 요소 이름. 요소 이름은 숫자로 시작할 수 없고, 공백이나 예약 문자(`< > & " \'`)를 포함할 수 없어요. `xml` (대소문자 무관)로 시작하는 이름은 스펙에서 예약돼 있습니다.
  • 속성 따옴표 짝 불일치. `<a name="value\'>` 처럼 큰따옴표와 작은따옴표를 섞으면 안 돼요. 한 속성 안에서는 따옴표 종류를 일관되게 사용하세요 (둘 다 유효합니다).
자주 묻는 질문

포맷이 데이터를 변경하나요?

요소 사이의 공백만 바뀝니다. 요소 순서, 속성 순서, 속성 값, 텍스트 콘텐츠, CDATA 래핑은 보존돼요. 자체 닫힘 (`<x/>`)과 명시적 형태 (`<x></x>`)는 정규화될 수 있어요.

XML 주석은 보존되나요?

fast-xml-parser는 기본 설정에서 주석을 제거해요. 주석을 보존하는 포맷이 필요하면 다른 도구를 사용하세요 (예: XSLT 항등 변환, `xmllint --format`).

스키마 기반 유효성 검사도 하나요?

아니요. 이 도구는 well-formedness(잘 형성됨)만 검사해요. 스키마 유효성 검사(XSD, DTD, RelaxNG)는 별도 단계이며 추가 입력으로 스키마가 필요해요.

네임스페이스는 어떻게 처리되나요?

네임스페이스 접두사는 요소 이름의 일부(`x:foo`)로 유지돼요. 기본 네임스페이스 선언과 접두사 바인딩은 속성으로 보존됩니다. 네임스페이스 인식 처리(URI 해석)는 수행하지 않아요.

XML이 어디론가 업로드되나요?

아니요. 모든 처리는 브라우저 안에서 진행돼요. 변환 버튼을 눌러도 어떤 서버에도 데이터가 전송되지 않습니다.

들여쓰기 폭을 바꿀 수 있나요?

현재 단계당 2 칸으로 고정돼 있어요. 커스터마이즈하려면 같은 라이브러리인 fast-xml-parser를 명령줄에서 실행하면서 `{ indentBy: " " }` 같은 옵션을 직접 전달하세요.