simplexml 对xml的增删改操作

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

,新建节点

 $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');

将追加作为最后一个节点

,修改节点

 $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 的节点

,删除节点

删除节点用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:详细内容三
原文地址:https://www.cnblogs.com/qingsong/p/5376710.html