参考: PHP爱好者
本例中的xml文件位于http://www.slashdot.org/slashdot.xml
本例中的php文件读取、显示xml文件内容
以下为php文件的内容,把该php文件和slashdot.xml放在同一个文件夹即可
<?php $open_tags = array( 'STORY' => '<STORY>', 'TITLE' => '<TITLE>', 'URL' => '<URL>', 'AUTHOR'=> '<AUTHOR>' );
$close_tags = array( 'STORY' => '</STORY>', 'TITLE' => '</TITLE>', 'URL' => '</URL>', 'AUTHOR'=> '</AUTHOR>' ); ?>
<?php //下面就是定义函数来提取数据:
// 处理开始标记的属性指 // $attrs是一个多维数组,键值为属性名, 值就是该属性的值 function startElement($parser, $name, $attrs=''){ global $open_tags, $temp, $current_tag; $current_tag = $name; if ($format = $open_tags[$name]){ switch($name){ case 'STORY': echo '新的故事: '; break; default: break; } } }
// $current_tag告诉我们正在处理的标记,我们随后会在characterData函数中使用 // // 当遇到</STORY>标记时我们知道要flush所有的临时变量准备操作下一个标记 function endElement($parser, $name, $attrs=''){ global $close_tags, $temp, $current_tag; if ($format = $close_tags[$name]){ switch($name){ case 'STORY': return_page($temp); $temp = ''; break; default: break; } } }
// 传送给此函数的是元素间的数据 // 例如,对<TITLE>Title Here</TITLE>,$data就等于'Title Here' function characterData($parser, $data){ global $current_tag, $temp, $catID; switch($current_tag){ case 'TITLE': $temp['title'] = $data; $current_tag = ''; break; case 'URL': $temp['url'] = $data; $current_tag = ''; break; case 'AUTHOR': $temp['author'] = $data; $current_tag = ''; default: break; } } ?>
<?php
function return_page(){ global $temp; echo 'o <A HREF="'.$temp['url'].'">'.$temp['title'].'</A><BR>'; echo 'Author:'.$temp['author'].'<BR>'; echo '-----------------------------'; echo '<br>'; }
// 分析的内容 $xml_file = 'slashdot.xml';
// 定义字符集,默认是UTF-8 $type = 'UTF-8';
// 建立解析器 $xml_parser = xml_parser_create($type);
// 设置解析选项 xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true); xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
// 告诉PHP发现元素时要调用什么函数 // 这些函数同时也处理元素的属性 xml_set_element_handler($xml_parser, 'startElement','endElement');
//告诉PHP对字符数据调用什么函数 xml_set_character_data_handler($xml_parser, 'characterData');
if (!($fp = fopen($xml_file, 'r'))) { die("无法打开 $xml_file 文件进行解析!n"); }
// 通过循环来解析整个文件 while ($data = fread($fp, 4096)) { if (!($data = utf8_encode($data))) { echo 'ERROR'."n"; } if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf( "XML error: %s at line %dnn", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } }
xml_parser_free($xml_parser);
?>

|