繁体中文
设为首页
加入收藏
当前位置:PHP技术首页 >> PHP基础 >> 使用PHP 5.0 轻松解析XML文档(2)

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

2004-11-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:文件:SimpleDocumentParser.php <?php /** *========================================================= * * @author hahawen(大龄青年) * @since 2004-12-04 * @copyright Copyright (c) 2004, NxC...
关键字:轻松 文档 XML 5.0 PHP

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

}

}

?>

责任编辑:admin
相关文章