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的构造方法,析构方法和this关键字详细介绍
Oct 22 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
php数组中包含中文的排序方法
Jun 03 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
ThinkPHP独立分组使用的注意事项
Nov 25 PHP
php文件下载处理方法分析
Apr 22 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 PHP
PHP 5.6.11中CURL模块问题的解决方法
Aug 08 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
PHP扩展安装方法步骤解析
Nov 24 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
获取Javscript执行函数名称的方法
2006/12/22 Javascript
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python实现一次创建多级目录的方法
2015/05/15 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
对python调用RPC接口的实例详解
2019/01/03 Python
Python实现点云投影到平面显示
2020/01/18 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
Python LMDB库的使用示例
2021/02/14 Python
世界汽车零件:World Car Parts
2019/09/04 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
不假外出检讨书
2014/01/27 职场文书
一年级班主任感言
2014/03/08 职场文书
公司授权委托书范本
2014/04/03 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
法人委托书范本
2014/09/15 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
结婚典礼致辞
2015/07/28 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
利用python进行数据加载
2021/06/20 Python