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>"
;
?>

目次
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 コンテキストを作成する