simplexml 是php 处理xml 文件的一个方法,另一个是dom 处理,这里只说simplexml 。
目前php 处理xml 用的比较多,比较成熟的还是dom 。但dom 在速度和代码量上还是比较受人诟病的。
simplexml 的有些函数需要比较高版本的php ,建议是php5.2 以上。
一,新建xml
方法1 (普通新建文件):
<?php /** * @author blog.anchen8.net * @copyright 2016 */ $fp=fopen(‘xmldoc.xml‘,‘w‘); var_dump($fp); $xmlContent=‘<?xml version="1.0" encoding="utf-8" ?> ‘; $xmlContent.=‘<navlist>‘; $xmlContent.=‘<nav id="1">‘; $xmlContent.=‘<name>我我我</name> ‘; $xmlContent.=‘<color>#000000</color> ‘; $xmlContent.=‘</nav>‘; $xmlContent.=‘<nav id="2">‘; $xmlContent.=‘<name>你你你</name> ‘; $xmlContent.=‘<color>#ffffff</color> ‘; $xmlContent.=‘</nav>‘; $xmlContent.=‘<nav id="3">‘; $xmlContent.=‘<name>他他他</name> ‘; $xmlContent.=‘<color>#cccccc</color> ‘; $xmlContent.=‘</nav>‘; $xmlContent.=‘</navlist>‘; fwrite($fp,$xmlContent); fclose($fp); ?>
方法2 (使用simplexml 新建):
$fp=fopen(111.xml‘,‘w‘); $xmlContent=‘<?xml version="1.0" encoding="utf-8" ?><navlist></navlist>‘; fwrite($fp,$xmlContent); fclose($fp); $xml=simplexml_load_file(‘111.xml‘); $app=$xml->addChild(‘nav‘); $app->addAttribute(‘id‘,"1"); $app->addChild(‘name‘,‘我我我‘); $app->addChild(‘color‘,‘#000000‘); $app=$xml->addChild(‘nav‘); $app->addAttribute(‘id‘,"2"); $app->addChild(‘name‘,‘你你你‘); $app->addChild(‘color‘,‘#ffffff); $app=$xml->addChild(‘nav‘); $app->addAttribute(‘id‘,"3"); $app->addChild(‘name‘,‘他他他‘); $app->addChild(‘color‘,‘#cccccc); $xml->asXML(‘111.xml‘);
可以看到第一种方法其实只是普通的写入文件,第二种方法才是使用simplexml 新建xml 文件,但为什么我要把第一种普通方法放前面呢?因为本人测试了一下两种方法的运行时间,发现第一种方法使用的时间更少,所以建议使用普通的新建文件方法新建xml 文件就行了!
新建的文件结构如下:
<?xml version="1.0" encoding="utf-8"?> <navlist> <nav id="1"> <name>我我我</nname> <color>#000000/ncolor> </nav> <nav id="2"> <name>你你你</name> <color>#ffffff</color> </nav> <nav id="3"> <name>他他他</name> <color>#cccccc</color> </nav> </navlist>
二,读取xml
if($xml=simplexml_load_file(‘111.xml‘)){ foreach($xml->nav as $list){ $value[]=get_object_vars($list); } }else{ echo(‘load xml error!‘); }
get_object_vars 函数是把对象转化为数组,这样$value 就是一个Php 的普通数组了,大家可以print_r 一下这个数组,Php 数组的读取就不用我说了吧。
三,修改xml
1 ,新建节点
$xml=simplexml_load_file(‘111.xml‘); $app=$xml->addChild(‘nav‘); $app->addAttribute(‘id‘,"4"); $app->addChild(‘name‘,‘它它它‘); $app->addChild(‘color‘,‘#000000‘); $xml->asXML(‘111.xml‘);
将追加作为最后一个节点
2 ,修改节点
$xml=simplexml_load_file(‘111.xml‘); $xg=$xml->xpath("/navlist/nav[@id=‘3‘]"); $xg[0]->name="他啊他啊"; $xg[0]->color="#444444"; $xml->asXML(‘111.xml‘);
修改了nav 属性id 为3 的节点
3 ,删除节点
删除节点用unset 函数就行,但要删除指定节点比较麻烦,删除指定节点只能使用节点的索引值。
比如删除第二个节点(id 为2 的) :
$xml=simplexml_load_file(‘111.xml‘); unset($xml->nav[1]); $xml->asXML(‘111.xml‘);
索引从0 开始,所以第二个节点的索引是1 。
如果想通过指定的属性删除,则需要循环所有节点获取指定属性的节点索引
如下:
$xml=simplexml_load_file(‘111.xml‘); $i=0; foreach($xml as $dup){ $sc=$dup->attributes(); if($sc[‘id‘]==2){ unset($xml->nav[$i]); } $i++; } $xml->asXML(‘111.xml‘);
四,删除xml
if(file_exists(‘111.xml‘)){ unlink(‘111.xml‘); }
五,xml文档与php在同一个文件里的情况
<?php $xmldoc = <<<XML <?xml version="1.0" encoding="utf-8"?> <phplamp> <post> <title id="1">PHP XML处理介绍一</title> <details>详细内容一</details> </post> <post> <title id="2">PHP XML处理介绍二</title> <details>详细内容二</details> </post> <post> <title id="3">PHP XML处理介绍三</title> <details>详细内容三</details> </post> </phplamp> XML; $movies = new SimpleXMLElement($xmldoc); foreach($movies as $key => $value) { // 获取属性 $attr = $value->title->attributes(); echo "Id:" . $attr[‘id‘] . "<br />"; echo "Title:" . $value->title . "<br />"; echo "Details:" . $value->details . "<br /><br />"; } //$words = $lib->xpath("//word"); // echo $words[0][‘add‘].‘<br/>‘; echo $movies->title[0]; ?>
输出结果:
Id:1 Title:PHP XML处理介绍一 Details:详细内容一 Id:2 Title:PHP XML处理介绍二 Details:详细内容二 Id:3 Title:PHP XML处理介绍三 Details:详细内容三
时间: 2024-10-13 02:57:53