PHP マニュアル
前のページ |  | 次のページ

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

> 注意: この拡張は実験的なものではありません。しかしながら、PHP 5 版は決してリリースされないでしょう。PHP 4 でのみ配布されます。 もし PHP 5 でDOM XML をサポートする必要がある場合、 DOM 拡張を使用することができます。 この `domxml` 拡張は DOM 拡張と互換性はありません。

# 要件

この拡張モジュールは、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 | ノードは&nbsp;のようなエンティティである
`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() |

表 9. Parser クラス

メソッド名 | 関数名 | 注記
--- | --- | ---
add_chunk | Parser_add_chunk() |
end | Parser_end() |

表 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() で読み込むことも可能です。

例 1. XML 文字列を有するファイル example.inc を読み込む

`<?php
$xmlstr = "<?xml version='1.0' standalone='yes'?>
<!DOCTYPE chapter SYSTEM '/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd'
[ <!ENTITY sp \"spanish\">
]>
<!-- lsfj -->
<chapter language='en'><title language='en'>Title</title>
<para language='ge'>
&sp;
<!-- comment -->
<informaltable ID='findme' language='&sp;'>
<tgroup cols='3'>
<tbody>
<row><entry>a1</entry><entry
morerows='1'>b1</entry><entry>c1</entry></row>
<row><entry>a2</entry><entry>c2</entry></row>
<row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
</tbody>
</tgroup>
</informaltable>
</para>
</chapter>";
?>`

前のページ | ホーム | 次のページ
dom_import_simplexml | 上に戻る | DomAttribute->name