PHPのXML関数

 PHPのXML関数を使って、XML文書のタグを解析してみたサンプルです。 C言語やJavaベースの多くのXML解析ライブラリと同様、 このPHPのXML関数も、解析はイベントドリブンで進みます。 つまり、処理に先立って、

  • タグに出会ったらこれこれの関数(ハンドラ)をコールして処理をさせるように
  • 文字データに出会ったらこれこれの関数(ハンドラ)をコールして処理をさせるように
という指令をセットしておきます。 そして文書の先頭から順に走査していって、タグや文字データに出会うたびに、 出会ったタグや文字列を引数として関数をコールしながら処理を進めます。
 以下の例で入力XML文書にしているサンプルはこんな感じです。 このPHPスクリプトをかけると、Webブラウザへの出力は、 このようなプレーンテキストになるはずです。

<?
$file = "/home/appuser/data/orders.xml";
$hier = array();

function startElement($parser, $name, $attrs){
    global $hier;
    array_push($hier, $name);
    # タグ階層を表示。タグは自動的に大文字に変換されます。
    # (例:「DOCUMENT/SECTION/TOPIC/TITLE」)
    print join($hier, "/") . "<br>\n";
    # 属性は属性名をキー、属性値を値とする配列で渡されます。
    if(count($attrs) > 0){
        $keys = array_keys($attrs);
        while($e = array_shift($keys)){ print "$e = ' $attrs[$e]' "; }
        print "<br>\n";
    }
}

function endElement($parser, $name){
    global $hier;
    array_pop($hier);
}

function handleCharData($parser, $data){
    if(trim($data) != ""){ print "  [$data]<br>\n"; }
}

$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "handleCharData");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}
while ($data = fread($fp, 4096)) {
    if (!xml_parse($parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                    xml_get_current_line_number($parser)));
    }
}
fclose($fp);
xml_parser_free($parser);
# end.
?>

Open Source Web Architecture Top

(first uploaded 2002/03/01 last updated (not ever), URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル