分类:
2008-04-16 17:45:27
如何对文档进行解析?
在完成所有的准备后,现在脚本终于可以解析文档:
Xml_parse_from_file(),一个自定义的函数,打开参数中指定的文件,并以4kb的大小进行解析
xml_parse(),和xml_parse_from_file()一样,当发生错误时,即XML文档的格式不完全时,将会返回false。
我们可以使用xml_get_error_code()函数来得到最后一个错误的数字。将此数字代码传递给xml_error_string()函数即可得到错误的文本信息。输出XML当前的行数,使得调试更容易。
当解析文档时,对于Expat需要强调问题的是:如何保持文档结构的基本描述?
如前所述,基于事件的解析器本身并不产生任何结构信息。不过标签(tag)结构是XML的重要特性。例如,元素序列
就执行这一段}
function data($parser, $data) {……}
function showcount(){ //显示每一层的元素总数}
global $level,$levelcount,$maxlevel;
$level = -1;
$parser = xml_parser_create();// 产生解析器的实例
xml_set_element_handler($parser, "start_element", "stop_element"); // 设置处理函数
xml_set_character_data_handler($parser, "data");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
$ret = xml_parse_from_file($parser, $file); // 解析文件
if(!$ret) {
die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser)));
}
xml_parser_free($parser); // 释放解析器
showcount();
?>
在上面的程序的基础上,可以显示一段子树,我们依照元素的层数和他在该层的第几号来对他进行定位
例如:
links (0,1)
+----web (1,1)
+----sub (1,2)
| +----web (2,1)
| +----sub (2,2)
| | +----web (3,1)
| | +----sub (3,2)
:
:
:
下面的代码是我们的搜索引擎的基础。因为,要显示出一个子类别(如程序设计->PHP->)的信息就要用到他。
……
function start_element($parser, $name, $attrs) {
global $level,$levelcount,$maxlevel,$hide,$lev,$num,$PHP_SELF;
$level += 1;
if($level>$maxlevel)
$maxlevel=$level;
$levelcount[$level]+=1;
if($hide){ //判断是否在子树的范围内,$hide==FALSE 为在
if($level==$lev&&$levelcount[$level]==$num)
$hide=FALSE;
}else{
if($level<=$lev)$hide=TRUE;
}
if(!$hide){
……//输出
}
}
function data($parser, $data) {
global $level,$hide;
if(!$hide){
if(trim($data)!=""){ echo trim($data); }
}
}
……
global $hide,$lev,$num,$PHP_SELF;
$level = -1;
$hide = TRUE;
echo "
";
if($lev==""){
$lev=0;$num=1;
}
……
?>
mini的搜索引擎到底如何做呢?
作了若干的铺垫,下面我们就来看一下我们的搜索引擎的主要文件。
第一段为仿sina,yahoo的按照类别查询
第二段为搜索查询部分(把整个树遍历一遍)显示符合的内容。
xml3.php
关键字匹配采用eregi函数,我们假设输入的文字都是不会导致错误的。
<全文完>