PHP教程之利用PHP 5.0 轻松解析XML文档(2)
不过语法好学,但是怎么用语法来实现每个人都有每个人的方式,几乎是各有千秋。然而借鉴别人成功的代码,绝对是有益无害,因此,多看那些经过千锤百炼凝出来的经典代码,是进阶的最好方法。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)? $name.'_'.$attributes: $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 = $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 as $attkey=>$attvalue) $str .= " $attkey=\"$attvalue\""; $tmpStr = $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); }}?>
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。 当然这种网站的会员费就几十块钱。 要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。 Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81 我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域, 说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。 有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 当然这种网站的会员费就几十块钱。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。 有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
页:
[1]