中国站长下载-为中国站长提供最好最全的建站资源! 首 页发布资源有事留言繁體中文
设为首页
加入收藏
联系我们
 
您当前的位置:中国站长下载 -> 文章中心 -> 网页编程 -> PHP编程 -> 文章内容  虚拟主机 域名注册 退出登录 用户管理
栏目导航
· ASP编程 · .NET编程
· PHP编程 · JSP编程
· CGI 专区
热门文章
· sndvol32 - sndvol3...
· [组图] FLASH:《大话李白》...
· 个人网站到底能赚多...
· [图文] Rundll.exe是病毒吗...
· [组图] Flash:制作MV
· 价值12万元的网站SE...
· 网站创业者,你需要...
· 一个成功的网站设计...
· [图文] FLASH:韩国导航条解...
· 中国网站的赚钱模式...
相关文章
· [组图] Flash MX 2004 体验...
· [图文] 巧妙运用Flash MX 2...
· Flash MX 2004 Acti...
· [图文] Flash MX 2004 Acti...
· [组图] Flash MX 2004 Acti...
· [图文] Flash MX 2004 Acti...
· [组图] Flash MX 2004 Acti...
· [图文] Flash MX 2004 Acti...
· Flash MX 2004 Acti...
· Flash MX 2004 Acti...
使用PHP 5.0 轻松解析XML文档 (2)
作者:不详  来源:不详  发布时间:2006-8-14 10:20:13  发布人:chinazhan

 减小字体 增大字体

     文件:SimpleDocumentParser.PHP
  
  
  <?php
  /**
   *=========================================================
   *
   * @author hahawen(大龄青年)
   * @since 2004-12-04
   * @copyright Copyright (c) 2004, NxCoder Group
   *
   *=========================================================
   */
  /**
   * class SimpleDocumentParser
   * use SAX parse XML file, and build SimpleDocumentObject
   * all this pachage's is work for xml file, and method is action as DOM.
   *
   * @package SmartWeb.common.xml
   * @version 1.0
   */
  class SimpleDocumentParser
  {
   private $domRootObject = null;
   private $currentNO = null;
   private $currentName = null;
   private $currentValue = null;
   private $currentAttribute = null;
   public function getSimpleDocument()
   {
   return $this->domRootObject;
   }
   public function parse($file)
   {
   $xmlParser = xml_parser_create();
   xml_parser_set_option($xmlParser,XML_OPTION_CASE_FOLDING, 0);
   xml_parser_set_option($xmlParser,XML_OPTION_SKIP_WHITE, 1);
   xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
   xml_set_object($xmlParser, $this);
   xml_set_element_handler($xmlParser, "startElement", "endElement");
   xml_set_character_data_handler($xmlParser, "characterData");
   if (!xml_parse($xmlParser, file_get_contents($file)))
   die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xmlParser)),        xml_get_current_line_number($xmlParser)));
   xml_parser_free($xmlParser);
   }
   private function startElement($parser, $name, $attrs)
   {
   $this->currentName = $name;
   $this->currentAttribute = $attrs;
   if($this->currentNO == null)
   {
   $this->domRootObject = new SimpleDocumentRoot($name);
   $this->currentNO = $this->domRootObject;
   }
   else
   {
   $this->currentNO = $this->currentNO->createNode($name, $attrs);
   }
   }
   private function endElement($parser, $name)
   {
   if($this->currentName==$name)
   {
   $tag = $this->currentNO->getSeq();
   $this->currentNO = $this->currentNO->getPNodeObject();
   if($this->currentAttribute!=null && sizeof($this->currentAttribute)>0)
   $this->currentNO->setValue($name, array('value'=>$this->currentValue,        'attrs'=>$this->currentAttribute));
   else
   $this->currentNO->setValue($name, $this->currentValue);
   $this->currentNO->removeNode($tag);
   }
   else
   {
   $this->currentNO = (is_a($this->currentNO, 'SimpleDocumentRoot'))? null:         $this->currentNO->getPNodeObject();
   }
   }
   private function characterData($parser, $data)
   {
   $this->currentValue = iconv('UTF-8', 'GB2312', $data);
   }
   function __destruct()
   {
   unset($this->domRootObject);
   }
  }
  ?>
  
  
  
  
    文件:SimpleDocumentBase.php
  
  <?php
  /**
   *=========================================================
   *
   * @author hahawen(大龄青年)
   * @since 2004-12-04
   * @copyright Copyright (c) 2004, NxCoder Group
   *
   *=========================================================
   */
  /**
   * abstract class SimpleDocumentBase
   * base class for xml file parse
   * all this pachage's is work for xml file, and method is action as DOM.
   *
   * 1\ add/update/remove data of xml file.
   * 2\ explode data to array.
   * 3\ rebuild xml file
   *
   * @package SmartWeb.common.xml
   * @abstract
   * @version 1.0
   */
  abstract class SimpleDocumentBase
  {
   private $nodeTag = null;
   private $attributes = array();
   private $values = array();
   private $nodes = array();
   function __construct($nodeTag)
   {
   $this->nodeTag = $nodeTag;
   }
   public function getNodeTag()
   {
   return $this->nodeTag;
   }
   public function setValues($values){
   $this->values = $values;
   }
   public function setValue($name, $value)
   {
   $this->values[$name] = $value;
   }
   public function getValue($name=null)
   {
   return $name==null? $this->values: $this->values[$name];
   }
   public function removeValue($name)
   {
   unset($this->values["$name"]);
   }
   public function setAttributes($attributes){
   $this->attributes = $attributes;
   }
   public function setAttribute($name, $value)
   {
   $this->attributes[$name] = $value;
   }
   public function getAttribute($name=null)
   {
   return $name==null? $this->attributes: $this->attributes[$name];
   }
   public function removeAttribute($name)
   {
   unset($this->attributes["$name"]);
   }
   public function getNodesSize()
   {
   return sizeof($this->nodes);
   }
   protected function setNode($name, $nodeId)
   {
   $this->nodes[$name] = $nodeId;
   }
   public abstract function createNode($name, $attributes);
   public abstract function removeNode($name);
   public abstract function getNode($name=null);
   protected function getNodeId($name=null)
   {
   return $name==null? $this->nodes: $this->nodes[$name];
   }
   protected function createNodeByName($rootNodeObj, $name, $attributes, $pId)
   {
   $tmpObject = $rootNodeObj->createNodeObject($pId, $name, $attributes);
   $key = isset($attributes[id])? $name.'_'.$attributes[id]: $name.'_'.$this->getNodesSize();
   $this->setNode($key, $tmpObject->getSeq());
   return $tmpObject;
   }
   protected function removeNodeByName($rootNodeObj, $name)
   {
   $rootNodeObj->removeNodeById($this->getNodeId($name));
   if(sizeof($this->nodes)==1)
   $this->nodes = array();
   else
   unset($this->nodes[$name]);
   }
   protected function getNodeByName($rootNodeObj, $name=null)
   {
   if($name==null)
   {
   $tmpList = array();
   $tmpIds = $this->getNodeId();
   foreach($tmpIds as $key=>$id)
   $tmpList[$key] = $rootNodeObj->getNodeById($id);
   return $tmpList;
   }
   else
   {
   $id = $this->getNodeId($name);
   if($id===null)
   {
   $tmpIds = $this->getNodeId();
   foreach($tmpIds as $tkey=>$tid)
   {
   if(strpos($key, $name)==0)
   {
   $id = $tid;
   break;
   }
   }
   }
   return $rootNodeObj->getNodeById($id);
   }
   }
   public function findNodeByPath($path)
   {
   $pos = strpos($path, '|');
   if($pos<=0)
   {
   return $this->getNode($path);
   }
   else
   {
   $tmpObj = $this->getNode(substr($path, 0, $pos));
   return is_object($tmpObj)? $tmpObj->findNodeByPath(substr($path, $pos+1)): null;
   }
   }
   public function getSaveData()
   {
   $data = $this->values;
   if(sizeof($this->attributes)>0)
   $data[attrs] = $this->attributes;
   $nodeList = $this->getNode();
   if($nodeList==null)
   return $data;
   foreach($nodeList as $key=>$node)
   {
   $data[$key] = $node->getSaveData();
   }
   return $data;
   }
   public function getSaveXml($level=0)
   {
   $prefixSpace = str_pad("", $level, "\t");
   $str = "$prefixSpace<$this->nodeTag";
   foreach($this->attributes as $key=>$value)
   $str .= " $key=\"$value\"";
   $str .= ">\r\n";
   foreach($this->values as $key=>$value){
   if(is_array($value))
   {
   $str .= "$prefixSpace\t<$key";
   foreach($value[attrs] as $attkey=>$attvalue)
   $str .= " $attkey=\"$attvalue\"";
   $tmpStr = $value[value];
   }
   else
   {
   $str .= "$prefixSpace\t<$key";
   $tmpStr = $value;
   }
   $tmpStr = trim(trim($tmpStr, "\r\n"));
   $str .= ($tmpStr===null || $tmpStr==="")? " />\r\n": ">$tmpStr</$key>\r\n";
   }
   foreach($this->getNode() as $node)
   $str .= $node->getSaveXml($level+1)."\r\n";
   $str .= "$prefixSpace</$this->nodeTag>";
   return $str;
   }
   function __destruct()
   {
   unset($this->nodes, $this->attributes, $this->values);
   }
  }
  ?>
  
  
  
  
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。

 
[] [返回上一页] [打 印] [收 藏]
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
中国站长下载
中国站长下载

本页只接受PR>=4 IT类站点连接,申请连接,谢谢您们的支持!希望我们的下载站能够真正帮到中国的站长们!
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图
Copyright © 2005-2006 ChinaZhan.Net. All Rights Reserved .