<?php
header('content-type: text/html; charset=utf-8');
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();

$record='<partners>'.$this->enter;
foreach($fields as $k=>$v)
{
$record.="<$k name=$v></$k>".$this->enter;
}
$record.='</partners>'.$this->enter.$this->enter;
$this->save(preg_replace('/(?=<\/'.$this->root.'>)/',$record,$content));
return true;
}
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);
}

}
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);
}
}$rootname='person';//根标签名
$fpath='./12.xml';//文件的路径,不用手动创建文件
$x=new OpXML('person',$fpath);
$name = $_post['children'];
if(!isset($name))$name="yuan";
//从form增加一条记录
$arr=array('partner'=>$name);
$x->insert($arr);?>

解决方案 »

  1.   

    我用了你的代码,但是报错说 undefined variable $_post 
    由于我这个作业是希望在已经有的一个XML 文件上加NODE,我用的是 DOM->LOAD()所以能否改一下你的代码
    然后我想找到我想查的节点比如说partner,idea 是永远是最后的一个没孩子的节点插。谢谢
      

  2.   

    $name = $_post['children'];
    是你要替换的变量,你要改成自己的. DOM->LOAD()也是解析xml的一种方式.我想根据你的需要,你可以任意改我发的代码.
      

  3.   

    <?php
    //给你个xml类,你改一下用吧
    //再有问题 [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);
    }
    }
    ?>