Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2004/01/30

counter hits
since 1999/11/06


PHP4.3.0でのDOM XML

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

memo[2004/01/30] PHP5からSimpleXML関数が追加されますが、こちらもXMLをオブジェクトとして扱える関数が揃っています

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

PHP4.3.0ではほぼDOM2(だったと思います)をサポートするようです。最近では、DOM XMLに関しては、4.2.xではなく4.3.0を使っています(まだdevの状態ですが)。その代わり、PHP4.2.xと比べて大幅にAPIが変わっています。

PHP4.3.0のソースは、PHP本家のcvsから取得することができます。取得方法はPHP本家のcvsのページにもありますし、こちらにも手順をまとめていますので、是非チャレンジしてみて下さい。

さて、サンプルですが、まずはDOMのサポート手順のページにもあるサンプルです。今までのDOM関数と比べ、かなりオブジェクト指向的な書き方ができます。


<?php
    // 新規XMLドキュメントを作成し、ルート要素を追加
    $dom = domxml_new_doc("1.0");
    $html = $dom->create_element("html");
    $html->set_attribute("lang", "ja");
    $root = $dom->append_child($html);

    // 新規要素を追加し、内容・属性を設定
    $head = $dom->create_element("head");
    $title = $dom->create_element("title");
    $text = $dom->create_text_node("test");
    $title->append_child($text);
    $head->append_child($title);
    $root->append_child($head);

    $body = $dom->create_element("body");
    $text = $dom->create_text_node(mb_convert_encoding("テストです", "UTF-8"));
    $body->append_child($text);
    $root->append_child($body);

    // 追加修正したXMLを表示
    echo $dom->dumpmem();

    echo "<hr>以下作成されたXMLドキュメントのソースです<br>";
    echo "<pre>";
    echo htmlspecialchars($dom->dumpmem());
    echo "</pre>";
?>

次は、指定したXMLドキュメントの構造を一覧表示するというものです。


<?php
define("CHARSET", mb_internal_encoding());
?>
<?php
    function parseTree($obj) {
        switch ($obj->type) {
        case XML_ELEMENT_NODE:
            echo "要素名:" . mb_convert_encoding($obj->tagname, CHARSET, "utf-8") . "<br>";

            // カレント要素の属性の解析
            $attr = $obj->attributes();
            for ($i = 0; $i < count($attr); $i++) {
                parseTree($attr[$i]);
            }

            // カレント要素の子要素の解析
            $child = $obj->children();
            for ($i = 0; $i < count($child); $i++) {
                parseTree($child[$i]);
            }
            break;

        case XML_ATTRIBUTE_NODE:
            echo " 属性:" . mb_convert_encoding($obj->name(), CHARSET, "utf-8") . " = "
                            . mb_convert_encoding($obj->value(), CHARSET, "utf-8")
                            . "<br>";
            break;

        case XML_TEXT_NODE:
            if (trim($obj->get_content()) != "") {
                echo " 内容:" . mb_convert_encoding($obj->get_content(), CHARSET, "utf-8") . "<br>";
            }
            break;
        }
    }

    // XMLの読込
    $dom = domxml_open_file("domxml.xml");

    // ルートの取得
    $root1 = $dom->document_element();

    // 解析の実行
    parseTree($root1);
?>

●XMLドキュメント
<?xml version="1.0"?>
<article attr1="php" attr2="domxml">
  <subject>PHP関連書籍</subject>
  <book>
    <title>PHP4徹底攻略</title>
    <isbn>ISBN4-7973-1392-7</isbn>
  </book>
  <book>
    <title>Dynamic Webサイト構築入門 PHP編</title>
    <isbn>ISBN-4898142818</isbn>
  </book>
  <book>
    <title>Oracle8iとPHPで作るWebデータベースfor Miracle Linux</title>
    <isbn>ISBN4871938670</isbn>
  </book>
  <book>
    <title>PHPパーフェクトリファレンス</title>
    <isbn>ISBN-4894714027</isbn>
  </book>
</article>
  
●出力結果
要素名:article
 属性:attr1 = php
 属性:attr2 = domxml
要素名:subject
 内容:PHP関連書籍
要素名:book
要素名:title
 内容:PHP4徹底攻略
要素名:isbn
 内容:ISBN4-7973-1392-7
要素名:book
要素名:title
 内容:Dynamic Webサイト構築入門 PHP編
要素名:isbn
 内容:ISBN-4898142818
要素名:book
要素名:title
 内容:Oracle8iとPHPで作るWebデータベースfor Miracle Linux
要素名:isbn
 内容:ISBN4871938670
要素名:book
要素名:title
 内容:PHPパーフェクトリファレンス
要素名:isbn
 内容:ISBN-4894714027

今、このサンプルを元にちょっと面白いものを作っています(^-^)



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2004 by Hideyuki SHIMOOKA all rights reserved.