php操作xml类,PHP操作XML作为数据库的类

xml.class.php文件代码

* 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=substr($dbase,strrpos($dbase,"/")+1,-4);

$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

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

}

//echo count($row);

for($r=0;$r

for($c=0;$c

//$i++;

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

$field=$condition['field']; //字段

$operator=$condition["operator"];//运算符

$match=$condition['match']; //匹配

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

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

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

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

} elseif(($operator=='

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

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

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

} elseif(($operator=='>')&&($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

$data=$datas[$i];

//echo "原始记录中的第".$i."条
";

foreach($data as $k=>$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.="<?xml version="1.0" encoding="utf-8"?>rn";

$xml.="dbname>rn";

for($i=0;$i

$xml.="dbtable>rn";

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

$xml.="$s$k>rn";

}

$xml.="$this->dbtable>rn";

}

$xml.="$this->dbname>";

$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");

}

$fp=@fopen($this->dbase,"w");

rewind($fp);

flock($fp, LOCK_EX);

fputs($fp,"<?xml version="1.0" encoding="utf-8"?>rn");

fputs($fp,"dbname>rn");

for($i=0;$i

fputs($fp,"dbtable>rn");

$xml.="dbtable>rn";

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

fputs($fp,"$s$k>rn");

}

fputs($fp,"$this->dbtable>rn");

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值