PHP: DOM XML関数 - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<dom_import_simplexmlDomAttribute->name>
view the version of this page
Last updated: Tue, 21 Dec 2004

XXVII. DOM XML関数

導入

警告

このモジュールは、 実験的なものです。これは、これらの関数の動作、関 数名は、このドキュメントに書かれて事項と同様に告知なく将来的なPHPのリ リースで変更される可能性があります。注意を喚起するとともに、このモジュー ルは使用者のリスクで使用して下さい。

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()関数を使用して下さい。

要件

この拡張モジュールは、を使用します。このライブラリをダウンロードし、インストー ルして下さい。少なくとも libxml-2.4.14 が必要です。 DOM XSLT機能を使用するために とによ るEXSLT拡張を使用することができます。 (拡張)XSLT機能を使用するには、これらのライブラリをダウンロード、 インストールして下さい。少なくともlibxslt-1.0.18が必要です。

インストール手順

この拡張モジュールは、 --with-dom=[DIR]を指定してPHPを設 定した場合のみ利用可能です。DOM XSLTサポートを組み込むには、 --with-dom-xslt[=DIR] を追加して下 さい。DIRは、libxsltをインストールしたディレクトリです。DOM EXSLTサ ポートを有効にするには、 --with-dom-exslt[=DIR] を指定しま す。ただし、DIRはlibxsltをインストールしたディレクトリです。

Win32ユーザへの注意: このモジュールをWindows環境で有効にするには、 libxml2.dllをPHP/Win32バイナリパッケージのDLL フォルダから使用するWindowsマシンのSYSTEM32フォルダ(例: C:\WINNT\SYSTEM32またはC:\WINDOWS\SYSTEM32)にコピーする必要がありま す。 PHP <= 4.2.0 の場合は、libxml2.dllをコピー し、PHP >= 4.3.0 の場合は、iconv.dll を DLLフォルダからSYSTEM32フォルダにコピーして下さい。

古い関数

DOM標準に沿っておらず、もう使うべきではない関数がごく少数あります。 これらの関数を以下の表に示します。 関数 DomNode_append_child() はその動作が変更さ れました。この関数は、子を追加しますが、兄弟は追加しません。 これにより、アプリケーションの動作に影響が生じる場合、DOMではない 関数 DomNode_append_sibling()を使用して下さい。

表 1. 古い関数とその代替関数

古い関数新しい関数
xmldocdomxml_open_mem()
xmldocfieldomxml_open_file()
domxml_new_xmldocdomxml_new_doc()
domxml_dump_memDomDocument_dump_mem()
domxml_dump_mem_fileDomDocument_dump_file()
DomDocument_dump_mem_fileDomDocument_dump_file()
DomDocument_add_root DomDocument_create_element()の後に DomNode_append_child()
DomDocument_dtdDomDocument_doctype()
DomDocument_rootDomDocument_document_element()
DomDocument_childrenDomNode_child_nodes()
DomDocument_imported_node代替関数なし。
DomNode_add_child 例えば DomDocument_create_element()により、 新しいノードを作成し、 DomNode_append_child()により追加します。
DomNode_childrenDomNode_child_nodes()
DomNode_parentDomNode_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. クラスの一覧

クラス名親クラス
DomAttributeDomNode
DomCDataDomNode
DomCommentDomCData : DomNode
DomDocumentDomNode
DomDocumentTypeDomNode
DomElementDomNode
DomEntityDomNode
DomEntityReferenceDomNode
DomProcessingInstructionDomNode
DomTextDomCData : DomNode
Parser現在はまだDomParserと呼ばれています
XPathContext 

表 4. DomDocument クラス (DomDocument : DomNode)

メソッド名関数名注意
doctypeDomDocument_doctype() 
document_elemnentDomDocument_document_element() 
create_elementDomDocument_create_element() 
create_text_nodeDomDocument_create_text_node() 
create_commentDomDocument_create_comment() 
create_cdata_sectionDomDocument_create_cdata_section() 
create_processing_instructionDomDocument_create_processing_instruction() 
create_attributeDomDocument_create_attribute() 
create_entity_referenceDomDocument_create_entity_reference() 
get_elements_by_tagnameDomDocument_get_elements_by_tagname() 
get_element_by_idDomDocument_get_element_by_id() 
dump_memDomDocument_dump_mem()DOM標準ではない
dump_fileDomDocument_dump_file()DOM標準ではない
html_dump_memDomDocument_html_dump_mem()DOM標準ではない
xpath_initxpath_initDOM標準ではない
xpath_new_contextxpath_new_contextDOM標準ではない
xptr_new_contextxptr_new_contextDOM標準ではない

表 5. DomElement クラス (DomElement : DomNode)

メソッド名関数名注意
tagnameDomElement_tagname() 
get_attributeDomElement_get_attribute() 
set_attributeDomElement_set_attribute() 
remove_attributeDomElement_remove_attribute() 
get_attribute_nodeDomElement_get_attribute_node() 
set_attribute_nodeDomElement_set_attribute_node() 
get_elements_by_tagnameDomElement_get_elements_by_tagname() 
has_attributeDomElement_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_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)

メソッド名 注意
nameDomAttribute_name() 
valueDomAttribute_value() 
specifiedDomAttribute_specified() 

表 8. DomProcessingInstruction クラス (DomProcessingInstruction : DomNode)

メソッド名関数名注意
targetDomProcessingInstruction_target() 
dataDomProcessingInstruction_data() 

表 9. Parser クラス

メソッド名関数名注記
add_chunkParser_add_chunk() 
endParser_end() 

表 10. XPathContext クラス

メソッド名関数名注記
evalXPathContext_eval() 
eval_expressionXPathContext_eval_expression() 
register_nsXPathContext_register_ns() 

表 11. DomDocumentType クラス (DomDocumentType : DomNode)

メソッド名関数名注記
nameDomDocumentType_name() 
entitiesDomDocumentType_entities() 
notationsDomDocumentType_notations() 
public_idDomDocumentType_public_id() 
system_idDomDocumentType_system_id() 
internal_subsetDomDocumentType_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'>
  &amp;sp;
  <!-- comment -->
  <informaltable ID='findme' language='&amp;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->specified --  属性が指定されているかどうか調べる
DomAttribute->value --  属性の値を返す
DomDocument->add_root [deprecated] --  ルートノードを追加する
DomDocument->create_attribute --  新規属性を作成する
DomDocument->create_cdata_section --  新規cdataノードを作成する
DomDocument->create_comment --  新規コメントノードを作成する
DomDocument->create_element_ns --  Create new element node with an associated namespace
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 -- 
DomDocument->get_elements_by_tagname -- 
DomDocument->html_dump_mem --  HTMLとして文字列に内部XMLツリーをダンプする
DomDocument->xinclude --  Substitutes XIncludes in a DomDocument Object
DomDocumentType->entities --  エントリのリスト返す
DomDocumentType->internal_subset --  内部サブセットを返す
DomDocumentType->name --  ドキュメントの型名を返す
DomDocumentType->notations --  ノーテーションのリストを返す
DomDocumentType->public_id --  document typeのpublic IDを返す
DomDocumentType->system_id --  document typeの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 --  Adds a namespace declaration to a node
DomNode->append_child --  子ノードの最後に新規に子ノードを追加する
DomNode->append_sibling --  新規に兄弟をノードに追加する
DomNode->attributes --  属性のリストを返す
DomNode->child-nodes --  子ノードを返す
DomNode->clone_node --  ノードの複製を作る
DomNode->dump_node --  ノードを1つダンプする
DomNode->first_child --  最初の子ノードを返す
DomNode->get_content --  ノードのコンテンツを取得する
DomNode->has_attributess --  ノードが属性を有しているかを調べる
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 --  Replaces a child
DomNode->replace_node --  ノードを置換する
DomNode->set_content --  ノードのコンテンツを設定する
DomNode->set_name --  ノードの名前を設定する
DomNode->set_namespace --  Sets namespace of a node
DomNode->unlink_node --  ノードを削除する
DomProcessingInstruction->data --  PIノードのデータを返す
DomProcessingInstruction->target --  PIノードのターゲットを返す
DomXsltStylesheet->process --  Applies the XSLT-Transformation on a DomDocument Object
DomXsltStylesheet->result_dump_file --  Dumps the result from a XSLT-Transformation into a file
DomXsltStylesheet->result_dump_mem --  Dumps the result from a XSLT-Transformation back into a string
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 --  Creates a DomXsltStylesheet Object from a DomDocument Object
domxml_xslt_stylesheet_file --  Creates a DomXsltStylesheet Object from an XSL document in a file
domxml_xslt_stylesheet --  Creates a DomXsltStylesheet Object from an XML document in a string
xpath_eval_expression --  指定した文字列のXPathロケーション式を評価する
xpath_eval --  指定した文字列のXPathロケーションを評価する
xpath_new_context --  新規xpathコンテキストを作成する
xptr_eval --  指定した文字列のXPtrロケーションパスを評価する
xptr_new_context --  新規XPathコンテキストを作成する


add a note add a note User Contributed Notes
DOM XML関数
steve at find-information-on dot com
12-Feb-2005 12:33
If you are using apache, instead of copying files around (iconv.dll for instance) you can use this in your httpd.conf for apache:

LoadFile "d:/php/dlls/iconv.dll"

I placed this line before

LoadModule php4_module "d:/php/sapi/php4apache2.dll"

and it worked, no copying of files or anything therefore helps when updating php, don't have to mess around searching for files and other stuff.
ndaniel at bsi-scs dot com
22-Dec-2004 01:54
I recently developed a script for parsing DHL XML transaction responses - finding it a pain in the rear to actually parse the XML and set my variables - it actually wasn't that hard once I figured it out - and it goes something like this...

<?php

// Use with a class containing functions set_attributes() and
// set_data().  Use the following to set variables from the
// resulting xml.  $node is a dom xml object - in the first call
// to loop, $node would be equal to the root document
// element.

function loop($node) {
 
// set attribute tags here
 
if ($node->has_attributes()) {
  
$this->set_attributes($node);
 }
// end if node has attributes
      
 
if ($node->has_child_nodes()) {
  
$this->loop($node->first_child());
 }
// end if node has child
 
else {
  
$this->set_data($node);
 }
// end if node has no child
 // get next sibling
 
$node = $node->next_sibling();
 if (
$node) {
  
$this->loop($node);
 }
// end if node
} // end function loop
?>

The code goes from the root element, if the element has attributes - it sets attribute variables.  Second, it recursively proceeds to the lowest level element (no more children).  Once that level has been reached, data variables are set.  The next step goes to the next sibling of the element, if it exists.  If the next sibling does not exists, the function is ended and the current element is returned to the parent element.  The parent element is then checked for siblings.  This process continues (as is with recursion) until the parent element is back at the root element, which is the end of the document.
deborah dot seidman at imc-fr dot com
10-Dec-2004 04:15
You can always use a sax parser (expat) which saves on memory storage (there is none as sax is event driven) and use this neat code to produce an array structure of you xml file :

see

comment by
tgrabietz at bupnet dot de
22-Sep-2004 05:05
jas at uci dot edu
15-Nov-2004 11:56
i needed to have an easy way to create a multi-dimensional but EXTREMELY SIMPLE php array out of some XML text i'm receiving. NOT an object. just an ARRAY.

i found that as simple a request as this seemed to be, the new (php5) DOM functions do not provide this functionality.

even the SimpleXML functions are object-oriented, which doesn't work for some of my purposes (sending to a Smarty template variable for looping through, etc.) -- returning attributes as SimpleXMLElement objects instead of strings, etc.. i just wanted an ARRAY containing the data as STRINGS.

eli () had submitted such code earlier, based on domxml/php4 calls. his function was called "domxml_xmlarray".

but when php5 came out, eli's comments at the bottom of the PHP site got erased. (fortunately, i had already saved his code.) no doubt, mine will too w/next version..

furthermore, as far as i can tell, no one has taken the cue to add something like eli's domxml_xmlarray function directly into the DOMDocument object (but it would be nice).

so i translated eli's code, now using the dom calls (instead of the older domxml calls), and renamed the function to "dom_to_simple_array()".

below is a script containing the function itself as well as an example of its use. just copy it to your server somewhere and execute it and it should work right off the bat if you are using php5.

thanks.
jeff stern
  
==================================================================
<?php

function dom_to_simple_array($domnode, &$array) {
 
$array_ptr = &$array;
 
$domnode = $domnode->firstChild;
  while (!
is_null($domnode)) {
   if (! (
trim($domnode->nodeValue) == "") ) {
     switch (
$domnode->nodeType) {
       case
XML_TEXT_NODE: {
        
$array_ptr['cdata'] = $domnode->nodeValue;
         break;
       }
       case
XML_ELEMENT_NODE: {
        
$array_ptr = &$array[$domnode->nodeName][];
         if (
$domnode->hasAttributes() ) {
          
$attributes = $domnode->attributes ();
           if (!
is_array ($attributes)) {
             break;
           }
           foreach (
$attributes as $index => $domobj) {
            
$array_ptr[$index] = $array_ptr[$domobj->name] = $domobj->value;
           }
         }
         break;
       }
     }
     if (
$domnode->hasChildNodes() ) {
      
dom_to_simple_array($domnode, $array_ptr);
     }
   }
  
$domnode = $domnode->nextSibling;
  }
}

 
# now, let's make a sample string containing some XML
 
$strXMLData = "<contacts>
       <contact>
         <name>
           John Doe
         </name>
         <phone>
           123-456-7890
         </phone>
       </contact>
       <contact>
         <name>
           Mary Smiley
         </name>
         <phone>
           567-890-1234
         </phone>
       </contact>
     </contacts>"
;

 
# create a DOM tree xml object (hierarchical array) from
  # this XML string
 
$domdoc = new DOMDocument;
 
$domdoc->loadXML($strXMLData);

 
# now simplify the DOM array into a very simple array structure

  # first, create an empty array to be filled with your
  # simplified array result..
 
$aData = array();

 
# now, pass the dom document and your empty array to the
  # converter function.
 
dom_to_simple_array($domdoc, $aData);

 
# now $aData contains your simplified array, so print it out
?><html>
<body>
<p>there are <? echo count($aData['contacts'][0]['contact']); ?>
contacts</p>
<p>the 2nd contact's phone number is
<?echo $aData['contacts'][0]['contact'][1]['phone'][0]['cdata']; ?>
</p>
<hr />
<p>Here is the raw array structure:</p>
<pre>
<? print_r($aData); ?>
</pre>
</body>
</html>
==================================================================
Alex
04-Jul-2004 04:48
PHP4/DOMXML code is not compatible with the new PHP5/dom extension. While the conversion is quite strait forward, it can take a long time if domxml has been broadly used. Moreover, it can be interesting to have old PHP4 scripts ready for PHP5 as soon as possible even if the server is still running PHP4. Since I have that kind of problem, if have written a small library to include in PHP4 scripts to enable them to be run on PHP5.

It does not cover all the domxml functionality, but most of the main functions and can easily be extended. Tested with PHP4.3.7 and PHP5.0.0RC3 but I will try to keep it updated. I hope it can help.
sn00b at yahoo dot com
23-Jun-2004 11:18
When you want to use XSLT extensions you have to copy "expat.dll" and "sablot.dll" into your windows-system directory.
closedfile
21-Jun-2004 05:01
If you use IIS and Windows NT, pleace make sure that the file
"iconv.dll" is in the directory "winnt/system32/". Else you will get an error.
SAM
22-Apr-2004 06:05
When installing PHP --with-dom and --with-dom-xslt on a Red Hat 9.0 remember to install the following packages:

libxml
libxml2
libxml2-devel
libxslt
libxslt-devel

Then you will be spared error messages when trying to configure.

regards
SAM
ngc(dontSpamMe)rapanden(SpamOFF)dk
28-Jan-2004 12:48
Sorry, a bug in my code... I made the first version late at night, sorry!

The bug was in the "if ($ChildDomNode->has_child_nodes())" block, I didn't save the data for the for the CildNode of the CildNodes. the bug has been fixed.

<?php
function getElementAttributes($DomNode,$elementName,$attriName)
{
   if (
$ChildDomNode = $DomNode->first_child())
   {
       while(
$ChildDomNode)
       {
           if (
$ChildDomNode->node_type() == XML_ELEMENT_NODE)
             {
               if(
$ChildDomNode->node_name() == $elementName)
               {
              
                 if (
$ChildDomNode->has_attributes())
                 {
                  
$Array = $ChildDomNode->attributes();
                   foreach (
$Array AS $DomAttribute)
                   {
                       if(
$DomAttribute->name() == $attriName)
                       {
                        
$nodeArray[] = $DomAttribute->value();
                       }
                   }
// foreach ($Array AS $DomAttribute)

                
}//if ($ChildDomNode->has_attributes())
              
              
}
          
             if (
$ChildDomNode->has_child_nodes())
               {
                  
$tmpArray = (getElementAttributes($ChildDomNode,$elementName,$attriName));
                  
$nodeArray = array_merge($nodeArray, $tmpArray);
                   unset(
$tmpArray);
               }
// if ($ChildDomNode->has_child_nodes())
              
          
}//if ($ChildDomNode->node_type() == XML_ELEMENT_NODE)
          
          
$ChildDomNode = $ChildDomNode->next_sibling();

       }
//while($ChildDomNode)
      
  
return $nodeArray;
  }
//if ($ChildDomNode = $DomNode->first_child())
 
}
$file = "test3.xml";
$element = "pb";
$att = "id";
$DomDocument = domxml_open_file($file);
$RootDomNode = $DomDocument->document_element();
$array = getElementAttributes($RootDomNode,$element,$att);
echo
"<pre>";
print_r($array);
echo
"</pre>";
?>
bps7j at yahoSPAMo.com
24-Dec-2003 08:19
I've also rolled my own DOM-like functionality for places where the DOM extensions aren't available.

bradparks at bradparks dot com
17-Dec-2003 10:41
Hey;

If you need to parse XML on an older version of PHP (e.g. 4.0) or if you can't get the expat extension enabled on your server, you might want to check out the Saxy and DOMIT! xml parsers from Engage Interactive. They're opensource and pure php, so no extensions or changes to your server are required. I've been using them for over a month on some projects with no problems whatsoever!

Check em out at:

DOMIT!, a DOM based xml parser, uses Saxy (included)


or

Saxy, a sax based xml parser


Brad
bart at mediawave dot nl
11-Nov-2003 07:46
This recursive function will iterate over a DOM object and display it as a nicely formatted XML structure. I used intuitive variable names to help learn more about the DOM functions and their return values.

<<?php

function PrintDomTree($DomNode)
{
   if (
$ChildDomNode = $DomNode->first_child()) {
       static
$depth = 0;

      
$whitespace = "\n<br>".str_repeat(" ", ($depth * 2));

       while (
$ChildDomNode) {
           if (
$ChildDomNode->node_type() == XML_TEXT_NODE) {
               echo
trim($ChildDomNode->node_value());
           } elseif (
$ChildDomNode->node_type() == XML_ELEMENT_NODE) {
              
$HasTag = 1;
               echo
$whitespace;
               echo
"<", $ChildDomNode->node_name();

               if (
$ChildDomNode->has_attributes()) {
                  
$Array = $ChildDomNode->attributes();
                   foreach (
$Array AS $DomAttribute) {
                       echo
" ", $DomAttribute->name(), "=\"", $DomAttribute->value(), "\"";
                   }
               }
               echo
">";

               if (
$ChildDomNode->has_child_nodes()) {
                  
$depth++;
                   if (
PrintDomTree($ChildDomNode)) {
                       echo
$whitespace;
                   }
                  
$depth--;
               }
               echo
"</", $ChildDomNode->node_name(), ">";
           }
          
$ChildDomNode = $ChildDomNode->next_sibling();
       }
       return
$HasTag;
   }
}

?>
nospam at phppatterns dot com
09-Apr-2003 08:51
If you're having trouble understanding how the the DOM XML extension fits together you may find the UML diagram here helps:
sorn at dsl dot upc dot es
17-Mar-2003 11:38
When parsing "iso-8859-1" encoded XML files, use "utf8_decode" to recover node contents (libxml uses "UTF-8" internal encoding, so conversion needed).

--- BEGIN: mydata.xml ---
<?xml version="1.0" encoding="iso-8859-1"?>
...
--- END: mydata.xml---

--- BEGIN: myparser.php ---
<?php
...
$domxml = domxml_open_file("mydata.xml"));
...
$content = utf8_decode(trim($node->content));
echo
$content;
...
?>
--- END: myparser.php

-eof-

<dom_import_simplexmlDomAttribute->name>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page