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 相关文章推荐
用PHP和MySQL保存和输出图片
Oct 09 PHP
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
php递归遍历删除文件的方法
Apr 17 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
详解PHP神奇又有用的Trait
Mar 25 PHP
深入学习微信网址链接解封的防封原理visit_type
Aug 15 PHP
使用laravel的migrate创建数据表的方法
Sep 30 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 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网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
python实现AdaBoost算法的示例
2020/10/03 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
灰雀教学反思
2014/04/28 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
励志演讲稿800字
2014/08/21 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server
教你一步步实现一个简易promise
2021/11/02 Javascript