サーチ…
備考
XMLの要素名と属性名は、QNames(修飾名)と呼ばれます。
QNameは次のもので構成されます。
- 名前空間(URI)
- 接頭辞(コロンを含まないNCName、NC)
- ローカル名(NCName)
名前空間とローカル名のみが2つのQNameを比較するのに関係します。接頭辞は名前空間のプロキシだけです。
名前空間と接頭辞はオプションですが、接頭辞が存在する場合は常に存在します(これは構文レベルで保証されているため、間違って実行することはできません)。
QNameの字句表現はprefix:local-name
です。ネームスペースは、特別なxmlns:...
アトリビュートを使用して個別にバインドされます(注意: xmlで始まるアトリビュートはXMLで予約されています)。
接頭辞が空の場合、QNameの字句表現にはコロンは使用されず、 local-name
のみが含まれます。空の接頭辞を持つQNamesは、名前空間を持たないか(デフォルト名前空間が有効範囲にない場合)、またはデフォルト名前空間にあります。
プレフィックスを名前空間にバインドする
名前空間はURIですが、冗長性を避けるために、接頭辞はプロキシとして使用されます。
次の例では、特殊な属性xmlns:my-prefix
を使用して、接頭辞my-prefix
がネームスペースhttp://www.example.com/my-namespace
バインドされています( my-prefix
は他の接頭辞で置き換えることができます) :
<?xml version="1.0"?>
<my-prefix:foo xmlns:my-prefix="http://www.example.com/my-namespace">
<!-- the element my-prefix:foo
lives in the namespace http://www.example.com/my-namespace -->
</my-prefix:foo>
名前空間の不在
XMLでは、要素と属性の名前は名前空間にあります。
デフォルトでは、名前空間はありません。
<?xml version="1.0"?>
<foo attr="value">
<!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>
接頭辞の無関係
これらの2つのドキュメントは、名前空間が重要であるため、接頭辞ではなく、意味的に同等です。
<?xml version="1.0"?>
<myns:foo xmlns:myns="http://www.example.com/my-namespace">
</myns:foo>
<?xml version="1.0"?>
<ns:foo xmlns:ns="http://www.example.com/my-namespace">
</ns:foo>
既定の名前空間
デフォルトの名前空間は、接頭辞がない場合の名前空間です。特殊なxmlns
属性で宣言できます。
<?xml version="1.0"?>
<foo xmlns="http://www.example.com/my-namespace">
<!-- the element foo is in the namespace
http://www.example.com/my-namespace -->
</foo>
デフォルトの名前空間が宣言されていない場合、接頭辞のない名前は名前空間にありません。
接頭辞のない属性名
要素と属性は、デフォルトの名前空間とは異なる動作をします。これはしばしば混乱の原因となります。
名前に接頭辞がない属性は、デフォルトの名前空間がスコープ内にある場合でも、名前空間には存在しません。
<?xml version="1.0"?>
<foo attr="value" xmlns="http://www.example.com/my-namespace">
<!-- The attribute attr is in no namespace, even though
a default namespace is in scope. The element foo,
however, is in the default namespace. -->
</foo>
名前空間のバインディングの範囲
名前空間バインディング(特殊なxmlns
またはxmlns:...
属性)は、この要素を含む、囲む要素のすべての子孫の有効範囲内にあります。
<?xml version="1.0"?>
<root>
<my:element xmlns:my="http://www.example.com/ns1">
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
</my:element>
<my:element xmlns:my="http://www.example.com/ns2">
<!-- here, the prefix my is bound to http://www.example.com/ns2 -->
</my:element>
</root>
バインディングはネストされた要素でオーバーライドすることができます(これは可読性にも影響します)。
<?xml version="1.0"?>
<my:element xmlns:my="http://www.example.com/ns1">
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
<my:first-child-element/>
<my:child-element xmlns:my="http://www.example.com/ns2">
<!-- here, the prefix my is bound to http://www.example.com/ns2,
including for the element my:child-element -->
</my:child-element>
<!-- here, the prefix my is bound to http://www.example.com/ns1 -->
<my:last-child-element/>
</my:element>
すべての名前空間バインディングをルート要素に宣言することは非常に一般的です。これは可読性を向上させます。
<?xml version="1.0"?>
<root
xmlns="http://www.example.com/default-namespace"
xmlns:ns1="http://www.example.com/ns1"
xmlns:ns2="http://www.example.com/ns2">
<ns1:element>
<ns2:other-element/>
</ns1:element>
</root>