四、在第三章程序的基础上,可以显示一段子树。 同第二章的代码我就不再注释了。 下面的代码是我们的迷你搜索引擎的基础。 因为,要显示出一个字类别(如程序设计->PHP->)的信息就要用到他。 我们依照元素的层数和他在当层的第几号来对他进行定位 如:
links (0,1) +----web (1,1) +----sub (1,2) | +----web (2,1) | +----sub (2,2) | | +----web (3,1) | | +----sub (3,2)
: : : __________________________________________________________ <html> <body>
<?
// XML文件 $file = "demo.xml";
// 解析XML文件的函数 function xml_parse_from_file($parser, $file) { if(!file_exists($file)) { die("Can’t find file "$file"."); }
if(!($fp = @fopen($file, "r"))) { die("Can’t open file "$file"."); }
while($data = fread($fp, 4096)) { if(!xml_parse($parser, $data, feof($fp))) { return(false); } }
fclose($fp);
return(true); }
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){ echo "<br>"; for($i=1;$i<=($level-1-$lev);$i++)echo"| "; if($level-$lev>0)echo"+----";
echo "<a href=$PHP_SELF?lev=$level&num=$levelcount[$level]>". //加上每个元素节点的联接 trim($name)." </a>";
while ( list( $key, $val ) = each( $attrs ) ) { echo "<font color=green>$key => $val</font>; "; } }
}
function stop_element($parser, $name) { global $level;
$level -= 1; }
function data($parser, $data) { global $level,$hide; if(!$hide) if(trim($data)!=""){ echo trim($data); } }
//main start global $hide,$lev,$num,$PHP_SELF; $level = -1; $hide = TRUE;
echo "<p><a href=$PHP_SELF>Root</a></p>";
if($lev==""){$lev=0;$num=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);
?> </body> </html>
|