サーチ…


備考

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>


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow