php如何生成动态XML

[复制链接]
查看11 | 回复0 | 2010-4-14 16:21:40 | 显示全部楼层 |阅读模式
xml.class.php/************************************************************ ** 文件名: xml.php ** 作 用: xml类,完善中,暂只支持三级节点 ** 作 者: loking(biyees) ** ** example 读取数据: ** $xml = new xml("dbase.xml",'table'); ** $data=$xml->xml_fetch_array(); ** echo ""; ** print_r($data); ** ****************************************************/class xml{var $dbase; //数据库,要读取的XML文件var $dbname; //数据库名称,顶层元素,与数据库文件名称一致var $dbtable; //数据表,要取得的节点var $parser; //剖析器var $vals; //属性var $index; //索引var $dbtable_array;//节点数组var $array; //下级节点的数组var $result; //返回的结果var $querys;function xml($dbase,$dbtable){$this->dbase=$dbase;$this- >dbname="document";$this- >dbtable=$dbtable;$data=$this- >ReadXml($this->dbase);if(!$data){die( "无法读取 $this->dbname.xml");}$this- >parser = xml_parser_create();xml_parser_set_option($this- >parser,XML_OPTION_CASE_FOLDING,0);xml_parser_set_option($this- >parser,XML_OPTION_SKIP_WHITE,1);xml_parse_into_struct($this- >parser,$data,$this->vals,$this->index);xml_parser_free($this- >parser);//遍历索引,筛选出要取值的节点 节点名:$dbtableforeach ($this- >index as $key=>$val) {if ($key == $this- >dbtable) {//取得节点数组$this- >dbtable_array = $val;} else {continue;}}for ($i=0; $i dbtable_array); $i+=2) {$offset = $this- >dbtable_array[$i] + 1;$len = $this- >dbtable_array[$i + 1] - $offset;//array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。//所取节点下级数组$value=array_slice($this- >vals,$offset,$len);//取得有效数组,合并为结果数组$this- >array[]=$this->parseEFF($value);}return true;}//将XML文件读入并返回字符串function ReadXml($file){return file_get_contents($file);}//取得有效数组function parseEFF($effective) {for ($i=0; $i xml_select($method,$condition,$if);} elseif($method=='insert') {return $this- >xml_insert($condition,$if,$array);} elseif($method=='update') {return $this- >xml_update($condition,$if,$array);}}//取得xml数组function xml_fetch_array($condition,$if){//$this- >querys++;$row = $this- >array; //初始化数据数组if($condition) {//是否有条件,如有条件则生成符合条件的数组//生成条件数组,条件格式 field,operator,match$condition=explode( ",",$condition);//条件数组$cs=count($condition)/3; //条件数for($i=0;$i $condition[$i*3],"operator"=>$condition[$i*3+1],"match"=>$condition[$i*3+2]);}//echo count($row);for($r=0;$r ')&&($row[$r][$field]>$match)){$true++;//若条件符合,符合数加1} elseif(($operator==' >')&&($row[$r][$field]>=$match)){$true++;//若条件符合,符合数加1}}//根据条件取值if($if=='and'){//如果多条件为and,当符合数等于条件数时,生成数组if($true==$cs){$result[]=$row[$r];}} else {//如果多条件为or,当有符合纪录时,生成数组if($true!=0){$result[]=$row[$r];}}//echo $true;//echo "";//print_r($true);$true=0;//符合条件数归零,进入下一轮循环}} else {$result=$this- >array;}//echo "";//print_r($this- >result);return $result;}//筛选或统计function xml_select($method,$condition,$if){$result=$this- >xml_fetch_array($condition,$if);if($method=='select'){return $result;} else {return count($result);}}//插入数据function xml_insert($condition,$if,$array){$data=$this- >xml_fetch_array($condition,$if);//总数据数组$data[]=$array; //插入后的总数据数组$this- >array=$data; //更新总数组$this- >WriteXml($data);}//得到更新的XML并改写function xml_update($condition,$if,$array){$datas=$this- >array; //总数据数组$subtract=$this- >xml_fetch_array($condition,$if);//要更新的数组//echo "";//print_r($data);//print_r($datas);//echo "每条记录中有".count($datas[0])."个值
";for($i=0;$i $v){//echo "-第".$i."条的".$k."值为".$v."
";//echo "--要查找的数组".$k."值为".$subtract[0][$k]."
";if($v==$subtract[0][$k]){$is++;}}if($is==count($data)){//echo "----与第".$i."条符合
";$datas[$i]=$array;//array_splice($datas,$i,$i+1);}//echo "原始记录中的第".$i."条与要查找的有".$is."匹配
";//echo "原始记录中的第".$i."条结束
";$is=0;}//array_splice($datas,2,2+1,$array);//echo "";//print_r($datas);$this- >array=$datas;$this- >WriteXml($datas);}//写入XML文件(全部写入)function WriteXml($array){if(!is_writeable($this- >dbase)){die( "无法写入".$this->dbname.".xml");}$xml.= "\r\n";$xml.= "dbname>\r\n";for($i=0;$i dbtable>\r\n";foreach($array[$i] as $k= >$s){$xml.= "$s\r\n";}$xml.= "dbtable>\r\n";}$xml.= "dbname>";dbase,"w'>$fp=@fopen($this->dbase,"w");flock($fp, LOCK_EX);rewind($fp);fputs($fp,$xml);fclose($fp);}//逐行写入xml(我试着写入10000行,感觉没一次写入快,所以没用这种写入方式)function WriteLine($array){if(!is_writeable($this- >dbase)){die( "无法写入".$this->dbname.".xml");}dbase,"w'>$fp=@fopen($this->dbase,"w");rewind($fp);flock($fp, LOCK_EX);fputs($fp, "\r\n");fputs($fp, "dbname>\r\n");for($i=0;$i dbtable>\r\n");$xml.= "dbtable>\r\n";foreach($array[$i] as $k= >$s){fputs($fp, "$s\r\n");}fputs($fp, "dbtable>\r\n");}fputs($fp, "dbname>");fclose($fp);}}?>使用方法:插入一条记录require_once('xml.class.php');$xml = new xml("exemple.xml","item");$newarray = array("title"=>"XML标题","text"=>"PHP的XML类测试!");$insert=$xml->xml_query('insert','','',$newarray);//第二及第三个变量位置是条件,留空表示在最后插入修改记录require_once('xml.class.php');$xml = new xml("exemple.xml","item");$array = array("title"=>"XML标题","text"=>"PHP的XML类测试!");$insert=$xml->xml_query('update','title,=,20年后世界将会怎样?','and',$array); //title标签等于xxx的用$array替换(可以建唯一属性的标签,比如id,这样就可以修改某一条记录)删除记录require_once('xml.class.php');$xml = new xml("exemple.xml","item");$array = array();$insert=$xml->xml_query('update','title,=,20年后世界将会怎样?','and',$array); //数组留空备注删除时其实是把值变空,我们可以修改一下xml_update(),在生成xml文件之前先判断$array的值,如果值为空就不写入到最终的数组中就是删除的效果了。写入xml文件时速度粉快(我测试过30000条记录的情况),插入时只插入一条记录,修改速度也相当的快,挺适合中型网站生成XML时使用,所以推荐一下。参考资料:http://www.diggtimes.com/show.php?tid=639692

已赞过已踩过<
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行