XML Validator
XML構文を検証して整形式エラーをチェック
XML入力
XML検証とは?
XMLバリデーターは、XMLドキュメントがXML 1.0仕様(W3C勧告、第5版)で定義された構造ルールに従っているかどうかを確認します。最低限として、このXMLバリデーターはドキュメントが「整形式」であることを確認します。つまり、ルート要素が1つであること、すべてのタグが適切にネストされ閉じられていること、属性値がクォートで囲まれていること、予約文字が定義済みエンティティを使用していることです。これらのチェックのいずれかに失敗したドキュメントは、XMLパーサーが誤った出力を黙って生成するのではなく、エラーをスローします。
整形式と妥当性の違いは重要です。整形式のXMLドキュメントはXML仕様自体の構文ルールを満たしています。妥当なXMLドキュメントはさらに一歩進んで、DTD(文書型定義)、XSD(XMLスキーマ定義)、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検証には3つのレベルがあります。このツールは最初のレベル(整形式)を確認します。これは他の2つの前提条件です。
コード例
さまざまな言語で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