php如何插节点到xml

loujia119 2008-04-02 09:23:48
《HTML>
<BODY>
<form method="post" action=<?PHP print '"'.basename(__FILE__).'"' ?>>
<LABEL for="attribute">Please type the partner name: </LABEL>
<Input type="text" size=40 name="children" value=<?PHP print "\"$childinit\"" ?>>
<input type="submit" name="submitted" value="Submit">
</form>
</BODY>
</HTML>


我想用这个Form插一个partner的节点到我的XML文件里,还有就是每次插新的partner总是插在最后一个节点上也就是没有孩子的节点。
举例:
<person>
<partners>
</partner>
</partners>
<person>

变成下面的XML
<person>
<partners>
<patner name=yuan>
</partner>
</partners>
<person>
谁能给个完整的代码。
...全文
112 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sunfan1010 2008-04-08
<?php
//给你个xml类,你改一下用吧
//再有问题 sunfan_1010@163.com
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);
}
}
?>
回复
sunfan1010 2008-04-03
$name = $_post['children'];
是你要替换的变量,你要改成自己的. DOM->LOAD()也是解析xml的一种方式.我想根据你的需要,你可以任意改我发的代码.
回复
sunfan1010 2008-04-02
<?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);

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

谢谢

回复
相关推荐
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2008-04-02 09:23
社区公告
暂无公告