XXXI. DOM XML 関数
導入
domxml 拡張モジュールは、DOM 標準に対する互換性を改善するため PHP バージョン 4.3.0 で書き直されました。拡張モジュールには まだ多くの古い関数が含まれていますが、使用は推奨されません。 特にオブジェクト指向でない関数の使用は避けるべきです。
拡張モジュールにより、DOM API で XML ドキュメントを処理することが 可能となります。また、完全な XML ドキュメントを PHP オブジェクトツリーに 変換する関数 domxml_xmltree() も提供されています。 現在、このツリーは読み込み専用とされています。 このツリーを修正することは可能ですが、 DomDocument_dump_mem() にこれを適用することはできないため、意味はないでしょう。 XML ファイルを読み込んで修正した版を書き込みたい場合は DomDocument_create_element() 、 DomDocument_create_text() 、 set_attribute() 等を使用し、最後に DomDocument_dump_mem() 関数を使用してください。
注意: この拡張モジュールは PECL レポジトリに移動 されており、以下のバージョン以降 PHP にバンドルされなくなっています。 PHP 5.0.0.
要件
この拡張モジュールは、 GNOME XML ライブラリ を使用します。このライブラリをダウンロードし、 インストールしてください。少なくとも libxml-2.4.14 が必要です。 DOM XSLT 機能を使用するために libxslt ライブラリ と http://www.exslt.org/ による EXSLT 拡張を使用することができます。 (拡張) XSLT 機能を使用するには、これらのライブラリをダウンロード、 インストールしてください。少なくとも libxslt-1.0.18 が必要です。
インストール手順
この PECL 拡張 モジュールは PHP にバンドルされていません。 この PECL 拡張モジュールをインストールする方法は、 マニュアルの PECL 拡張モジュールのインストール という章にあります。 新規リリース・ダウンロード・ソースファイル・管理者情報・CHANGELOG といった関連する情報については、次の場所にあります。 http://pecl.php.net/package/domxml .
この拡張モジュールは、
--with-dom=[DIR]
を指定してPHPを設 定した場合のみ利用可能です。DOM XSLTサポートを組み込むには、
--with-dom-xslt[=DIR]
を追加して下 さい。DIRは、libxsltをインストールしたディレクトリです。DOM EXSLTサ ポートを有効にするには、
--with-dom-exslt[=DIR]
を指定しま す。ただし、DIRはlibxsltをインストールしたディレクトリです。
Windows ユーザの場合、これらの関数を使用するには php.ini の php_domxml.dll を有効にしてください。 PHP 4 の場合、この DLL は PHP の Windows ダウンロードバイナリの extensions/ ディレクトリ にあります。 この PECL 拡張モジュール の DLL を PHP ダウンロード ページ または http://snaps.php.net/ からダウンロードできます。 また、この拡張を有効にするためには、追加の DLL をシステムパスにコピーする必要があります。 PHP 4 では、この DLL は dlls/ にあります。 DLL 名は、PHP <= 4.2.0 で libxml2.dll 、 PHP >= 4.3.0 で iconv.dll です。 また、PHP 5.0.0 以降では iconv が Windows 用 PHP バイナリにデフォルトでコンパイルされていますので、 外部 DLL は必要ありません。
古い関数
DOM 標準に沿っておらず、もう使うべきではない関数がごく少数あります。 これらの関数を以下の表に示します。 関数 DomNode_append_child() はその動作が変更されました。 この関数は、子を追加しますが、兄弟は追加しません。 これにより、アプリケーションの動作に影響が生じる場合、DOM ではない関数 DomNode_append_sibling() を使用してください。
表 1. 古い関数とその代替関数
| 古い関数 | 新しい関数 |
|---|---|
| xmldoc | domxml_open_mem() |
| xmldocfile | domxml_open_file() |
| domxml_new_xmldoc | domxml_new_doc() |
| domxml_dump_mem | DomDocument_dump_mem() |
| domxml_dump_mem_file | DomDocument_dump_file() |
| DomDocument_dump_mem_file | DomDocument_dump_file() |
| DomDocument_add_root | DomDocument_create_element() の後に DomNode_append_child() |
| DomDocument_dtd | DomDocument_doctype() |
| DomDocument_root | DomDocument_document_element() |
| DomDocument_children | DomNode_child_nodes() |
| DomDocument_imported_node | 代替関数なし。 |
| DomNode_add_child | 例えば DomDocument_create_element() により、 新しいノードを作成し、 DomNode_append_child() により追加します。 |
| DomNode_children | DomNode_child_nodes() |
| DomNode_parent | DomNode_parent_node() |
| DomNode_new_child | 例えば DomDocument_create_element() で 新規ノードを作成し、 DomNode_append_child() で追加します。 |
| DomNode_set_content | 例えば DomDocument_create_element() で 新規ノードを作成し、 DomNode_append_child() で追加します。 |
| DomNode_get_content | コンテンツは単なるテキストノードであり、 DomNode_child_nodes() でアクセス可能です。 |
| DomNode_set_content | コンテンツは単なるテキストノードであり、 DomNode_append_child() で追加できます。 |
定義済み定数
以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。
表 2. XML定数
| 定数 | 値 | 説明 |
|---|---|---|
| XML_ELEMENT_NODE ( integer ) | 1 | ノードは要素(element)である |
| XML_ATTRIBUTE_NODE ( integer ) | 2 | ノードは属性(attribute)である |
| XML_TEXT_NODE ( integer ) | 3 | ノードはテキストの一部である |
| XML_CDATA_SECTION_NODE ( integer ) | 4 | |
| XML_ENTITY_REF_NODE ( integer ) | 5 | |
| XML_ENTITY_NODE ( integer ) | 6 | ノードは のようなエンティティである |
| XML_PI_NODE ( integer ) | 7 | ノードは処理命令(PI)である |
| XML_COMMENT_NODE ( integer ) | 8 | ノードはコメントである |
| XML_DOCUMENT_NODE ( integer ) | 9 | ノードはドキュメントである |
| XML_DOCUMENT_TYPE_NODE ( integer ) | 10 | |
| XML_DOCUMENT_FRAG_NODE ( integer ) | 11 | |
| XML_NOTATION_NODE ( integer ) | 12 | |
| XML_GLOBAL_NAMESPACE ( integer ) | 1 | |
| XML_LOCAL_NAMESPACE ( integer ) | 2 | |
| XML_HTML_DOCUMENT_NODE ( integer ) | ||
| XML_DTD_NODE ( integer ) | ||
| XML_ELEMENT_DECL_NODE ( integer ) | ||
| XML_ATTRIBUTE_DECL_NODE ( integer ) | ||
| XML_ENTITY_DECL_NODE ( integer ) | ||
| XML_NAMESPACE_DECL_NODE ( integer ) | ||
| XML_ATTRIBUTE_CDATA ( integer ) | ||
| XML_ATTRIBUTE_ID ( integer ) | ||
| XML_ATTRIBUTE_IDREF ( integer ) | ||
| XML_ATTRIBUTE_IDREFS ( integer ) | ||
| XML_ATTRIBUTE_ENTITY ( integer ) | ||
| XML_ATTRIBUTE_NMTOKEN ( integer ) | ||
| XML_ATTRIBUTE_NMTOKENS ( integer ) | ||
| XML_ATTRIBUTE_ENUMERATION ( integer ) | ||
| XML_ATTRIBUTE_NOTATION ( integer ) | ||
| XPATH_UNDEFINED ( integer ) | ||
| XPATH_NODESET ( integer ) | ||
| XPATH_BOOLEAN ( integer ) | ||
| XPATH_NUMBER ( integer ) | ||
| XPATH_STRING ( integer ) | ||
| XPATH_POINT ( integer ) | ||
| XPATH_RANGE ( integer ) | ||
| XPATH_LOCATIONSET ( integer ) | ||
| XPATH_USERS ( integer ) | ||
| XPATH_NUMBER ( integer ) |
クラス
モジュールの API は、DOM レベル 2 標準に可能な限り基づいています。 結果的に API は完全にオブジェクト指向です。このモジュールを使用する際に DOM 標準が利用できることは望ましいことです。 この API はオブジェクト指向ですが、 最初の引数として処理するオブジェクトを渡すことによってコールできる、 オブジェクト指向でない関数も多くあります。 これらの関数は、主に過去のバージョンとの互換性確保のために維持されていますが、 新規開発での使用はもはや推奨されません。
この API は、公式な DOM API とは二つの点で異なっています。まず、 全てのクラスの属性は、同じ名前を有する関数として実装され、関数名は PHP の命名表記に基づいています。これは、DOM 関数 lastChild() が last_child() と書かれることを意味します。
このモジュールは、一連のクラスを定義します。メソッドも含めたリストを 以下の表に示します。クラスは、DOM 標準で DOMxxx という名前のものと等価です。
表 3. クラスの一覧
| クラス名 | 親クラス |
|---|---|
| DomAttribute | DomNode |
| DomCData | DomNode |
| DomComment | DomCData : DomNode |
| DomDocument | DomNode |
| DomDocumentType | DomNode |
| DomElement | DomNode |
| DomEntity | DomNode |
| DomEntityReference | DomNode |
| DomProcessingInstruction | DomNode |
| DomText | DomCData : DomNode |
| Parser | 現在はまだ DomParser と呼ばれています |
| XPathContext |
表 4. DomDocument クラス (DomDocument : DomNode)
| メソッド名 | 関数名 | 注意 |
|---|---|---|
| doctype | DomDocument_doctype() | |
| document_element | DomDocument_document_element() | |
| create_element | DomDocument_create_element() | |
| create_text_node | DomDocument_create_text_node() | |
| create_comment | DomDocument_create_comment() | |
| create_cdata_section | DomDocument_create_cdata_section() | |
| create_processing_instruction | DomDocument_create_processing_instruction() | |
| create_attribute | DomDocument_create_attribute() | |
| create_entity_reference | DomDocument_create_entity_reference() | |
| get_elements_by_tagname | DomDocument_get_elements_by_tagname() | |
| get_element_by_id | DomDocument_get_element_by_id() | |
| dump_mem | DomDocument_dump_mem() | DOM 標準ではありません |
| dump_file | DomDocument_dump_file() | DOM 標準ではありません |
| html_dump_mem | DomDocument_html_dump_mem() | DOM 標準ではありません |
| xpath_init | xpath_init | DOM 標準ではありません |
| xpath_new_context | xpath_new_context | DOM 標準ではありません |
| xptr_new_context | xptr_new_context | DOM 標準ではありません |
表 5. DomElement クラス (DomElement : DomNode)
| メソッド名 | 関数名 | 注意 |
|---|---|---|
| tagname | DomElement_tagname() | |
| get_attribute | DomElement_get_attribute() | |
| set_attribute | DomElement_set_attribute() | |
| remove_attribute | DomElement_remove_attribute() | |
| get_attribute_node | DomElement_get_attribute_node() | |
| set_attribute_node | DomElement_set_attribute_node() | |
| get_elements_by_tagname | DomElement_get_elements_by_tagname() | |
| has_attribute | DomElement_has_attribute() |
表 6. DomNode クラス
| メソッド名 | 注意 |
|---|---|
| DomNode_node_name() | |
| DomNode_node_value() | |
| DomNode_node_type() | |
| DomNode_last_child() | |
| DomNode_first_child() | |
| DomNode_child_nodes() | |
| DomNode_previous_sibling() | |
| DomNode_next_sibling() | |
| DomNode_parent_node() | |
| DomNode_owner_document() | |
| DomNode_insert_before() | |
| DomNode_append_child() | |
| DomNode_append_sibling() | DOM 標準ではありません。この関数は 先ほどの DomNode_append_child() の動作をエミュレートします。 |
| DomNode_remove_child() | |
| DomNode_has_child_nodes() | |
| DomNode_has_attributes() | |
| DomNode_clone_node() | |
| DomNode_attributes() | |
| DomNode_unlink_node() | DOM 標準ではありません |
| DomNode_replace_node() | DOM 標準ではありません |
| DomNode_set_content() | DOM 標準にはなく、古いメソッドです |
| DomNode_get_content() | DOM 標準にはなく、古いメソッドです |
| DomNode_dump_node() | DOM 標準ではありません |
| DomNode_is_blank_node() | DOM 標準ではありません |
表 7. DomAttribute クラス (DomAttribute : DomNode)
| メソッド名 | 注意 | |
|---|---|---|
| name | DomAttribute_name() | |
| value | DomAttribute_value() | |
| specified | DomAttribute_specified() |
表 8. DomProcessingInstruction クラス (DomProcessingInstruction : DomNode)
| メソッド名 | 関数名 | 注意 |
|---|---|---|
| target | DomProcessingInstruction_target() | |
| data | DomProcessingInstruction_data() |
表 10. XPathContext クラス
| メソッド名 | 関数名 | 注記 |
|---|---|---|
| eval | XPathContext_eval() | |
| eval_expression | XPathContext_eval_expression() | |
| register_ns | XPathContext_register_ns() |
表 11. DomDocumentType クラス (DomDocumentType : DomNode)
| メソッド名 | 関数名 | 注記 |
|---|---|---|
| name | DomDocumentType_name() | |
| entities | DomDocumentType_entities() | |
| notations | DomDocumentType_notations() | |
| public_id | DomDocumentType_public_id() | |
| system_id | DomDocumentType_system_id() | |
| internal_subset | DomDocumentType_internal_subset() |
クラス DomDtd は DomNode から派生したものです。DomComment は DomCData から派生したものです。
例
このリファレンスにおける多くの例は、XML 文字列を必要とします。 この文字列を全ての例で繰りかえし記述するかわりに、ファイルに書き込んで 各例で読み込むことにします。この読み込まれるファイルは、 以下の例に示されています。XML ドキュメントを作成し、 DomDocument_open_file() で読み込むことも可能です。
- 目次
- DomAttribute->name -- 属性の名前を返す
- DomAttribute->set_value -- 属性の値を設定する
- DomAttribute->specified -- 属性が指定されているかどうか調べる
- DomAttribute->value -- 属性の値を返す
- DomDocument->add_root -- ルートノードを追加する [推奨されません]
- DomDocument->create_attribute -- 新規属性を作成する
- DomDocument->create_cdata_section -- 新規 cdata ノードを作成する
- DomDocument->create_comment -- 新規コメントノードを作成する
- DomDocument->create_element_ns -- 関連する名前空間を持つ新規要素ノードを作成する
- DomDocument->create_element -- 新規要素ノードを作成する
- DomDocument->create_entity_reference -- エンティティ参照を作成する
- DomDocument->create_processing_instruction -- 新規 PI ノードを作成する
- DomDocument->create_text_node -- 新規テキストノードを作成する
- DomDocument->doctype -- 文章型を返す
- DomDocument->document_element -- ルート要素ノードを返す
- DomDocument->dump_file -- 内部 XML ツリーをファイルにダンプする
- DomDocument->dump_mem -- 内部 XML ツリーを文字列にダンプする
- DomDocument->get_element_by_id -- 特定の ID を持つ要素を検索する
- DomDocument->get_elements_by_tagname -- 文章中に与えられたタグ名を持つノードの配列を返す。 もしくは、見つからない場合は空の配列を返す
- DomDocument->html_dump_mem -- HTML として文字列に内部 XML ツリーをダンプする
- DomDocument->xinclude -- DomDocument オブジェクトにおける XIncludes の代替
- DomDocumentType->entities() -- エンティティの一覧を返す
- DomDocumentType->internal_subset() -- 内部サブセットを返す
- DomDocumentType->name() -- 文章型の名前を返す
- DomDocumentType->notations() -- ノーテーションの一覧を返す
- DomDocumentType->public_id() -- 文章型の PUBLIC ID を返す
- DomDocumentType->system_id() -- 文章型のSYSTEM ID を返す
- DomElement->get_attribute_node() -- 与えられた属性のノードを返す
- DomElement->get_attribute() -- 与えられた属性の値を返す
- DomElement->get_elements_by_tagname() -- タグ名により要素を取得する
- DomElement->has_attribute() -- 現在のノードに属性があるかどうかを調べる
- DomElement->remove_attribute() -- 属性を削除する
- DomElement->set_attribute_node() -- 新規属性を追加する
- DomElement->set_attribute() -- 属性値を設定する
- DomElement->tagname() -- 現在の要素名を返す
- DomNode->add_namespace -- ノードに名前空間宣言を追加する
- DomNode->append_child -- 子ノードの最後に新規に子ノードを追加する
- DomNode->append_sibling -- 新規に兄弟をノードに追加する
- DomNode->attributes -- 属性の一覧を返す
- DomNode->child_nodes -- 子ノードを返す
- DomNode->clone_node -- ノードを複製する
- DomNode->dump_node -- 単一ノードをダンプする
- DomNode->first_child -- 最初の子ノードを返す
- DomNode->get_content -- ノードの内容を取得する
- DomNode->has_attributes -- ノードが属性を有しているかを調べる
- DomNode->has_child_nodes -- ノードが子ノードを有しているかを調べる
- DomNode->insert_before -- 新規ノードを子ノードとして挿入する
- DomNode->is_blank_node -- ノードが空かどうかを調べる
- DomNode->last_child -- 最後の子ノードを返す
- DomNode->next_sibling -- 次の兄弟ノードを返す
- DomNode->node_name -- ノード名を返す
- DomNode->node_type -- ノードの型を返す
- DomNode->node_value -- ノードの値を返す
- DomNode->owner_document -- このノードが属する文章を返す
- DomNode->parent_node -- 親ノードを返す
- DomNode->prefix -- ノードの名前空間接頭辞を返す
- DomNode->previous_sibling -- 前の兄弟ノードを返す
- DomNode->remove_child -- 子ノードのリストから子ノードを削除する
- DomNode->replace_child -- 子ノードを置換する
- DomNode->replace_node -- ノードを置換する
- DomNode->set_content -- ノードの内容を設定する
- DomNode->set_name -- ノード名を設定する
- DomNode->set_namespace -- ノードの名前空間を設定する
- DomNode->unlink_node -- ノードを削除する
- DomProcessingInstruction->data -- PI ノードのデータを返す
- DomProcessingInstruction->target -- PI ノードのターゲットを返す
- DomXsltStylesheet->process() -- DomDocument オブジェクトに XSLT 変換を適用する
- DomXsltStylesheet->result_dump_file() -- XSLT 変換の結果をファイルにダンプする
- DomXsltStylesheet->result_dump_mem() -- XSLT 変換の結果を文字列にダンプする
- domxml_new_doc -- 空の新規 XMLドキュメントを作成する
- domxml_open_file -- XML ファイルから DOM オブジェクトを作成する
- domxml_open_mem -- XML 文章から DOM オブジェクトを作成する
- domxml_version -- XML ライブラリのバージョンを取得する
- domxml_xmltree -- XML 文章から PHP オブジェクトツリーを作成する
- domxml_xslt_stylesheet_doc -- DomDocument オブジェクトから DomXsltStylesheet オブジェクトを作成する
- domxml_xslt_stylesheet_file -- ファイル中の XSL 文章から DomXsltStylesheet オブジェクトを作成する
- domxml_xslt_stylesheet -- 文字列での XSL 文章から DomXsltStylesheet オブジェクトを作成する
- domxml_xslt_version -- XSLT ライブラリのバージョンを取得する
- xpath_eval_expression -- 与えられた文字列で XPath のロケーションパスを評価する
- xpath_eval -- 与えられた文字列で XPath のロケーションパスを評価する
- xpath_new_context -- 新規 xpath コンテキストを作成する
- xpath_register_ns_auto -- 与えられた XPath コンテキストに与えられた名前空間を登録する
- xpath_register_ns -- 与えられた XPath コンテキストに与えられた名前空間を登録する
- xptr_eval -- 指定した文字列の XPtr ロケーションパスを評価する
- xptr_new_context -- 新規 XPath コンテキストを作成する