PHP操作XML作为数据库的类


Posted in PHP onDecember 19, 2010

xml.class.php文件代码

<?php 
* 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=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<$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++;//若条件符合,符合数加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 
} 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 "<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="utf-8"?>rn"; 
$xml.="<$this->dbname>rn"; 
for($i=0;$i<count($array);$i++){ 
$xml.="<$this->dbtable>rn"; 
foreach($array[$i] as $k=>$s){ 
$xml.="<$k>$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,"<$this->dbname>rn"); 
for($i=0;$i<count($array);$i++){ 
fputs($fp,"<$this->dbtable>rn"); 
$xml.="<$this->dbtable>rn"; 
foreach($array[$i] as $k=>$s){ 
fputs($fp,"<$k>$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时使用,所以推荐一下。

PHP 相关文章推荐
Ajax PHP分页演示
Jan 02 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
Dec 02 PHP
关于js和php对url编码的处理方法
Mar 04 PHP
使用php的HTTP请求的库Requests实现美女图片墙
Feb 22 PHP
PHP异常处理浅析
May 12 PHP
PHP中preg_match函数正则匹配的字符串长度问题
May 27 PHP
php创建无限级树型菜单
Nov 05 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 PHP
PHP数组操作简单案例分析
Oct 15 PHP
thinkphp实现分页显示功能
Dec 03 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 #PHP
PHP与MySQL开发的8个技巧小结
Dec 17 #PHP
hessian 在PHP中的使用介绍
Dec 13 #PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
Dec 12 #PHP
php 高性能书写
Dec 11 #PHP
php foreach 参数强制类型转换的问题
Dec 10 #PHP
snoopy 强大的PHP采集类使用实例代码
Dec 09 #PHP
You might like
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
微信JS接口大全
2016/08/25 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
轻松搞定jQuery+JSONP跨域请求的解决方案
2018/03/06 jQuery
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python入门篇之列表和元组
2014/10/17 Python
Python如何生成树形图案
2018/01/03 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
Python面向对象程序设计示例小结
2019/01/30 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
基于python实现坦克大战游戏
2020/10/27 Python
英国日常交易网站:Wowcher
2018/09/04 全球购物
super关键字的用法
2012/04/10 面试题
医学专业毕业生推荐信
2013/11/14 职场文书
数学国培研修感言
2014/02/13 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
雨中的树观后感
2015/06/03 职场文书
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
警用民用对讲机找不同
2022/02/18 无线电