|
|
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. 古い関数とその代替関数 古い関数 | 新しい関数 |
---|
xmldoc | domxml_open_mem() | xmldocfiel | 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内部にコンパイルされているか実行時に動的にロー
ドされるかのどちらかの場合のみ使用可能です。
モジュールの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_elemnent | 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_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>";
?>
|
|
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
function loop($node) {
if ($node->has_attributes()) {
$this->set_attributes($node);
} if ($node->has_child_nodes()) {
$this->loop($node->first_child());
} else {
$this->set_data($node);
} $node = $node->next_sibling();
if ($node) {
$this->loop($node);
} } ?>
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;
}
}
$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>";
$domdoc = new DOMDocument;
$domdoc->loadXML($strXMLData);
$aData = array();
dom_to_simple_array($domdoc, $aData);
?><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();
}
}}}
if ($ChildDomNode->has_child_nodes())
{
$tmpArray = (getElementAttributes($ChildDomNode,$elementName,$attriName));
$nodeArray = array_merge($nodeArray, $tmpArray);
unset($tmpArray);
}}$ChildDomNode = $ChildDomNode->next_sibling();
}return $nodeArray;
}}
$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-
| |