+ -
当前位置:首页 → 问答吧 → 发一个XML操作类(正则版)

发一个XML操作类(正则版)

时间:2007-11-16

来源:互联网

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

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

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;
        }

/*
    *函数名:insertM
    *说明:插入多条记录,参数类型必须是二维数组
    */
    public function insertM($arr)
    {
        $content=$this->getFileContent();
        preg_match_all('|<key>(\d+?)<\/key>|',$content,$matches);
        rsort($matches[1]);
        $newkey=$matches[1][0]+1;
        
        $record='';
        for($i=0;$i<count($arr);$i++)
        {
            $record.='<record>'.$this->enter;
            $record.='<key>'.$newkey.'</key>'.$this->enter;
            foreach($arr[$i] as $k=>$v)
            {
                $record.="<$k>$v</$k>".$this->enter;
            }
            $record.='</record>'.$this->enter.$this->enter;
            $newkey++;
        }
        $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)==0 ? false : true;
                        $bool_root=preg_match('/<'.$this->root.'>.*<\/'.$this->root.'>/s',$content)==0 ? 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*[\s\S]*\s*<\/record>$/';
                                $bool_record=preg_match($re,$matches[1][$i],$arr)==0 ? false : true;
                                $keys[]=$arr[1];
                                if(!$bool_record) break;
                        }
                        rsort($keys);
                        $bool_repeat=preg_match('/(\d),\1/',join(',',$keys),$wb)==0 ? 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>[\s\S]*?<'.$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内容到剪贴板
PHP代码:

<?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-21 11:21 编辑 ]

作者: pangmen   发布时间: 2007-11-16

还不错,比较高级一点的东西!

作者: forest   发布时间: 2007-11-16

如何增加多条记录,能给个例子么?
我测试发现增加第二条记录时候,文件不完整

作者: quanhaier   发布时间: 2007-11-16

现在增加多条记录是这样,读取二个数组,如果是二维数组,遍历一下即可

$arr=array('username'=>'pangmen','sex'=>'男','tel'=>'139999999','address'=>'北京');
$x->insert($arr);
$arr=array('username'=>'pangmen1','sex'=>'女','tel'=>'1392343299','address'=>'bj');
$x->insert($arr);

作者: pangmen   发布时间: 2007-11-16

收下了

作者: psdshow   发布时间: 2007-11-16

非常好

作者: adleyliu   发布时间: 2007-11-16

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

作者: pangmen   发布时间: 2007-11-21

还是用专门的扩展好~~这样做效率很是有问题的!

作者: crackfan   发布时间: 2007-11-21

昵称: liuxingyuyuni  时间: 2007-11-22 18:45
不错,加精!

作者: liuxingyuyuni   发布时间: 2007-11-22

添加数据到13条左右,显示  文件规则已被破坏

作者: luzhou   发布时间: 2007-11-22

谢谢大伙的支持

作者: kupe   发布时间: 2007-11-23

如果内容里面有换行,需要转化为\n才能插入,内容里面也需要把html实体化一下才行,就是把<换成&gt;把>换成&lt;

作者: pangmen   发布时间: 2007-11-23

引用:
原帖由 pangmen 于 2007-11-23 23:33 发表
如果内容里面有换行,需要转化为\n才能插入,内容里面也需要把html实体化一下才行,就是把换成<
我插到11条就出现规则错误了。

数据还是原来的数据,我是一直刷新插数据的。没有什么HTML标签之说。

看了XML,文件没坏,但是却出错了。

CHECKFILE函数最后,我改成这样
复制内容到剪贴板
代码:

    ECHO 'S:'.$bool_statement.'<HR>';
    ECHO 'ROOT:'.$bool_root.'<HR>';
    ECHO 'RECORD:'.$bool_record.'<HR>';
    ECHO 'REPEAT:'.$bool_repeat.'<HR>';
    echo '文件规则已被破坏';
    exit;
原来出在REPEAT上啊。

运行结果:
复制内容到剪贴板
代码:

S:1



ROOT:1



RECORD:1



REPEAT:



文件规则已被破坏
[ 本帖最后由 小文龙 于 2008-2-14 02:33 编辑 ]

作者: pangmen   发布时间: 2007-11-23

SimpleXML是不是只能读取,不能创建?

作者: 小文龙   发布时间: 2008-02-14

热门下载

更多