发新话题
打印

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

发一个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)==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);
        }
}
?>
这是应用示例:
复制内容到剪贴板
代码:
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());
附件: 您所在的用户组无法下载或查看附件

TOP

LZ你发错地方了吧
专注于DEDE采集和数据深度挖掘

TOP

发新话题