喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

上一主题 下一主题
     
标题: [原创] 发一个XML操作类(正则版)  
 
pangmen
注册会员
Rank: 2



UID 93881
精华 0
积分 90
帖子 85
金钱 90 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2007-6-13
状态 离线
发一个XML操作类(正则版)

在网上没找到合适的操作XML的类,PHP又对DOM、XPATH支持不好,但又需要用到,于是自己写了一个,提供增删改查功能,可以当做小型的数据库使

<?php
/*
*作者:pangmen
*日期:2007-11-14
*功能:操作XML文件(增、删、改、查)
*版本:正则版
*附:大家可以随意修改此类,合适的话发我一份:)
*   我的E-mail:ad2008bobo@yahoo.com.cn
*/

class OpXML
{
    private 
$fpath;
    private 
$enter;
    private 
$root;

    function 
__construct($root,$fpath)
    {
        
$this->fpath=$fpath;
        
$this->root=$root;
        
$this->enter=chr(13).chr(10);
        
$this->checkFile();
    }

    
/*
    *函数名:insert
    *说明:插入一条记录
    */
    
public function insert($fields)
    {
        
$content=$this->getFileContent();
        
preg_match_all('|<key>(d+?)</key>|',$content,$matches);
        
rsort($matches[1]);
        
$newkey=$matches[1][0]+1;
        
        
$record='<record>'.$this->enter;
        
$record.='<key>'.$newkey.'</key>'.$this->enter;
        foreach(
$fields as $k=>$v)
        {
            
$record.="<$k>$v</$k>".$this->enter;
        }
        
$record.='</record>'.$this->enter.$this->enter;
        
$this->save(preg_replace('/(?=</'.$this->root.'>)/',$record,$content));
        return 
true;
    }

    
/*
    *函数名:checkFile
    *说明:如果文件不存在,则创建之,并初始化
    *     否则检查文件规则是否被破坏
    */
    
private function checkFile()
    {
        if(!
file_exists($this->fpath))
        {
            
$xmlstr='';
            
$xmlstr='<?xml version="1.0" encoding="UTF-8"?>'.$this->enter;
            
$xmlstr.='<'.$this->root.'>'.$this->enter.$this->enter;
            
$xmlstr.='</'.$this->root.'>';
            
$this->save($xmlstr);
        }
        else
        {
            
$content=$this->getFileContent();
            
$bool_statement=preg_match('/<?xml version="1.0".*??>/',$content)==false true;
            
$bool_root=preg_match('/<'.$this->root.'>.*</'.$this->root.'>/s',$content)==false true;

            
preg_match_all('|(<record>(?:.+?)</record>)|s',$content,$matches);
            for(
$i=0;$i<count($matches[1]);$i++)
            {
                
$re='/^<record>s*<key>(d+)</key>s*[sS]*s*</record>$/';
                
$bool_record=preg_match($re,$matches[1][$i],$arr)==false true;
                
$keys[]=$arr[1];
                if(!
$bool_record) break;
            }
            
rsort($keys);
            
$bool_repeat=preg_match('/(d),1/',join(',',$keys),$wb)==true false;

            if(!(
$bool_statement && $bool_root && $bool_record && $bool_repeat))
            {
                echo 
'文件规则已被破坏';
                exit;
            }
        }
    }

    
/*
    *函数名:getRecordById
    *说明:根据主键ID,获取字段信息
    */
    
public function getRecordById($id)
    {
        
$content=$this->getFileContent();
        
preg_match('/<record>(s*<key>'.$id.'</key>.+?)</record>/s',$content,$matches);
        
preg_match_all('|(<.+</.+>)|',$matches[1],$arr);
        
$arrstr='';
        for(
$i=0;$i<count($arr[1]);$i++)
        {
            
preg_match('/^.+>(.+)</(.+)>/',$arr[1][$i],$farr);
            
$arrstr.="'$farr[2]'=>'$farr[1]'";
            if(
$i<count($arr[1])-1$arrstr.=',';
        }
        eval(
"$row=array($arrstr);");
        return 
$row;
    }

    
/*
    *函数名:checkFile
    *说明:根据主键ID,更新字段
    */
    
public function updateRecordById($id,$form_arr=array())
    {
        
$content=$this->getFileContent();
        foreach(
$form_arr as $k=>$v)
        {
            
$re='/(<key>'.$id.'</key>[sS]*?<'.$k.'>).+?(</'.$k.'>)/s';
            
$content=preg_replace($re,'${1}'.$v.'$2',$content);
        }
        
$this->save($content);
        return 
true;
    }

    public function 
deleteRecordById($id)
    {
        
$content=$this->getFileContent();
        
$content=preg_replace('/<record>s*<key>'.$id.'+.+?</record>(s{4})?/s','',$content);
        
$this->save($content);
    }

    
/*
    *函数名:getList
    *说明:获取所有记录,返回一个二维数组
    *     先获取所有record记录,再获取字段名和值
    */
    
public function getList()
    {
        
$content=$this->getFileContent();
        
$rs=array();
        
preg_match_all('|<record>(.+?)</record>|s',$content,$matches);
        for(
$i=0;$i<count($matches[1]);$i++)
        {
            
preg_match_all('|(<.+</.+>)|',$matches[1][$i],$tmparr);
            
$arrstr='';
            for(
$j=0;$j<count($tmparr[1]);$j++)
            {
                
preg_match('/^.+>(.+)</(.+)>/',$tmparr[1][$j],$farr);
                
$arrstr.="'$farr[2]'=>'$farr[1]'";
                if(
$j<count($tmparr[1])-1$arrstr.=',';
            }
            eval(
"$rs[]=array($arrstr);");
        }
        return 
$rs;
    }

    private function 
getFileContent()
    {
        
$hd=fopen($this->fpath,'r');
        
$content=fread($hd,filesize($this->fpath));
        
fclose($hd);
        return 
$content;
    }

    private function 
save($content)
    {
        
$hd=fopen($this->fpath,'w');
        
fwrite($hd,$content);
        
fclose($hd);
    }
}
?>


<?php
应用示例:
header
('content-type: text/html; charset=utf-8');

include(
'./libs/x.class.php');

$rootname='ROOT';//根标签名
$fpath='./libs/ooooooooooooooo.xml';//文件的路径,不用手动创建文件
$x=new OpXML('ROOT',$fpath);

//增
$arr=array('username'=>'pangmen','sex'=>'男','tel'=>'139999999','address'=>'北京');
$x->insert($arr);

//删
//$x->deleteRecordById(1);

//改
//$arr=array('username'=>'pangmen','sex'=>'男','tel'=>'139999999','address'=>'北京');
//$x->updateRecordById(1,$arr);

//查(一条记录)
//print_r($x->getRecordById(1));

//查(所有记录)
//print_r($x->getList());
?>
[ 本帖最后由 pangmen 于 2007-11-15 11:34 PM 编辑 ]


 附件: 您所在的用户组无法下载或查看附件
2007-11-15 11:24 PM#1
查看资料  发短消息  顶部
 
xking
新手上路
Rank: 1



UID 88550
精华 0
积分 39
帖子 23
金钱 39 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-2-26
状态 离线
[推荐阅读] 请大家帮我看看???分页显示问题!!!!
好!。。顶下!
2007-11-16 10:24 AM#2
查看资料  Blog  发短消息  顶部
 
luckyage
注册会员
Rank: 2



UID 74116
精华 0
积分 50
帖子 139
金钱 50 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-5-26
状态 离线
[推荐阅读] 新闻列表生成静态后,怎么分页,给个思路,谢谢
顶,好东西
2007-11-16 10:32 AM#3
查看资料  发短消息  顶部
 
dongdonga
注册会员
Rank: 2



UID 76995
精华 0
积分 90
帖子 77
金钱 90 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-7-25
状态 离线
[推荐阅读] 大家帮忙,推荐一个买php空间的网址。
谢谢! 学习一下.
2007-11-16 12:38 PM#4
查看资料  发短消息  顶部
 
pangmen
注册会员
Rank: 2



UID 93881
精华 0
积分 90
帖子 85
金钱 90 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2007-6-13
状态 离线
[推荐阅读] 请问一下PHP导出html代码到EXCEL的问题
增加了一个插入多条记录的功能

方法名称:insertM($arr)
参数必须是二维数组


 附件: 您所在的用户组无法下载或查看附件
2007-11-21 10:46 AM#5
查看资料  发短消息  顶部
 
ccxxcc
金牌会员
Rank: 6Rank: 6
有钱啦 有钱啦



UID 63944
精华 0
积分 2248
帖子 336
金钱 2248 喜悦币
威望 0
人脉 0
阅读权限 70
注册 2005-4-2
状态 离线
[推荐阅读] php导出一段代码到EXCEL的一个单元格,并换行怎么办
顶pangmen
加油 期待更多的作品~~




在线查词http://www.iciba.com/
web编程站http://www.eb163.com
2007-12-6 03:13 PM#6
查看资料  访问主页  发短消息  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.060874 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP