<?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; } /* *函数名: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 .>" {>enter; $record.='<key>'.$newkey.'</key>'.$this->enter; foreach($arr[$i] as $k=>$v) { $record.="<$k>$v$K>".$this->enter; } $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 getrecordbyid function public exit echo if false : true rsort break>/s*<key>(/d+)/key>/s*[/s/S]*/s*/record>$/">getFileContent(); preg_match('/<record>(/s*<key>'.$id.'<//key>.+?)<//record>/s',$content,$matches); preg_match_all('|(<.+)|',$matches[1],$arr); $arrstr=''; for($i=0;$i<count preg_match>(.+)<//(.+)>/',$arr[1][$i],$farr); $arrstr.="'$farr[2]'=>'$farr[1]'"; if($i<count function public updaterecordbyid return eval>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 . preg_match_all>)|',$matches[1][$i],$tmparr); $arrstr=''; for($j=0;$j<count preg_match>(.+)<//(.+)>/',$tmparr[1][$j],$farr); $arrstr.="'$farr[2]'=>'$farr[1]'"; if($j<count function return getfilecontent private eval>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); } } ?><pre></pre></count></count></count></record></key></record></key></count></count></key></record></key></count></record></count></key></key>
使用例子
<?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()); ?>