TOP書籍連動> 使用例(1)
まるごと PHP!
まるごと PHP!

Part5:PHP5のXMLサポート(2)

著者:廣川 類(HIROKAWA, Rui)    2005/4/6
1   2  次のページ
使用例(1)

   それでは、いよいよ実際のXMLデータを処理してみましょう。ここでは、簡単なXMLデータの例としてリスト1に示す書籍リスト(sample.xml)を使用します 。
リスト1:書籍リスト(sample.xml)
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<title>Advanced PHP Programming</title>
<author>George Schlossnagle</author>
</book>
<book>
<title>The PHP Anthology</title>
<author>Harry Fuecks</author>
</book>
</books>
SAXによるデータ読み込み・出力

   まず、SAXでsample.xmlを読み込んで表示するスクリプト(sax.php)をリスト2に示します。

リスト2:SAXの例(sax.php)
 1 <?php
 2
 3 $tags = array();
 4 $cdata = "";
 5
 6 function startElement ($parser, $name, $attribs) {
 7global $tags;
 8array_push($tags, $name);
 9 }
10
11 function endElement ($parser, $name) {
12global $tags, $cdata;
13$tag = array_pop($tags);
14if ($tag == "TITLE") {
15print "<tr><th>$cdata</th>\n";
16}
17if ($tag == "AUTHOR") {
18print "<td>$cdata</td></tr>\n";
19}
20 }
21
22 function characterData ($parser, $data) {
23global $tags, $cdata;
24$cdata = $data;
25 }
26
27 $xml = xml_parser_create();
28 xml_set_element_handler ($xml, "startElement", "endElement");
29 xml_set_character_data_handler ($xml, "characterData");
30 $fp = fopen("sample.xml", "r");
31
32 print "<table>";
33 while ($data = fread($fp, 4096)) {
34if (!xml_parse ($xml, $data, feof($fp))) {
35die(sprintf ("error: %s at line %d\n",
36xml_error_string(xml_get_error_code($xml)),
37xml_get_current_line_number($xml)));
38}
39 }
40 print "</table>";
41 ?>

   sax.phpでは、xml_parser_create()によりSAXパーサーを生成(27行目)した後、開始タグおよび終了タグ用のコールバック関数をxml_set_element_handler()関数(28行目)、文字データ用のハンドラをxml_set_character _data_handler()関数により登録しています(29行目)。

   XMLデータの実際の処理は、whileループ内でファイルから読み込んだデータをxml_parser()関数により逐次処理することにより行います(33〜39行目)。この処理を行う際に、XMLデータの内容に応じて適宜登録したコールバック関数がコールされます。

   出力は、図2のようになります。



図2:SAXサンプルによる出力

   開始タグ、終了タグ、文字データがコールバック関数により処理され、HTMLテーブル形式でデータが出力されていることがわかります。

1   2  次のページ



著者プロフィール
著者:廣川 類
PHPと出会ってから早9年が過ぎ、常に進化し続けるその姿を日々楽しんでいる。PHPコミュニティ活動にかけられる時間が年々減ってきているのが気がかり。


INDEX
Part5:PHP5のXMLサポート(2)
使用例(1)
  使用例(2)