XML名前空間の検証 — プレフィックス、URI、スコープ
XML名前空間宣言、プレフィックス、URIバインディングを検証します。名前空間スコープの仕組み、一般的な名前空間エラー、デフォルト名前空間、未宣言プレフィックスの問題修正方法を解説します。
Validation
詳細な説明
XML名前空間の検証
XML名前空間は、異なるソースからのXML語彙を組み合わせる際の要素名と属性名の衝突を防止します。名前空間エラーは複雑なXMLドキュメントで最も一般的な問題の一つです。
名前空間宣言の構文
<!-- デフォルト名前空間 -->
<feed xmlns="http://www.w3.org/2005/Atom">
<title>My Feed</title>
</feed>
<!-- プレフィックス付き名前空間 -->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>...</soap:Body>
</soap:Envelope>
一般的な名前空間エラー
未宣言プレフィックス:
<!-- エラー:"ws"プレフィックスが未宣言 -->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ws:GetUser>42</ws:GetUser>
</soap:Body>
</soap:Envelope>
修正方法は、EnvelopeまたはBody要素に xmlns:ws="http://example.com/webservice" を追加することです。
重複プレフィックス宣言:
<!-- 紛らわしい:同じプレフィックス、異なるレベルで異なるURI -->
<root xmlns:ns="http://example.com/v1">
<child xmlns:ns="http://example.com/v2">
<ns:element /> <!-- ここではv2にバインド -->
</child>
</root>
技術的には有効ですが、子スコープ内でプレフィックスを異なるURIに再バインドすることは紛らわしくエラーを引き起こしやすいです。
名前空間スコープ
名前空間宣言は、宣言された要素とそのすべての子孫に適用されます(同じプレフィックスの新しい宣言でオーバーライドされない限り)。
デフォルト名前空間 vs. プレフィックス付き
デフォルト名前空間(xmlns="...")はプレフィックスなし要素に適用されますが、プレフィックスなし属性には適用されません。これは一般的な混乱の原因です:
<root xmlns="http://example.com">
<child attr="value" />
<!-- "child"はhttp://example.com名前空間内 -->
<!-- "attr"は名前空間なし -->
</root>
名前空間の検証
名前空間対応パーサーは、すべてのプレフィックス付き要素と属性に対応する xmlns 宣言がスコープ内にあることを確認します。フォーマッターは未宣言プレフィックスをハイライトし、不足している宣言の追加を支援します。
ユースケース
名前空間検証は、SOAP Webサービス、XSLT変換、複数語彙XMLドキュメント(XHTMLに埋め込まれたSVG)、XML Schema検証、複数システムからのXMLを単一ドキュメントに結合する統合シナリオで作業する際に不可欠です。