php操作xml类

技术文章 2014年8月21日 4.47K

文件名:xml.class.php

/*** 

* *

文件名: xml.php *

作 用: xml,完善中,暂只支持三级节点 *

作 者: loking(biyees) *

* *

* example 读取数据: 

* $xml = new xml(“dbase.xml”,’table’); * 

* $data=$xml->xml_fetch_array(); *

* echo “<pre style=\”font-size:12px;\”>”; *

* 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);

//遍历索引,筛选出要取值的节点 节点名:$dbtable 

foreach ($this- >index as $key=>$val) {

if ($key == $this- >dbtable) {

//取得节点数组 

$this- >dbtable_array = $val; 

} else { 

continue; 

for ($i=0; $i < count($this->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 < count($effective); $i++){

$effect[$effective[$i][ “tag”]] = $effective[$i][“value”];

return $effect; 

//xml_query(方法,条件,多条件时逻辑运算符and or or,总数据数组,插入或更新的数组

function xml_query($method,$condition,$if=’and’,$array=array()) 

if(($method==’select’)||($method==’count’)){ 

return $this- >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 <$cs;$i++){

$conditions[]=array( “field”=>$condition[$i*3],”operator”=>$condition[$i*3+1],”match”=>$condition[$i*3+2]);

//echo count($row); 

for($r=0;$r <count($row);$r++){

for($c=0;$c <$cs;$c++){

//$i++; 

$condition=$conditions[$c]; //当前条件 

$field=$condition[‘field’]; //字段 

$operator=$condition[ “operator”];//运算符

$match=$condition[‘match’]; //匹配 

if(($operator==’=’) &&($row[$r][$field]==$match)){

$true++;//若条件符合,符合数加

} elseif(($operator==’!=’) &&($row[$r][$field]!=$match)){

$true++;//若条件符合,符合数加

} elseif(($operator==’ <‘)&&($row[$r][$field]<$match)){

$true++;//若条件符合,符合数加

} elseif(($operator==’ <=’)&&($row[$r][$field]<=$match)){

$true++;//若条件符合,符合数加

} elseif(($operator==’ >’)&&($row[$r][$field]>$match)){

$true++;//若条件符合,符合数加

} elseif(($operator==’ >’)&&($row[$r][$field]>=$match)){

$true++;//若条件符合,符合数加

//根据条件取值 

if($if==’and’){ 

//如果多条件为and,当符合数等于条件数时,生成数组 

if($true==$cs){ 

$result[]=$row[$r]; 

} else { 

//如果多条件为or,当有符合纪录时,生成数组 

if($true!=0){ 

$result[]=$row[$r]; 

//echo $true; 

//echo “<pre style=\”font-size:12px;\text-align:left\”>”;

//print_r($true); 

$true=0;//符合条件数归零,进入下一轮循环 

} else { 

$result=$this- >array;

//echo “<pre style=\”font-size:12px;\text-align:left\”>”;

//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 “<pre style=\”font-size:12px;\text-align:left\”>”;

//print_r($data); 

//print_r($datas); 

//echo “每条记录中有“.count($datas[0]).”个值<br>”;

for($i=0;$i <count($datas);$i++){

$data=$datas[$i]; 

//echo “原始记录中的第“.$i.”<br>”;

foreach($data as $k= >$v){

//echo “-“.$i.”条的“.$k.”值为“.$v.”<br>”;

//echo “–要查找的数组“.$k.”值为“.$subtract[0][$k].”<br>”;

if($v==$subtract[0][$k]){ 

$is++; 

if($is==count($data)){ 

//echo “—-与第“.$i.”条符合<br>”;

$datas[$i]=$array; 

//array_splice($datas,$i,$i+1); 

//echo “原始记录中的第“.$i.”条与要查找的有“.$is.”匹配<br>”; 

//echo “原始记录中的第“.$i.”条结束<br>”;

$is=0; 

//array_splice($datas,2,2+1,$array); 

//echo “<pre style=\”font-size:12px;\text-align:left\”>”;

//print_r($datas); 

$this- >array=$datas;

$this- >WriteXml($datas);

 

//写入XML文件(全部写入

function WriteXml($array) 

if(!is_writeable($this- >dbase)){

die( “无法写入“.$this->dbname.”.xml”);

$xml.= “<?xml version=\”1.0\” encoding=\”gb2312\”?>\r\n”;

$xml.= “<$this->dbname>\r\n”;

for($i=0;$i <count($array);$i++){

$xml.= “<$this->dbtable>\r\n”;

foreach($array[$i] as $k= >$s){

$xml.= “<$k>$s</$k>\r\n”;

$xml.= “</$this->dbtable>\r\n”;

$xml.= “</$this->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, “<?xml version=\”1.0\” encoding=\”gb2312\”?>\r\n”);

fputs($fp, “<$this->dbname>\r\n”);

for($i=0;$i <count($array);$i++){

fputs($fp, “<$this->dbtable>\r\n”);

$xml.= “<$this->dbtable>\r\n”;

foreach($array[$i] as $k= >$s){

fputs($fp, “<$k>$s</$k>\r\n”);

fputs($fp, “</$this->dbtable>\r\n”);

fputs($fp, “</$this->dbname>”);

fclose($fp); 

}

?>

 

使用方法:

插入一条记录

require_once(‘xml.class.php’);

$xml = new xml(“exemple.xml”,”item”);

$newarray = array(

“title”=>”XML标题“,

“text”=>”PHPXML类测试!

);

$insert=$xml->xml_query(‘insert’,”,”,$newarray);//第二及第三个变量位置是条件,留空表示在最后插入

修改记录

require_once(‘xml.class.php’);

$xml = new xml(“exemple.xml”,”item”);

$array = array(

“title”=>”XML标题“,

“text”=>”PHPXML类测试!

);

$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时使用,所以推荐一下。


关注微信公众号『PHP学习网

第一时间了解最新网络动态
关注博主不迷路~

PHP学习网:站内收集的部分资源来源于网络,若侵犯了您的合法权益,请联系我们删除!
分享到:
赞(0)

文章评论

您需要之后才可以评论
0点赞 0评论 收藏 QQ分享 微博分享

PHP学习网

PHP学习网