"xml.dom" --- ドキュメントオブジェクトモデル API
************************************************

**ソースコード:** Lib/xml/dom/__init__.py

======================================================================

文書オブジェクトモデル (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 への対応付けを記述してい
     ます。


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

"xml.dom" には次の関数があります。

xml.dom.registerDOMImplementation(name, factory)

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

xml.dom.getDOMImplementation(name=None, features=())

   Return a suitable DOM implementation. The *name* is either well-
   known, the module name of a DOM implementation, or "None". If it is
   not "None", imports the corresponding module and returns a
   "DOMImplementation" object if the import succeeds.  If no name is
   given, and if the environment variable "PYTHON_DOM" is set, this
   variable is used to find the implementation. The only well-known
   name in the standard library is "'minidom'", for "xml.dom.minidom".

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

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

xml.dom.EMPTY_NAMESPACE

   DOM のノードに名前空間が関連付けられていないことを示す値です。 通常
   、ノードの "namespaceURI" の値や、名前空間を扱うメソッドの
   *namespaceURI* 引数として使われます。

xml.dom.XML_NAMESPACE

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

xml.dom.XMLNS_NAMESPACE

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

xml.dom.XHTML_NAMESPACE

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

"xml.dom" には、基底クラス "Node" と DOM の例外クラスもあります。 この
モジュールの "Node" クラスは、DOM 仕様で定義されるメソッドや属性を実装
していません。 これらは具体的な DOM 実装が提供する必要があります。 こ
のモジュールの "Node" クラスは、具体的な "Node" オブジェクトの
"nodeType" 属性で使う定数を提供します。 DOM 仕様に従い、これらの定数は
モジュールレベルではなくクラス内に置かれています。


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

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

この節で説明する名前は DOM のインターフェースです。 "Node" と例外クラ
スを除き、"xml.dom" モジュール自体ではなく "xml.dom.minidom" などの具
体的な 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 を利用するために定義されている例外
について記述しています。


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

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

DOMImplementation.hasFeature(feature, version)

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

DOMImplementation.createDocument(namespaceUri, qualifiedName, doctype)

   指定された *namespaceUri* と *qualifiedName* を持つ "Element" オブ
   ジェクトを子ノードとして含む、新しい "Document" オブジェクト (DOM
   のルート) を返します。 *doctype* は "createDocumentType()" で作成し
   た "DocumentType" オブジェクトか、"None" でなければなりません。
   Python DOM API では、"Element" の子ノードを作成しないことを示すため
   に、最初の 2 つの引数を "None" にすることもできます。

DOMImplementation.createDocumentType(qualifiedName, publicId, systemId)

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


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

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

子ノードを持てるのは次の型のノードだけで、子ノードの型も表に挙げたもの
に限られます。

"Document"
   高々 1 個の "Element"、高々 1 個の "DocumentType"、
   "ProcessingInstruction"、"Comment"

"DocumentFragment" と "Element"
   "Element"、"Text"、"CDATASection"、"ProcessingInstruction"、
   "Comment"

"Attr"
   "Text"

その他の型のノードは子ノードを持てません。 許可されていない型の子ノー
ドを挿入すると "HierarchyRequestErr" を送出します。

Node.nodeType

   ノードの型を表す整数です。 型を表すシンボル定数は "Node" オブジェク
   トにあります。 読み出し専用の属性です。

Node.ELEMENT_NODE
Node.ATTRIBUTE_NODE
Node.TEXT_NODE
Node.CDATA_SECTION_NODE
Node.ENTITY_REFERENCE_NODE
Node.ENTITY_NODE
Node.PROCESSING_INSTRUCTION_NODE
Node.COMMENT_NODE
Node.DOCUMENT_NODE
Node.DOCUMENT_TYPE_NODE
Node.DOCUMENT_FRAGMENT_NODE
Node.NOTATION_NODE

   "nodeType" 属性が取り得る値を表す整数定数です。

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

   このノードの子ノードからなる "NodeList" です。 子ノードがなければ空
   のリストになります。 読み出し専用の属性です。

Node.firstChild

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

Node.lastChild

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

Node.localName

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

Node.prefix

   The part of the "tagName" preceding the colon if there is one, else
   the empty string.  The value is a string, or "None".

Node.namespaceURI

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

Node.ownerDocument

   このノードが属する "Document" オブジェクトです。 文書ノード自体の場
   合は "None" です。 読み出し専用の属性です。

Node.isSupported(feature, version)

   "DOMImplementation.hasFeature()" と同様に、DOM 実装が指定された
   *feature* をサポートするかどうかを返します。

Node.setUserData(key, data, handler)

   このノードの *key* に *data* を関連付け、以前 *key* に関連付けられ
   ていたデータ、または "None" を返します。 *data* が "None" なら関連
   付けを削除します。 ノードを複製、インポート、名前変更、削除すると
   *handler* が呼び出されます。 通知が不要なら "None" を渡してください
   。

Node.getUserData(key)

   "setUserData()" によってこのノードの *key* に関連付けられたデータ、
   または "None" を返します。

Node.nodeName

   このノードの名前です。 ノードの型によって異なります。 下の表を参照
   してください。 この属性から得られる情報は、要素の "tagName" や属性
   の "name" など、別のプロパティからも常に取得できます。 読み出し専用
   の属性です。

Node.nodeValue

   このノードの値です。 ノードの型によって異なります。 下の表を参照し
   てください。 値は文字列か "None" です。

各ノード型の "nodeName" と "nodeValue" の値は次のとおりです。

+----------------------------------+-----------------------------------------+---------------------------------------+
| ノードの型                       | nodeName                                | nodeValue                             |
|==================================|=========================================|=======================================|
| "Attr"                           | "name"                                  | "value"                               |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "CDATASection"                   | "'#cdata-section'"                      | 内容                                  |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "Comment"                        | "'#comment'"                            | 内容                                  |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "Document"                       | "'#document'"                           | "None"                                |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "DocumentFragment"               | "'#document-fragment'"                  | "None"                                |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "DocumentType"                   | "name"                                  | "None"                                |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "Element"                        | "tagName"                               | "None"                                |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "Entity"                         | エンティティ名                          | "None"                                |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "Notation"                       | 表記名                                  | "None"                                |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "ProcessingInstruction"          | "target"                                | "data"                                |
+----------------------------------+-----------------------------------------+---------------------------------------+
| "Text"                           | "'#text'"                               | 内容                                  |
+----------------------------------+-----------------------------------------+---------------------------------------+

Node.hasAttributes()

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

Node.hasChildNodes()

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

Node.isSameNode(other)

   *other* がこのノードと同じノードを参照していれば "True" を返します
   。 複数のオブジェクトが同じノードを参照する場合があるため、プロキシ
   機構を使う DOM 実装で特に役立ちます。

   注釈:

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

Node.appendChild(newChild)

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

Node.insertBefore(newChild, refChild)

   既存の子ノードの直前に新しい子ノードを挿入します。 *refChild* はこ
   のノードの子ノードでなければならず、そうでなければ "NotFoundErr" を
   送出します。 *newChild* を返します。 *refChild* が "None" なら、子
   ノードのリストの末尾に *newChild* を挿入します。

Node.removeChild(oldChild)

   子ノードを削除します。 *oldChild* はこのノードの子ノードでなければ
   ならず、そうでなければ "NotFoundErr" を送出します。 成功すると
   *oldChild* を返します。 *oldChild* をこれ以上使わない場合は、その
   "unlink()" メソッドを呼び出してください。

Node.replaceChild(newChild, oldChild)

   既存のノードを新しいノードに置き換えます。 *oldChild* はこのノード
   の子ノードでなければならず、そうでなければ "NotFoundErr" を送出しま
   す。

Node.normalize()

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

Node.cloneNode(deep)

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


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

A "NodeList" represents a sequence of nodes.  These objects are used
in two ways in the DOM Core recommendation:  an "Element" object
provides one as its list of child nodes, and the
"getElementsByTagName()" and "getElementsByTagNameNS()" methods of
"Node" return objects with this interface to represent query results.

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

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

NodeList.item(i)

   シーケンスの *i* 番目の項目を返します。 *i* が範囲外なら "None" を
   返します。 負のインデックスはサポートしていません。

NodeList.length

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

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

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


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

文書で宣言された表記やエンティティについての情報は "DocumentType" オブ
ジェクトから取得できます。 パーザが外部サブセットを使用し、その情報を
提供できる場合は外部サブセットの情報も含まれます。 文書の
"DocumentType" は "Document" オブジェクトの "doctype" 属性から取得でき
ます。 文書に "DOCTYPE" 宣言がなければ、文書の "doctype" 属性はこのイ
ンターフェースのインスタンスではなく "None" になります。

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

DocumentType.publicId

   文書型定義の外部サブセットの公開識別子です。 "DOCTYPE" 宣言に指定さ
   れていなければ "None" です。

DocumentType.systemId

   文書型定義の外部サブセットのシステム識別子で、URI です。 "DOCTYPE"
   宣言に指定されていなければ "None" です。

DocumentType.internalSubset

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

DocumentType.name

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

DocumentType.entities

   This is a "NamedNodeMap" of "Entity" nodes giving the definitions
   of external entities. For entity names defined more than once, only
   the first definition is provided (others are ignored as required by
   the XML recommendation).  This may be "None" if the information is
   not provided by the parser, or if no entities are defined.

DocumentType.notations

   表記の定義を表す "Notation" ノードの "NamedNodeMap" です。 同じ表記
   名が複数回定義されている場合は最初の定義だけを提供します (XML 勧告
   に従って残りは無視します)。 パーザがこの情報を提供しない場合や表記
   が定義されていない場合は "None" になることがあります。


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

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

Document.documentElement

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

Document.doctype

   文書の "DocumentType" ノード、または "None" です。 読み出し専用の属
   性です。

Document.implementation

   この文書を作成した "DOMImplementation" オブジェクトです。 読み出し
   専用の属性です。

Document.strictErrorChecking

   エラーチェックを強制するかどうかを表します。

Document.documentURI

   文書の場所です。 不明なら "None" です。

Document.createDocumentFragment()

   空の "DocumentFragment" ノードを作成して返します。

Document.createCDATASection(data)

   *data* を内容とする "CDATASection" ノードを作成して返します。

Document.importNode(importedNode, deep)

   この文書に属する *importedNode* のコピーを返します。 元のノードは元
   の文書から削除されません。 *deep* が真なら子孫ノードもコピーします
   。

Document.createElement(tagName)

   新しい要素ノードを作成して返します。 作成しただけでは文書に挿入され
   ません。 "insertBefore()" や "appendChild()" などの別のメソッドを使
   って、明示的に挿入する必要があります。

Document.createElementNS(namespaceURI, tagName)

   名前空間を持つ新しい要素を作成して返します。 *tagName* には接頭辞を
   含められます。 作成しただけでは文書に挿入されません。
   "insertBefore()" や "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* には接頭辞を
   含められます。 このメソッドは属性ノードを特定の要素に関連付けません
   。 作成した属性インスタンスを使うには、適切な "Element" オブジェク
   トの "setAttributeNode()" を使う必要があります。

Document.getElementById(id)

   指定された ID を持つ要素、または "None" を返します。 検索するのは
   DTD または "Element.setIdAttribute()" によって ID 型と宣言された属
   性だけです。

Document.getElementsByTagName(tagName)

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

Document.getElementsByTagNameNS(namespaceURI, localName)

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

Document.renameNode(n, namespaceURI, name)

   要素ノードまたは属性ノード *n* の名前を変更し、そのノードを返します
   。 *namespaceURI* は新しい名前空間 URI で、ノードが名前空間に属さな
   い場合は "EMPTY_NAMESPACE" です。 *name* は新しい修飾名です。

   *n* が別の文書で作成されていれば "WrongDocumentErr" を送出します。
   要素でも属性でもなければ "NotSupportedErr" を送出します。


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

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

Element.tagName

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

Element.setIdAttribute(name)

   属性 *name* が ID 型であると宣言し、"Document.getElementById()" で
   この要素を見つけられるようにします。 その属性が要素になければ
   "NotFoundErr" を送出します。

Element.setIdAttributeNS(namespaceURI, localName)

   "setIdAttribute()" と同じですが、属性を名前空間 URI とローカル名で
   指定します。

Element.setIdAttributeNode(idAttr)

   "setIdAttribute()" と同じですが、取得済みの属性ノードを指定します。

Element.getElementsByTagName(tagName)

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

Element.getElementsByTagNameNS(namespaceURI, localName)

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

Element.hasAttribute(name)

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

Element.hasAttributeNS(namespaceURI, localName)

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

Element.getAttribute(name)

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

Element.getAttributeNode(attrname)

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

Element.getAttributeNS(namespaceURI, localName)

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

Element.getAttributeNodeNS(namespaceURI, localName)

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

Element.removeAttribute(name)

   名前を指定して属性を削除します。

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 は属性の完全な名前であり、この点が上記のメソ
   ッドと違うので注意してください。


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

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

属性ノードは文書ツリーの一部ではありません。 要素の子ノードではなく
"attributes" マップに格納され、"parentNode"、"previousSibling"、
"nextSibling" は常に "None" です。

Attr.name

   属性名です。 名前空間を使用する文書では、コロンを含むことがあります
   。

Attr.localName

   名前にコロンがあればその後の部分、なければ名前全体です。 読み出し専
   用の属性です。

Attr.prefix

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

Attr.isId

   DTD での宣言または "Element.setIdAttribute()" の使用によって、この
   属性が ID 型になっているかどうかを表します。 読み出し専用の属性です
   。

Attr.ownerElement

   この属性が属する "Element" ノードです。 使われていなければ "None"
   です。 読み出し専用の属性です。

Attr.specified

   属性の値が DTD のデフォルト値ではなく、文書中で明示的に設定されたか
   どうかを表します。 読み出し専用の属性です。

Attr.value

   属性のテキスト値です。 "nodeValue" 属性と同じものを指します。


NamedNodeMap Objects
--------------------

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

NamedNodeMap.length

   属性リストの長さです。

NamedNodeMap.item(index)

   指定したインデックスの属性を返します。 属性を取得する順序は任意です
   が、DOM が存続する間は変わりません。 各項目は属性ノードです。 値を
   取得するには "value" 属性を使ってください。

NamedNodeMap.getNamedItem(name)

   指定された "name" を持つノードを返します。 そのようなノードがなけれ
   ば "None" を返します。

NamedNodeMap.getNamedItemNS(namespaceURI, localName)

   指定された名前空間 URI とローカル名を持つノードを返します。 そのよ
   うなノードがなければ "None" を返します。

NamedNodeMap.setNamedItem(node)

   "name" をキーとして *node* をマップに追加します。 置き換えたノード
   を返します。 置き換えていなければ "None" を返します。

NamedNodeMap.setNamedItemNS(node)

   名前空間 URI とローカル名をキーとして *node* をマップに追加します。
   置き換えたノードを返します。 置き換えていなければ "None" を返します
   。

NamedNodeMap.removeNamedItem(name)

   指定された "name" を持つノードを削除し、そのノードを返します。 その
   ようなノードがなければ "NotFoundErr" を送出します。

NamedNodeMap.removeNamedItemNS(namespaceURI, localName)

   指定された名前空間 URI とローカル名を持つノードを削除し、そのノード
   を返します。 そのようなノードがなければ "NotFoundErr" を送出します
   。

"Element" オブジェクトの、標準化された "getAttribute*()" 系のメソッド
も使えます。


DocumentFragment オブジェクト
-----------------------------

"DocumentFragment" はノードを格納する軽量のコンテナです。 "Node" のサ
ブクラスです。 文書ツリーに挿入すると、このノード自体の代わりにその子
ノードが挿入され、コンテナは空になります。


CharacterData オブジェクト
--------------------------

"CharacterData" は XML 文書内のテキストのようなデータを表します。
"Node" のサブクラスで、"Text"、"CDATASection"、"Comment" の基底クラス
です。 これらのノードは子ノードを持てません。

CharacterData.data

   ノードの内容を表す文字列です。

CharacterData.length

   "data" の文字数です。 読み出し専用の属性です。

CharacterData.substringData(offset, count)

   "data" の *offset* から始まる *count* 文字の部分文字列を返します。

CharacterData.appendData(arg)

   "data" に文字列 *arg* を追加します。

CharacterData.insertData(offset, arg)

   "data" の *offset* の位置に文字列 *arg* を挿入します。

CharacterData.deleteData(offset, count)

   "data" の *offset* から *count* 文字を削除します。

CharacterData.replaceData(offset, count, arg)

   "data" の *offset* から *count* 文字を文字列 *arg* で置き換えます。


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

"Comment" は XML 文書内のコメントを表します。 "CharacterData" のサブク
ラスです。

Comment.data

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


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

"Text" インターフェースは XML 文書内のテキストを表します。 パーザと
DOM 実装が DOM の XML 拡張をサポートする場合、CDATA マーク区域で囲まれ
た部分のテキストは "CDATASection" オブジェクトに格納されます。 この 2
つのインターフェースは同じですが、"nodeType" 属性の値が異なります。

"Text" は "CharacterData" インターフェースを拡張し、"CDATASection" は
"Text" を拡張します。

Text.data

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

Text.wholeText

   このノードに論理的に隣接するすべての "Text" ノードのテキストを、文
   書内の順序で連結したものです。 読み出し専用の属性です。

Text.replaceWholeText(content)

   このノードに論理的に隣接するすべての "Text" ノードのテキストを
   *content* で置き換え、他のノードを削除します。 このノードを返します
   が、*content* が空なら "None" を返します。

Text.splitText(offset)

   *offset* の位置でこのノードを 2 つに分割します。 前半をこのノードに
   残し、残りを格納した新しい兄弟ノードを返します。

注釈:

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


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

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

ProcessingInstruction.target

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

ProcessingInstruction.data

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


Entity オブジェクト
-------------------

"Entity" は DTD で宣言された解析対象または解析対象外のエンティティを表
します。 "Node" のサブクラスです。 エンティティノードは
"DocumentType.entities" に格納され、文書ツリーには挿入できません。 エ
ンティティの名前は "nodeName" です。

Entity.publicId

   エンティティの公開識別子です。 指定されていなければ "None" です。
   読み出し専用の属性です。

Entity.systemId

   エンティティのシステム識別子です。 指定されていなければ "None" です
   。 読み出し専用の属性です。

Entity.notationName

   解析対象外エンティティの表記名です。 解析対象エンティティの場合は
   "None" です。 読み出し専用の属性です。


Notation オブジェクト
---------------------

"Notation" は DTD で宣言された表記を表します。 "Node" のサブクラスで、
子ノードは持てません。 表記ノードは "DocumentType.notations" に格納さ
れ、文書ツリーには挿入できません。 表記の名前は "nodeName" です。

Notation.publicId

   表記の公開識別子です。 指定されていなければ "None" です。 読み出し
   専用の属性です。

Notation.systemId

   表記のシステム識別子です。 指定されていなければ "None" です。 読み
   出し専用の属性です。


例外
----

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.ValidationErr

   操作によって文書が部分的な妥当性の条件を満たさなくなる場合に送出さ
   れます。 Python の DOM 実装で使われている例は知られていませんが、
   Python 以外で書かれた DOM 実装から送出される可能性があります。

exception xml.dom.WrongDocumentErr

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

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

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


適合性
======

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


型の対応付け
------------

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

+--------------------+---------------------------------------------+
| IDL 型             | Python の型                                 |
|====================|=============================================|
| "boolean"          | "bool" または "int"                         |
+--------------------+---------------------------------------------+
| "int"              | "int"                                       |
+--------------------+---------------------------------------------+
| "long int"         | "int"                                       |
+--------------------+---------------------------------------------+
| "unsigned int"     | "int"                                       |
+--------------------+---------------------------------------------+
| "DOMString"        | "str" または "bytes"                        |
+--------------------+---------------------------------------------+
| "null"             | "None"                                      |
+--------------------+---------------------------------------------+


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

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

   readonly attribute string someValue;
            attribute string anotherValue;

この対応付けによって 3 つのアクセサ関数ができます。 "someValue" 用の取
得メソッド ("_get_someValue()") と、"anotherValue" 用の取得メソッド
("_get_anotherValue()") および設定メソッド ("_set_anotherValue()") で
す。 特に、この対応付けでは IDL の属性に通常の Python の属性としてアク
セスできることを要求しません。 "object.someValue" が動作する必要は *な
く*、"AttributeError" を送出する場合もあります。

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

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

IDL の定義は W3C DOM API の要件を完全に表現しているわけではありません
。 例えば "getElementsByTagName()" の戻り値など、一部のオブジェクトが
「ライブ」であるという概念は含まれません。 Python DOM API は、実装がこ
うした要件を満たすことを要求しません。
