当前位置:中国站长下载文章中心网页编程PHP编程 → 用PHP与XML联手进行网站编程(2)

用PHP与XML联手进行网站编程(2)

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 10:24:35
     五、案例解析
  
    以下是用PHP5实现读取一个以XML 1.0格式编写的通讯录address.xml,并显示其内容的示例。详解见有关注释。
  
  <?
   //
   //第一部分:几个PHP Helper函数
   //
  
   /**********************************
  
   *从一个文件中读取XML的 *
   *内容到字符串中 *
  
   *********************************/
  
  function read_file($filename)
  {
   //读取文件
   $lines=file($filename);
   //变量$contents是存放文件内容的变量
   $contents="";
   while(list($key,$value)=each($lines))
   {
    $contents.=$value;
   }
   return $contents;
  }
  
  /*********************************
  *当PHP遇到一个XML的起始标记时 *
  *调用,其作用是按照一定的层次 *
  *显示出XML的标记 *
  *********************************/
  
  function start_element($parser, $name, $attrs)
  {
   //变量$depth存放标记的深度
   global $depth;
   //变量$spacer存放标记前所有的箭头符号
   $spacer="";
   for ($i=1;$i<$depth[$parser];$i++)
   {
    $spacer.="->";
   }
   //设置标记显示时的颜色
   if($depth[$parser]==0)
   {
    $font_color="red";
   }
   else
    if($depth[$parser]==1)
    {
     $font_color="green";
    }
   else
   {
    $font_color="blue";
   }
   //设置标记显示时的字体
   $font_size=5-$depth[$parser];
   if ($font_size<2)
   {
    $font_size=2;
   }
   //显示标记
   echo "<font size=".$font_size." color=".$font_color.">";
   echo $spacer.$depth[$parser];
   if ($depth[$parser]<>0)
   {
    echo "、";
   }
   echo $name."<BR>";
   echo "</font>";
   $depth[$parser]++;
   //如果是主标记就显示红色的水平线
   if($depth[$parser]==2)
   {
    echo "<hr color=red size=1>";
   }
  }
  
  /*********************************
  *当PHP遇到一个XML的结束标记时 *
  *调用,其作用是改变当前的层次 *
  *计数,并在主标记下显示水平线 *
  *********************************/
  
  function stop_element($parser,$name)
  {
   //变量$depth存放标记的深度
   global $depth;
   $depth[$parser]--;
   //如果是主标记就显示红色的水平线
   if($depth[$parser]==2)
   {
    echo "<hr color=red size=1>";
   }
  }
  
  /*********************************
  *当PHP遇到一个XML的标记内容时 *
  *调用,其作用是按照一定的层次 *
  *显示出标记的内容 *
  *********************************/
  
  function char_data($parser,$data)
  {
   //变量$depth存放标记的深度
   global $depth;
   //显示标记的内容
   $data=trim($data);
   if (strlen($data))
   {
    for ($i=1;$i<$depth[$parser]+6;$i++)
     echo " ";
     echo "<b>$data</b><br>\n";
   }
  }
  
  //
  //第二部分:PHP文件开始执行处
  //
  //要解析的XML文件的名字
  
  $file="address.xml";
  //读取文件
  $data=read_file($file);
  
  // 产生解析器的实例
  $parser = xml_parser_create();
  // 设置处理函数
  xml_set_element_handler($parser, "start_element", "stop_element");
  xml_set_character_data_handler($parser, "char_data");
  // 解析文件
  if(!xml_parse($parser,$data,1))
  {
   //报错
   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);
  ?>
  
  
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。