XML Validator
XML 구문을 검증하고 형식 오류 확인
XML 입력
XML 유효성 검사란?
XML 유효성 검사기는 XML 문서가 XML 1.0 사양(W3C 권고안, 5판)에 정의된 구조 규칙을 따르는지 확인합니다. 최소한 이 XML 유효성 검사기는 문서가 올바른 형식(well-formed)인지 확인합니다. 즉, 단일 루트 요소가 있고, 모든 태그가 올바르게 중첩되고 닫혀 있으며, 속성 값이 따옴표로 묶여 있고, 예약 문자가 사전 정의된 엔티티를 사용하는지 검사합니다. 이러한 검사 중 하나라도 실패하면 XML 파서는 잘못된 출력을 조용히 생성하는 대신 오류를 발생시킵니다.
올바른 형식(well-formedness)과 유효성(validity)의 구분은 중요합니다. 올바른 형식의 XML 문서는 XML 사양 자체의 문법 규칙을 만족합니다. 유효한 XML 문서는 한 단계 더 나아가 DTD(Document Type Definition), XSD(XML Schema Definition), Relax NG 스키마 같은 외부 스키마에 정의된 제약 조건도 준수합니다. 이 도구는 첫 번째이자 가장 일반적인 유효성 검사 단계인 올바른 형식을 확인합니다. 이 단계 없이는 이후의 어떤 처리도 진행할 수 없습니다.
XML 유효성 검사는 오류가 운영 환경에 도달하기 전에 잡아냅니다. 닫히지 않은 태그, 일치하지 않는 요소 이름, 이스케이프되지 않은 앰퍼샌드, 중복 속성은 수동으로 편집한 XML에서 가장 흔히 발생하는 실수입니다. 언어마다 파서가 이러한 오류를 다르게 처리합니다. 어떤 파서는 조용히 실패하고, 어떤 파서는 부분적인 결과를 반환하며, 어떤 파서는 예외를 발생시킵니다. 먼저 유효성 검사기를 통해 XML을 실행하면 이러한 모호함이 사라지고 오류 위치 정보와 함께 명확한 합격/불합격 결과를 얻을 수 있습니다.
온라인 XML 유효성 검사기를 사용하는 이유
XML 구문 오류를 초기에 잡아내면 XML 데이터를 사용하는 애플리케이션에서 연쇄적인 장애를 방지할 수 있습니다. 브라우저 기반 유효성 검사기는 커맨드라인 도구를 설치하거나 IDE 플러그인을 구성하지 않고도 즉각적인 피드백을 제공합니다.
XML 유효성 검사기 활용 사례
XML 올바른 형식 규칙
XML 1.0 사양은 엄격한 문법 규칙 집합을 정의합니다. 문서가 올바른 형식으로 간주되려면 모든 규칙을 만족해야 합니다. 아래 표는 각 규칙, 요구 사항, 올바른 예시를 나열합니다. 대부분의 유효성 검사 오류는 이 규칙 중 하나로 거슬러 올라갑니다.
| 규칙 | 요구 사항 | 올바른 예시 |
|---|---|---|
| Single root element | Document must have exactly one root | <root>...</root> |
| Matched tags | Every opening tag needs a closing tag | <p>text</p> |
| Proper nesting | Tags must close in reverse order of opening | <a><b>...</b></a> |
| Quoted attributes | Attribute values must be in single or double quotes | <el attr="val"/> |
| Entity escaping | Reserved characters must use predefined entities | < > & " ' |
| Case sensitivity | Tag names are case-sensitive: <A> is not </a> | <Book>...</Book> |
| No duplicate attributes | Each attribute name must appear once per element | <el a="1" b="2"/> |
| Valid XML declaration | If present, must be the very first line | <?xml version="1.0"?> |
올바른 형식 vs. DTD 유효성 vs. 스키마 유효성
XML 유효성 검사에는 세 가지 단계가 있습니다. 이 도구는 첫 번째 단계(올바른 형식)를 확인하며, 이는 나머지 두 단계의 전제 조건입니다.
코드 예시
다양한 언어에서 프로그래밍 방식으로 XML 유효성을 검사합니다. 각 예시는 올바른 형식을 확인하고 문서가 잘못된 형식인 경우 오류 메시지를 반환합니다.
function validateXML(xmlString) {
const parser = new DOMParser()
const doc = parser.parseFromString(xmlString, 'application/xml')
const error = doc.querySelector('parsererror')
if (error) {
return { valid: false, message: error.textContent }
}
return { valid: true, message: 'Well-formed XML' }
}
validateXML('<root><item>hello</item></root>')
// → { valid: true, message: "Well-formed XML" }
validateXML('<root><item>hello</root>')
// → { valid: false, message: "Opening and ending tag mismatch..." }import xml.etree.ElementTree as ET
def validate_xml(xml_string):
try:
ET.fromstring(xml_string)
return True, "Well-formed XML"
except ET.ParseError as e:
return False, str(e)
valid, msg = validate_xml('<root><item>hello</item></root>')
# → (True, "Well-formed XML")
valid, msg = validate_xml('<root><item>hello</root>')
# → (False, "mismatched tag: line 1, column 27")
# With lxml — also supports XSD schema validation
from lxml import etree
schema = etree.XMLSchema(etree.parse('schema.xsd'))
doc = etree.fromstring(b'<root><item>hello</item></root>')
schema.validate(doc) # → True or Falsepackage main
import (
"encoding/xml"
"fmt"
"strings"
)
func validateXML(raw string) error {
decoder := xml.NewDecoder(strings.NewReader(raw))
for {
_, err := decoder.Token()
if err != nil {
if err.Error() == "EOF" {
return nil
}
return err
}
}
}
func main() {
err := validateXML("<root><item>hello</item></root>")
fmt.Println(err) // → <nil>
err = validateXML("<root><item>hello</root>")
fmt.Println(err) // → XML syntax error: unexpected end element </root>
}# Check well-formedness (part of libxml2, pre-installed on macOS/Linux) xmllint --noout document.xml # Exit code 0 = valid, non-zero = errors printed to stderr # Validate against an XSD schema xmllint --noout --schema schema.xsd document.xml # Validate against a DTD xmllint --noout --dtdvalid schema.dtd document.xml # Validate from stdin echo '<root><unclosed>' | xmllint --noout - # → :1: parser error : Premature end of data in tag unclosed line 1