使用PHP 5.0 轻松解析XML文档(2)

80酷酷网    80kuku.com

  xml文件: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);    }}?>      




分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: