名前空間入門

Qt XML モジュールのドキュメントの一部は、XML の名前空間に精通していることを前提としています。すでに知っている場合は、Qt XMLドキュメントの規約を読み飛ばしてください。

名前空間は、よりモジュール化された設計を可能にするために XML に導入された概念です。データ処理ソフトウエアは、名前空間の助けを借りて、XML ドキュメントの名前の衝突を簡単に解決することができます。

次の例を見てください:

<document>
<book>
  <title>Practical XML</title>
  <author title="Ms" name="Eris Kallisti"/>
  <chapter>
    <title>A Namespace Called fnord</title>
  </chapter>
</book>
</document>

ここでは、titleという名前に3つの異なる使い方がある。この文書を処理しようとすると、同じ名前であるにもかかわらず、それぞれのタイトルが異なる方法で表示されなければならないため、問題が発生します。

解決策としては、titleの最初の出現を本のタイトルとして識別する何らかの手段を持つこと、つまり、本の名前空間のtitle要素を使用して、例えば章のタイトルなどと区別することです:

<book:title>Practical XML</book:title>

この場合のbookは、名前空間を示す接頭辞です。

要素名や属性名に名前空間を適用する前に、それを宣言しなければなりません。

名前空間はhttp://www.example.com/fnord/book/ のようなURIです。これは、データがこのアドレスで利用可能でなければならないという意味ではなく、URIは単にユニークな名前を提供するために使用されます。

名前空間は属性と同じように宣言します。厳密には属性です。例えば、http://www.example.com/fnord/をドキュメントのデフォルトのXML名前空間xmlnsにするには、次のように記述します。

xmlns="http://example.com/fnord/"

http://www.example.com/fnord/book/名前空間をデフォルトと区別するために、接頭辞を付けなければなりません:

xmlns:book="http://example.com/fnord/book/"

このように宣言された名前空間は、適切な接頭辞と": "区切り文字を前に付けることで、要素名や属性名に適用することができます。これはすでにbook:title要素で見てきました。

接頭辞のない要素名はデフォルトの名前空間に属します。接頭辞のない属性は、宣言されたXML名前空間のどれにも属しません。接頭辞のない属性は、宣言された XML 名前空間のどれにも属さない。属性は常に、それが現れる要素の "伝統的な" 名前空間に属する。伝統的な "名前空間はXML名前空間ではなく、単に1つの要素に属するすべての属性名が異なっていなければならないことを意味します。XML名前空間を属性に割り当てる方法は後で説明します。

接頭辞のない属性はどのXML名前空間にも属さないため、(author要素に属する)属性titleと、例えば内のtitle要素との間に衝突はありません。

例で説明しましょう:

<document xmlns:book = 'http://example.com/fnord/book/'
          xmlns      = 'http://example.com/fnord/' >
<book>
  <book:title>Practical XML</book:title>
  <book:author xmlns:fnord = 'http://example.com/fnord/'
               title="Ms"
               fnord:title="Goddess"
               name="Eris Kallisti"/>
  <chapter>
    <title>A Namespace Called fnord</title>
  </chapter>
</book>
</document>

document要素の中に2つの名前空間が宣言されています。デフォルトの名前空間http://www.example.com/fnord/は、book要素、chapter要素、適切なtitle要素、そしてもちろんdocument自身に適用されます。

book:author要素とbook:title要素は、http://www.example.com/fnord/book/というURIを持つ名前空間に属します

二つのbook:author属性titleと nameにはXML名前空間が割り当てられていません。これらは要素book:authorの"伝統的な "名前空間のメンバーであり、例えばbook:authorの中に二つのtitle属性があることは禁じられています。

fnord:titleは book:author要素で宣言された接頭辞fnordを持つ名前空間のものです。

明らかに、fnord名前空間はデフォルトの名前空間と同じ名前空間URIを持っています。では、なぜすでに宣言したデフォルトの名前空間を単純に使わなかったのでしょうか?答えは非常に複雑です:

  • 接頭辞のない属性は、XML名前空間にはまったく属さず、デフォルトの名前空間にも属さないからです;
  • さらに、プレフィックスを省略すると、タイトルとタイトルの衝突につながります;
  • xmlns:titleと書くと、デフォルトのxmlns名前空間を適用する代わりに、接頭辞titleを持つ新しい名前空間を宣言することになります。

Qt XML クラスでは、要素や属性に 2 つの方法でアクセスできます。名前空間接頭辞と「実際の」名前(またはローカル名)で構成される修飾名を参照するか、ローカル名と名前空間 URI の組み合わせで参照します。

XML名前空間の詳細については、http://www.w3.org/TR/REC-xml-names/

Qt XML ドキュメントで使用される規約

以下の用語は、名前空間の文脈で名前の部分を区別するために使用されます:

  • 修飾名は、ドキュメントに現れる名前です。(上記の例では、book:titleが修飾名です)。
  • 修飾名内の名前空間接頭辞は、": "の左側の部分です(bookは book:titleの名前空間接頭辞です)。
  • 名前のローカル部分(ローカル名とも呼ばれる)は": "の右側に表示される(したがって、titleは book:titleのローカル部分である)。
  • 名前空間URI(「Uniform Resource Identifier」)は、名前空間の一意な識別子です。これはURLのように見えるが(例:http://www.example.com/fnord/)、指定されたアドレスに指定されたプロトコルでアクセスできるデータを必要としない。

": "のない要素(例のchapterのようなもの)は名前空間接頭辞を持ちません。この場合、ローカル部分と修飾名は同じです(つまりchapter)。

DOM Bookmarks Applicationも参照してください

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。