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之变量、常量学习笔记
Mar 27 PHP
PHPMYADMIN导入数据最大为2M的解决方法
Apr 23 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
Jun 26 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
PHP安全上传图片的方法
Mar 21 PHP
PHP和C#可共用的可逆加密算法详解
Oct 26 PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 PHP
PHP内存缓存功能memcached示例
Oct 19 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
实例讲解通过​PHP创建数据库
Jan 20 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 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实现ping
2006/10/09 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
一个简单的js动画效果代码
2010/07/20 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
Python 实现集合Set的示例
2020/12/21 Python
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
小加工厂管理制度
2014/01/21 职场文书
大二学习计划书范文
2014/04/27 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
关于环保的标语
2014/06/13 职场文书
2014年工会工作总结
2014/11/12 职场文书
培训通知
2015/04/17 职场文书
社区党支部承诺书
2015/04/29 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
MySQL 逻辑备份 into outfile
2022/05/15 MySQL