19.8. "xml.dom" --- 文書オブジェクトモデル (DOM) API
****************************************************

バージョン 2.0 で追加.

文書オブジェクトモデル (Document Object Model)、すなわち "DOM" は、ワ
ールドワイドウェブコンソーシアム (World Wide Web Consortium, W3C) によ
る、XML ドキュメントにアクセスしたり変更を加えたりするための、プログラ
ミング言語間共通の API です。DOM 実装によって、XML ドキュメントはツリ
ー構造として表現されます。また、クライアントコード側でツリー構造をゼロ
から構築できるようになります。さらに、前述の構造に対して、よく知られた
インタフェースをもつ一連のオブジェクトを通したアクセス手段も提供します
。

DOM はランダムアクセスを行うアプリケーションで非常に有用です。SAX では
、一度に閲覧することができるのはドキュメントのほんの一部分です。ある
SAX 要素に注目している際には、別の要素をアクセスすることはできません。
またテキストノードに注目しているときには、その中に入っている要素をアク
セスすることができません。SAX によるアプリケーションを書くときには、プ
ログラムがドキュメント内のどこを処理しているのかを追跡するよう、コード
のどこかに記述する必要があります。SAX 自体がその作業を行ってくれること
はありません。さらに、XML ドキュメントに対する先読み (look ahead) が必
要だとすると不運なことになります。

アプリケーションによっては、ツリーにアクセスできなければイベント駆動モ
デルを実現できません。もちろん、何らかのツリーを SAX イベントに応じて
自分で構築することもできるでしょうが、DOM ではそのようなコードを書かな
くてもよくなります。DOM は XML データに対する標準的なツリー表現なので
す。

文書オブジェクトモデルは、W3C によっていくつかの段階、W3C の用語で言え
ば "レベル (level)" で定義されています。Python においては、DOM API へ
の対応付けは実質的には DOM レベル 2 勧告に基づいています。

DOM アプリケーションは、普通は XML を DOM に解析するところから始まりま
す。どのようにして解析を行うかについては DOM レベル 1 では全くカバーし
ておらず、レベル 2 では限定的な改良だけが行われました: レベル 2 では
"Document" を生成するメソッドを提供する "DOMImplementation" オブジェク
トクラスがありますが、実装に依存しない方法で XML リーダ(reader)/パーザ
(parser)/文書ビルダ (Document builder) にアクセスする方法はありません
。また、既存の "Document" オブジェクトなしにこれらのメソッドにアクセス
するような、よく定義された方法もありません。 Python では、各々の DOM
実装で "getDOMImplementation()" が定義されているはずです。 DOM レベル
3 ではロード(Load)/ストア(Store) 仕様が追加され、リーダのインタフェー
スにを定義していますが、Python 標準ライブラリではまだ利用することがで
きません。

DOM 文書オブジェクトを生成したら、そのプロパティとメソッドを使って XML
文書の一部にアクセスできます。これらのプロパティは DOM 仕様で定義され
ています; 本リファレンスマニュアルでは、Python において DOM 仕様がどの
ように解釈されているかを記述しています。

W3C から提供されている仕様は、 DOM API を Java、ECMAScript、および OMG
IDL で定義しています。ここで定義されている Python での対応づけは、大部
分がこの仕様の IDL 版に基づいていますが、厳密な準拠は必要とされていま
せん (実装で IDL の厳密な対応付けをサポートするのは自由ですが)。API へ
の対応付けに関する詳細な議論は 適合性 を参照してください。

参考:

  Document Object Model (DOM) Level 2 Specification
     Python DOM API が準拠している W3C 勧告。

  Document Object Model (DOM) Level 1 Specification
     "xml.dom.minidom" でサポートされている W3C の DOM に関する勧告。

  Python Language Mapping Specification
     このドキュメントでは OMG IDL から Python への対応付けを記述してい
     ます。


19.8.1. モジュールコンテンツ
============================

"xml.dom" には以下の関数があります:

xml.dom.registerDOMImplementation(name, factory)

   ファクトリ関数 (factory function) *factory* を名前 *name* で登録し
   ます。ファクトリ関数は "DOMImplementation" インタフェースを実装する
   オブジェクトを返さなければなりません。特定の実装 (例えば実装が何ら
   かのカスタマイズをサポートしている場合) に適切となるように、ファク
   トリ関数は毎回同じオブジェクトを返したり、呼び出しごとに新しいオブ
   ジェクトを返したりすることが出来ます。

xml.dom.getDOMImplementation([name[, features]])

   適切な DOM 実装を返します。*name* は、よく知られた DOM 実装のモジュ
   ール名か、 "None" になります。 "None" でない場合、対応するモジュー
   ルを import して、import が成功した場合 "DOMImplementation" オブジ
   ェクトを返します。 *name* が与えられておらず、環境変数 "PYTHON_DOM"
   が設定されていた場合、 DOM 実装を見つけるのに環境変数が使われます。

   *name* が与えられない場合、利用可能な実装を調べて、指定された機能
   (feature) セットを持つものを探します。実装が見つからなければ
   "ImportError" を送出します。 *features* のリストは "(feature,
   version)" のペアからなるシーケンスで、利用可能な
   "DOMImplementation" オブジェクトの "hasFeature()" メソッドに渡され
   ます。

いくつかの便利な定数も提供されています:

xml.dom.EMPTY_NAMESPACE

   DOM 内のノードに名前空間が何も関連づけられていないことを示すために
   使われる値です。この値は通常、ノードの "namespaceURI" の値として見
   つかったり、名前空間特有のメソッドに対する *namespaceURI* パラメタ
   として使われます。

   バージョン 2.2 で追加.

xml.dom.XML_NAMESPACE

   Namespaces in XML (4 節) で定義されている、予約済みプレフィクス
   (reserved prefix) "xml" に関連付けられた名前空間 URI です。

   バージョン 2.2 で追加.

xml.dom.XMLNS_NAMESPACE

   Document Object Model (DOM) Level 2 Core Specification (1.1.8 節)
   で定義されている、名前空間宣言への名前空間 URI です。

   バージョン 2.2 で追加.

xml.dom.XHTML_NAMESPACE

   XHTML 1.0: The Extensible HyperText Markup Language (3.1.1 節) で定
   義されている、XHTML 名前空間 URI です。

   バージョン 2.2 で追加.

加えて、 "xml.dom" には基底となる "Node" クラスと DOM 例外クラスが収め
られています。このモジュールで提供されている "Node" クラスは DOM 仕様
で定義されているメソッドや属性は何ら実装していません; これらは具体的な
DOM 実装において提供しなければなりません。このモジュールの一部として提
供されている "Node" クラスでは、具体的な "Node" オブジェクトの
"nodeType" 属性として使う定数を提供しています; これらの定数は、DOM 仕
様に適合するため、クラスではなくモジュールのレベルに配置されています。


19.8.2. DOM 内のオブジェクト
============================

DOM について最も明確に限定しているドキュメントは W3C による DOM 仕様で
す。

DOM 属性は単純な文字列としてだけではなく、ノードとして操作されるかもし
れないので注意してください。とはいえ、そうしなければならない場合はかな
り稀なので、今のところ記述されていません。

+----------------------------------+-------------------------------------+-----------------------------------+
| インタフェース                   | 節                                  | 目的                              |
+==================================+=====================================+===================================+
| "DOMImplementation"              | DOMImplementation オブジェクト      | 根底にある実装へのインタフェース  |
|                                  |                                     | 。                                |
+----------------------------------+-------------------------------------+-----------------------------------+
| "Node"                           | Node オブジェクト                   | ドキュメント内の大部分のオブジェ  |
|                                  |                                     | クトに対する基底インタフェース。  |
+----------------------------------+-------------------------------------+-----------------------------------+
| "NodeList"                       | NodeList オブジェクト               | ノード列に対するインタフェース。  |
+----------------------------------+-------------------------------------+-----------------------------------+
| "DocumentType"                   | DocumentType オブジェクト           | ドキュメントの処理に必要な宣言に  |
|                                  |                                     | ついての情報。                    |
+----------------------------------+-------------------------------------+-----------------------------------+
| "Document"                       | Document オブジェクト               | ドキュメント全体を表現するオブジ  |
|                                  |                                     | ェクト。                          |
+----------------------------------+-------------------------------------+-----------------------------------+
| "Element"                        | Element オブジェクト                | ドキュメント階層内の要素ノード。  |
+----------------------------------+-------------------------------------+-----------------------------------+
| "Attr"                           | Attr オブジェクト                   | 要素ノード上の属性値ノード。      |
+----------------------------------+-------------------------------------+-----------------------------------+
| "Comment"                        | Comment オブジェクト                | ソースドキュメント内のコメント表  |
|                                  |                                     | 現。                              |
+----------------------------------+-------------------------------------+-----------------------------------+
| "Text"                           | Text オブジェクトおよび             | ドキュメント内のテキスト記述を含  |
|                                  | CDATASection オブジェクト           | むノード。                        |
+----------------------------------+-------------------------------------+-----------------------------------+
| "ProcessingInstruction"          | ProcessingInstruction オブジェクト  | 処理命令 (processing instruction) |
|                                  |                                     | 表現。                            |
+----------------------------------+-------------------------------------+-----------------------------------+

さらに追加の節として、Python で DOM を利用するために定義されている例外
について記述しています。


19.8.2.1. DOMImplementation オブジェクト
----------------------------------------

"DOMImplementation" インタフェースは、利用している DOM 実装において特
定の機能が利用可能かどうかを決定するための方法をアプリケーションに提供
します。DOM レベル 2 では、 "DOMImplementation" を使って新たな
"Document" オブジェクトや "DocumentType" オブジェクトを生成する機能も
追加しています。

DOMImplementation.hasFeature(feature, version)

   機能名 *feature* とバージョン番号 *version* で識別される機能（
   feature）が実装されていれば真を返します。

DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)

   新たな(DOMのスーパークラスである) "Document" クラスのオブジェクトを
   返します。このクラスは *namespaceUri* と *qualifiedName* が設定され
   た子クラス "Element" のオブジェクトを所有しています。 *doctype* は
   "createDocumentType()" によって生成された "DocumentType" クラスのオ
   ブジェクト、または "None" である必要があります。 Python DOM APIでは
   、子クラスである "Element" を作成しないことを示すために、はじめの２
   つの引数を "None" に設定することができます。

DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)

   新たな "DocumentType" クラスのオブジェクトを返します。このオブジェ
   クトは *qualifiedName* 、 *publicId* 、そして *systemId* 文字列をふ
   くんでおり、XML文書の形式情報を表現しています。


19.8.2.2. Node オブジェクト
---------------------------

XML 文書の全ての構成要素は "Node" のサブクラスです。

Node.nodeType

   ノード (node) の型を表現する整数値です。型に対応する以下のシンボル
   定数: "ELEMENT_NODE" 、 "ATTRIBUTE_NODE" 、 "TEXT_NODE" 、
   "CDATA_SECTION_NODE" 、 "ENTITY_NODE" 、
   "PROCESSING_INSTRUCTION_NODE" 、 "COMMENT_NODE" 、 "DOCUMENT_NODE"
   、 "DOCUMENT_TYPE_NODE" 、 "NOTATION_NODE" 、が "Node" オブジェクト
   で定義されています。読み出し専用の属性です。

Node.parentNode

   現在のノードの親ノードか、文書ノードの場合には "None" になります。
   この値は常に "Node" オブジェクトか "None" になります。 "Element" ノ
   ードの場合、この値はルート要素 (root element) の場合を除き親要素
   (parent element) となり、ルート要素の場合には "Document" オブジェク
   トとなります。 "Attr" ノードの場合、この値は常に "None" となります
   。読み出し専用の属性です。

Node.attributes

   属性オブジェクトの "NamedNodeMap" です。要素だけがこの属性に実際の
   値を持ちます; その他のオブジェクトでは、この属性を "None" にします
   。読み出し専用の属性です。

Node.previousSibling

   このノードと同じ親ノードを持ち、直前にくるノードです。例えば、
   *self* 要素のの開始タグの直前にくる終了タグを持つ要素です。もちろん
   、XML 文書は要素だけで構成されているだけではないので、直前にくる兄
   弟関係にある要素 (sibling) はテキストやコメント、その他になる可能性
   があります。このノードが親ノードにおける先頭の子ノードである場合、
   属性値は "None" になります。読み出し専用の属性です。

Node.nextSibling

   このノードと同じ親ノードを持ち、直後にくるノードです。例えば、
   "previousSibling" も参照してください。このノードが親ノードにおける
   末尾頭の子ノードである場合、属性値は "None" になります。読み出し専
   用の属性です。

Node.childNodes

   このノード内に収められているノードからなるリストです。読み出し専用
   の属性です。

Node.firstChild

   このノードに子ノードがある場合、その先頭のノードです。そうでない場
   合 "None" になります。読み出し専用の属性です。

Node.lastChild

   このノードに子ノードがある場合、その末尾のノードです。そうでない場
   合 "None" になります。読み出し専用の属性です。

Node.localName

   "tagName" にコロンがあれば、コロン以降の部分に、なければ "tagName"
   全体になります。値は文字列です。

Node.prefix

   "tagName" のコロンがあれば、コロン以前の部分に、なければ空文字列に
   なります。値は文字列か、 "None" になります。

Node.namespaceURI

   要素名に関連付けられた名前空間です。文字列か "None" になります。読
   み出し専用の属性です。

Node.nodeName

   この属性はノード型ごとに異なる意味を持ちます; 詳しくは DOM 仕様を参
   照してください。この属性で得られることになる情報は、全てのノード型
   では "tagName" 、属性では "name" プロパティといったように、常に他の
   プロパティで得ることができます。全てのノード型で、この属性の値は文
   字列か "None" になります。読み出し専用の属性です。

Node.nodeValue

   この属性はノード型ごとに異なる意味を持ちます; 詳しくは DOM 仕様を参
   照してください。その序今日は "nodeName" と似ています。この属性の値
   は文字列か "None" になります。

Node.hasAttributes()

   ノードが何らかの属性を持っている場合に真を返します。

Node.hasChildNodes()

   ノードが何らかの子ノードを持っている場合に真を返します。

Node.isSameNode(other)

   *other* がこのノードと同じノードを参照している場合に真を返します。
   このメソッドは、何らかのプロキシ (proxy) 機構を利用するような DOM
   実装で特に便利です (一つ以上のオブジェクトが同じノードを参照するか
   もしれないからです)。

   注釈: このメソッドは DOM レベル 3 API で提案されており、まだ "ワ
     ーキン グドラフト(working draft)" の段階です。しかし、このインタ
     フェース だけは議論にはならないと考えられます。W3C による変更は必
     ずしも Python DOM インタフェースにおけるこのメソッドに影響すると
     は限りま せん (ただしこのメソッドに対する何らかの新たな W3C API
     もサポート されるかもしれません)。

Node.appendChild(newChild)

   現在のノードの子ノードリストの末尾に新たな子ノードを追加し、
   *newChild* を返します。もしノードが既にツリーにあれば、最初に削除さ
   れます。

Node.insertBefore(newChild, refChild)

   新たな子ノードを既存の子ノードの前に挿入します。 *refChild* は現在
   のノードの子ノードである場合に限られます; そうでない場合、
   "ValueError" が送出されます。 *newChild* が返されます。もし
   *refChild* が "None" なら、 *newChild* を子ノードリストの最後に挿入
   します。

Node.removeChild(oldChild)

   子ノードを削除します。 *oldChild* はこのノードの子ノードでなければ
   なりません。そうでない場合、 "ValueError" が送出されます。成功した
   場合 *oldChild* が返されます。 *oldChild* をそれ以降使わない場合、
   "unlink()" メソッドを呼び出さなければなりません。

Node.replaceChild(newChild, oldChild)

   既存のノードと新たなノードを置き換えます。この操作は *oldChild* が
   現在のノードの子ノードである場合に限られます; そうでない場合、
   "ValueError" が送出されます。

Node.normalize()

   一続きのテキスト全体を一個の "Text" インスタンスとして保存するため
   に隣接するテキストノードを結合します。これにより、多くのアプリケー
   ションで DOM ツリーからのテキスト処理が簡単になります。

   バージョン 2.1 で追加.

Node.cloneNode(deep)

   このノードを複製 (clone) します。*deep* を設定すると、子ノードも同
   様に複製することを意味します。複製されたノードを返します。


19.8.2.3. NodeList オブジェクト
-------------------------------

"NodeList" はノードのシーケンスを表現します。 これらのオブジェクトは
DOM コア勧告 (DOM Core recommendation) において、二通りに使われていま
す: "Element" オブジェクトでは、子ノードのリストを提供するのに
"NodeList" を利用します。 また、このインタフェースにおける "Node" の
"getElementsByTagName()" および "getElementsByTagNameNS()" メソッドは
、クエリに対する結果を表現するのに "NodeList" を利用します。

DOM レベル 2 勧告では、これらのオブジェクトに対し、メソッドと属性を一
つづつ定義しています:

NodeList.item(i)

   存在する場合シークエンスの *i* 番目の要素を、そうでない場合 "None"
   を返します。*i* は 0 未満やシークエンスの長さ以上であってはなりませ
   ん。

NodeList.length

   シーケンス中のノードの数です。

この他に、Python の DOM インタフェースでは、 "NodeList" オブジェクトを
Python のシーケンスとして使えるようにするサポートが追加されていること
が必要です。 "NodeList"  の実装では、全て "__len__()" と
"__getitem__()" をサポートしなければなりません; このサポートにより、
"for"  文内で "NodeList" にわたる繰り返しと、組み込み関数 "len()" の適
切なサポートができるようになります。

DOM 実装が文書の変更をサポートしている場合、 "NodeList"  の実装でも
"__setitem__()" および "__delitem__()" メソッドをサポートしなければな
りません。


19.8.2.4. DocumentType オブジェクト
-----------------------------------

文書で宣言されている記法 (notation) やエンティティ (entity) に関する (
外部サブセット(external subset) がパーザから利用でき、情報を提供できる
場合にはそれも含めた) 情報は、 "DocumentType" オブジェクトから手に入れ
ることができます。文書の "DocumentType" は、 "Document" オブジェクトの
"doctype" 属性で入手することができます; 文書の "DOCTYPE" 宣言がない場
合、文書の "doctype" 属性は、このインタフェースを持つインスタンスの代
わりに "None" に設定されます。

"DocumentType" は "Node" を特殊化したもので、以下の属性を加えています:

DocumentType.publicId

   文書型定義 (document type definition) の外部サブセットに対する公開
   識別子 (public identifier) です。文字列または "None" になります。

DocumentType.systemId

   文書型定義 (document type definition) の外部サブセットに対するシス
   テム識別子 (system identifier) です。文字列の URI または "None" に
   なります。

DocumentType.internalSubset

   ドキュメントの完全な内部サブセットを与える文字列です。サブセットを
   囲むブラケットは含みません。ドキュメントが内部サブセットを持たない
   場合、この値は "None" です。

DocumentType.name

   "DOCTYPE" 宣言でルート要素の名前が与えられている場合、その値になり
   ます。

DocumentType.entities

   外部エンティティの定義を与える "NamedNodeMap" です。複数回定義され
   ているエンティティに対しては、最初の定義だけが提供されます (その他
   は XML 勧告での要求仕様によって無視されます)。パーザによって情報が
   提供されないか、エンティティが定義されていない場合には、この値は
   "None" になることがあります。

DocumentType.notations

   記法の定義を与える "NamedNodeMap" です。複数回定義されている記法名
   に対しては、最初の定義だけが提供されます (その他は XML 勧告での要求
   仕様によって無視されます)。パーザによって情報が提供されないか、エン
   ティティが定義されていない場合には、この値は "None" になることがあ
   ります。


19.8.2.5. Document オブジェクト
-------------------------------

"Document" は XML ドキュメント全体を表現し、その構成要素である要素、属
性、処理命令、コメント等がを持ちます。 "Document" は "Node" からプロパ
ティを継承していることを思い出してください。

Document.documentElement

   ドキュメントの唯一無二のルート要素です。

Document.createElement(tagName)

   新たな要素ノードを生成して返します。要素は、生成された時点ではドキ
   ュメント内に挿入されません。 "insertBefore()" や "appendChild()" の
   ような他のメソッドの一つを使って明示的に挿入を行う必要があります。

Document.createElementNS(namespaceURI, tagName)

   名前空間を伴う新たな要素ノードを生成して返します。 *tagName* には接
   頭辞 (prefix) があってもかまいません。要素は、生成された時点では文
   書内に挿入されません。 "insertBefore()" や "appendChild()" のような
   他のメソッドの一つを使って明示的に挿入を行う必要があります。
   "appendChild()".

Document.createTextNode(data)

   引数として渡されたデータの入ったテキストノードを生成して返します。
   他の生成 (create) メソッドと同じく、このメソッドは生成されたノード
   をツリーに挿入しません。

Document.createComment(data)

   引数として渡されたデータの入ったコメントノードを生成して返します。
   他の生成 (create) メソッドと同じく、このメソッドは生成されたノード
   をツリーに挿入しません。

Document.createProcessingInstruction(target, data)

   引数として渡された *target* および *data* の入った処理命令ノードを
   生成して返します。他の生成 (create) メソッドと同じく、このメソッド
   は生成されたノードをツリーに挿入しません。

Document.createAttribute(name)

   属性ノードを生成して返します。このメソッドは属性ノードを特定の要素
   に関連づけることはしません。新たに生成された属性インスタンスを使う
   には、適切な "Element" オブジェクトの "setAttributeNode()" を使わな
   ければなりません。

Document.createAttributeNS(namespaceURI, qualifiedName)

   名前空間を伴う新たな属性ノードを生成して返します。 *tagName* には接
   頭辞 (prefix) があってもかまいません。このメソッドは属性ノードを特
   定の要素に関連づけることはしません。新たに生成された属性インスタン
   スを使うには、適切な "Element" オブジェクトの "setAttributeNode()"
   を使わなければなりません。

Document.getElementsByTagName(tagName)

   全ての下位要素 (直接の子要素、子要素の子要素等) から特定の要素型名
   を持つものを検索します。

Document.getElementsByTagNameNS(namespaceURI, localName)

   全ての下位要素 (直接の子要素、子要素の子要素等) から特定の名前空間
   URI とローカル名 (local name) を持つものを検索します。ローカル名は
   名前空間における接頭辞以降の部分です。


19.8.2.6. Element オブジェクト
------------------------------

"Element" は "Node" のサブクラスです。このため "Node" クラスの全ての属
性を継承します。

Element.tagName

   要素型名です。名前空間使用の文書では、要素型名中にコロンがあるかも
   しれません。値は文字列です。

Element.getElementsByTagName(tagName)

   "Document" クラス内における同名のメソッドと同じです。

Element.getElementsByTagNameNS(namespaceURI, localName)

   "Document" クラス内における同名のメソッドと同じです。

Element.hasAttribute(name)

   指定要素に *name* で渡した名前の属性が存在していれば真を返します。

Element.hasAttributeNS(namespaceURI, localName)

   指定要素に *namespaceURI* と *localName* で指定した名前の属性が存在
   していれば真を返します。

Element.getAttribute(name)

   *name* で指定した属性の値を文字列として返します。もし、属性が存在し
   ない、もしくは属性に値が設定されていない場合、空の文字列が返されま
   す。

Element.getAttributeNode(attrname)

   *attrname* で指定された属性の "Attr" ノードを返します。

Element.getAttributeNS(namespaceURI, localName)

   *namespaceURI* と *localName* によって指定した属性の値を文字列とし
   て返します。もし、属性が存在しない、もしくは属性に値が設定されてい
   ない場合、空の文字列が返されます。

Element.getAttributeNodeNS(namespaceURI, localName)

   指定した *namespaceURI* および *localName* を持つ属性値をノードとし
   て返します。

Element.removeAttribute(name)

   名前で指定された属性を削除します。該当する属性がない場合、
   "NotFoundErr" が送出されます。

Element.removeAttributeNode(oldAttr)

   *oldAttr* が属性リストにある場合、削除して返します。 *oldAttr* が存
   在しない場合、 "NotFoundErr" が送出されます。

Element.removeAttributeNS(namespaceURI, localName)

   名前で指定された属性を削除します。このメソッドは *qname* ではなく
   *localName* を使うので注意してください。該当する属性がなくても例外
   は送出されません。

Element.setAttribute(name, value)

   文字列を使って属性値を設定します。

Element.setAttributeNode(newAttr)

   新たな属性ノードを要素に追加します。 "name" 属性が既存の属性に一致
   した場合、必要に応じて属性を置換します。置換が行われると古い属性ノ
   ードが返されます。 *newAttr* がすでに使われていれば、
   "InuseAttributeErr" が送出されます。

Element.setAttributeNodeNS(newAttr)

   新たな属性ノードを要素に追加します。 "namespaceURI" および
   "localName" 属性が既存の属性に一致した場合、必要に応じて属性を置き
   換えます。置換が生じると、古い属性ノードが返されます。 *newAttr* が
   すでに使われていれば、 "InuseAttributeErr" が送出されます。

Element.setAttributeNS(namespaceURI, qname, value)

   指定された *namespaceURI* および *qname* で与えられた属性の値を文字
   列で設定します。qname は属性の完全な名前であり、この点が上記のメソ
   ッドと違うので注意してください。


19.8.2.7. Attr オブジェクト
---------------------------

"Attr" は "Node" を継承しており、全ての属性を継承しています。

Attr.name

   要素型名です。名前空間使用の文書では、要素型名中にコロンが含まれる
   かもしれません。

Attr.localName

   名前にコロンがあればコロン以降の部分に、なければ名前全体になります
   。

Attr.prefix

   名前にコロンがあればコロン以前の部分に、なければ空文字列になります
   。

Attr.value

   その要素の text value. これは "nodeValue" 属性の別名です。


19.8.2.8. NamedNodeMap Objects
------------------------------

"NamedNodeMap" は "Node" を継承して *いません* 。

NamedNodeMap.length

   属性リストの長さです。

NamedNodeMap.item(index)

   特定のインデクスを持つ属性を返します。属性の並び方は任意ですが、
   DOM 文書が生成されている間は一定になります。各要素は属性ノードです
   。属性値はノードの "value" 属性で取得してください。

このクラスをよりマップ型的な動作ができるようにする実験的なメソッドもあ
ります。そうしたメソッドを使うこともできますし、 "Element" オブジェク
トに対して、標準化された "getAttribute*()" ファミリのメソッドを使うこ
ともできます。


19.8.2.9. Comment オブジェクト
------------------------------

"Comment" は XML 文書中のコメントを表現します。 "Comment" は "Node" の
サブクラスですが、子ノードを持つことはありません。

Comment.data

   文字列によるコメントの内容です。この属性には、コメントの先頭にある
   "<!-" "-" と末尾にある "-" "->" 間の全ての文字が入っていますが、
   "<!-" "-" と "-" "->" 自体は含みません。


19.8.2.10. Text オブジェクトおよび CDATASection オブジェクト
------------------------------------------------------------

"Text" インタフェースは XML 文書内のテキストを表現します。パーザおよび
DOM 実装が DOM の XML 拡張をサポートしている場合、 CDATA でマークされ
た区域 (section) に入れられている部分テキストは "CDATASection" オブジ
ェクトに記憶されます。これら二つのインタフェースは同一のものですが、
"nodeType" 属性が異なります。

これらのインタフェースは "Node" インタフェースを拡張したものです。しか
し子ノードを持つことはできません。

Text.data

   文字列によるテキストノードの内容です。

注釈: "CDATASection" ノードの利用は、ノードが完全な CDATA マーク区域
  を表現 するという意味ではなく、ノードの内容が CDATA 区域の一部である
  という ことを意味するだけです。単一の CDATA セクションは文書ツリー内
  で複数 のノードとして表現されることがあります。二つの隣接する
  "CDATASection" ノードが、異なる CDATA マーク区域かどうかを決定する方
  法はありません。


19.8.2.11. ProcessingInstruction オブジェクト
---------------------------------------------

XML 文書内の処理命令を表現します; "Node" インタフェースを継承していま
すが、子ノードを持つことはできません。

ProcessingInstruction.target

   最初の空白文字までの処理命令の内容です。読み出し専用の属性です。

ProcessingInstruction.data

   最初の空白文字以降の処理命令の内容です。


19.8.2.12. 例外
---------------

バージョン 2.1 で追加.

DOM レベル 2 勧告では、単一の例外 "DOMException" と、どの種のエラーが
発生したかをアプリケーションが決定できるようにする多くの定数を定義して
います。 "DOMException" インスタンスは、特定の例外に関する適切な値を提
供する "code" 属性を伴っています。

Python DOM インタフェースでは、上記の定数を提供していますが、同時に一
連の例外を拡張して、DOM で定義されている各例外コードに対して特定の例外
が存在するようにしています。 DOM の実装では、適切な特定の例外を送出し
なければならず、各例外は "code" 属性に対応する適切な値を伴わなければな
りません。

exception xml.dom.DOMException

   全ての特定の DOM 例外で使われている基底例外クラスです。この例外クラ
   スを直接インスタンス化することはできません。

exception xml.dom.DomstringSizeErr

   指定された範囲のテキストが文字列に収まらない場合に送出されます。こ
   の例外は Python の DOM 実装で使われるかどうかは判っていませんが、
   Python で書かれていない DOM 実装から送出される場合があります。

exception xml.dom.HierarchyRequestErr

   挿入できない型のノードを挿入しようと試みたときに送出されます。

exception xml.dom.IndexSizeErr

   メソッドに与えたインデクスやサイズパラメタが負の値や許容範囲の値を
   超えた際に送出されます。

exception xml.dom.InuseAttributeErr

   文書中にすでに存在する "Attr" ノードを挿入しようと試みた際に送出さ
   れます。

exception xml.dom.InvalidAccessErr

   パラメタまたは操作が根底にあるオブジェクトでサポートされていない場
   合に送出されます。

exception xml.dom.InvalidCharacterErr

   この例外は、文字列パラメタが、現在使われているコンテキストで XML
   1.0 勧告によって許可されていない場合に送出されます。例えば、要素型
   に空白の入った "Element" ノードを生成しようとすると、このエラーが送
   出されます。

exception xml.dom.InvalidModificationErr

   ノードの型を変更しようと試みた際に送出されます。

exception xml.dom.InvalidStateErr

   定義されていないオブジェクトや、もはや利用できなくなったオブジェク
   トを使おうと試みた際に送出されます。

exception xml.dom.NamespaceErr

   Namespaces in XML に照らして許可されていない方法でオブジェクトを変
   更しようと試みた場合、この例外が送出されます。

exception xml.dom.NotFoundErr

   参照しているコンテキスト中に目的のノードが存在しない場合に送出され
   る例外です。例えば、 "NamedNodeMap.removeNamedItem()" は渡されたノ
   ードがノードマップ中に存在しない場合にこの例外を送出します。

exception xml.dom.NotSupportedErr

   要求された方のオブジェクトや操作が実装でサポートされていない場合に
   送出されます。

exception xml.dom.NoDataAllowedErr

   データ属性をサポートしないノードにデータを指定した際に送出されます
   。

exception xml.dom.NoModificationAllowedErr

   オブジェクトに対して (読み出し専用ノードに対する修正のように) 許可
   されていない修正を行おうと試みた際に送出されます。

exception xml.dom.SyntaxErr

   無効または不正な文字列が指定された際に送出されます。

exception xml.dom.WrongDocumentErr

   ノードが現在属している文書と異なる文書に挿入され、かつある文書から
   別の文書へのノードの移行が実装でサポートされていない場合に送出され
   ます。

DOM 勧告で定義されている例外コードは、以下のテーブルに従って上記の例外
と対応付けられます:

+----------------------------------------+-----------------------------------+
| 定数                                   | 例外                              |
+========================================+===================================+
| "DOMSTRING_SIZE_ERR"                   | "DomstringSizeErr"                |
+----------------------------------------+-----------------------------------+
| "HIERARCHY_REQUEST_ERR"                | "HierarchyRequestErr"             |
+----------------------------------------+-----------------------------------+
| "INDEX_SIZE_ERR"                       | "IndexSizeErr"                    |
+----------------------------------------+-----------------------------------+
| "INUSE_ATTRIBUTE_ERR"                  | "InuseAttributeErr"               |
+----------------------------------------+-----------------------------------+
| "INVALID_ACCESS_ERR"                   | "InvalidAccessErr"                |
+----------------------------------------+-----------------------------------+
| "INVALID_CHARACTER_ERR"                | "InvalidCharacterErr"             |
+----------------------------------------+-----------------------------------+
| "INVALID_MODIFICATION_ERR"             | "InvalidModificationErr"          |
+----------------------------------------+-----------------------------------+
| "INVALID_STATE_ERR"                    | "InvalidStateErr"                 |
+----------------------------------------+-----------------------------------+
| "NAMESPACE_ERR"                        | "NamespaceErr"                    |
+----------------------------------------+-----------------------------------+
| "NOT_FOUND_ERR"                        | "NotFoundErr"                     |
+----------------------------------------+-----------------------------------+
| "NOT_SUPPORTED_ERR"                    | "NotSupportedErr"                 |
+----------------------------------------+-----------------------------------+
| "NO_DATA_ALLOWED_ERR"                  | "NoDataAllowedErr"                |
+----------------------------------------+-----------------------------------+
| "NO_MODIFICATION_ALLOWED_ERR"          | "NoModificationAllowedErr"        |
+----------------------------------------+-----------------------------------+
| "SYNTAX_ERR"                           | "SyntaxErr"                       |
+----------------------------------------+-----------------------------------+
| "WRONG_DOCUMENT_ERR"                   | "WrongDocumentErr"                |
+----------------------------------------+-----------------------------------+


19.8.3. 適合性
==============

この節では適合性に関する要求と、Python DOM API、W3C DOM 勧告、および
OMG IDL の Python API への対応付けとの間の関係について述べます。


19.8.3.1. 型の対応付け
----------------------

DOM 仕様で使われているプリミティブな IDL 型は、以下のテーブルに従って
Python の型に対応付けられています。

+--------------------+---------------------------------------------+
| IDL 型             | Python の型                                 |
+====================+=============================================+
| "boolean"          | "IntegerType" (値 "0" または "1") による    |
+--------------------+---------------------------------------------+
| "int"              | "IntegerType"                               |
+--------------------+---------------------------------------------+
| "long int"         | "IntegerType"                               |
+--------------------+---------------------------------------------+
| "unsigned int"     | "IntegerType"                               |
+--------------------+---------------------------------------------+

さらに、勧告で定義されている "DOMString" は、Python 文字列または
Unicode 文字列に対応付けられます。アプリケーションでは、 DOM から文字
列が返される際には常に Unicode を扱えなければなりません。

IDL の *null* 値は "None" に対応付けられており、 API で *null* の使用
が許されている場所では常に受理されるか、あるいは実装によって提供される
はずです。


19.8.3.2. アクセサメソッド
--------------------------

OMG IDL から Python への対応付けは、IDL *attribute* 宣言へのアクセサ関
数の定義を、Java による対応付けが行うのとほとんど同じように行います。
IDL 宣言の対応付け

   readonly attribute string someValue;
            attribute string anotherValue;

は、三つのアクセサ関数: "someValue" に対する "get" メソッド
("_get_someValue()")、そして "anotherValue" に対する "get" および
"set" メソッド ("_get_anotherValue()" および "_set_anotherValue()") を
生成します。とりわけ、対応付けでは、IDL 属性が通常の Python 属性として
アクセス可能であることは必須ではありません: "object.someValue" が動作
することは必須 *ではなく* 、 "AttributeError" を送出してもかまいません
。

しかしながら、Python DOM API では、通常の属性アクセスが動作することが
必須です。これは、Python IDL コンパイラによって生成された典型的なサロ
ゲーションはまず動作することはなく、DOM オブジェクトが CORBA を解して
アクセスされる場合には、クライアント上でラッパオブジェクトが必要である
ことを意味します。CORBA DOM クライアントでは他にもいくつか考慮すべきこ
とがある一方で、CORBA を介して DOM を使った経験を持つ実装者はこのこと
を問題視していません。"readonly" であると宣言された属性は、全ての DOM
実装で書き込みアクセスを制限しているとは限りません。

Python DOM API では、アクセサ関数は必須ではありません。アクセサ関数が
提供された場合、Python IDL 対応付けによって定義された形式をとらなけれ
ばなりませんが、属性は Python から直接アクセスすることができるので、そ
れらのメソッドは必須ではないと考えられます。"readonly" であると宣言さ
れた属性に対しては、 "set" アクセサを提供してはなりません。

このIDLでの定義はW3C DOM APIの全ての要件を実装しているわけではありませ
ん。例えば、一部のオブジェクトの概念や "getElementsByTagName()" が
"live" であることなどです。 Python DOM API はこれらの要件を実装するこ
とを強制しません。
