zoukankan      html  css  js  c++  java
  • 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:详细内容三
    
  • 相关阅读:
    [算法练习]序列最大和
    [算法练习]最长公共子序列
    [算法练习]最长公共子串(LCS)
    [算法练习] 把字符串转换成整数
    [算法练习] 反转链表
    [算法练习] 正整数数制转换
    自己调用NTDLL函数
    [经典算法] 排列组合-N元素集合的所有子集(二)
    [经典算法] 排列组合-N元素集合的所有子集(一)
    【机器学习】主成分分析法 PCA (I)
  • 原文地址:https://www.cnblogs.com/qingsong/p/5376710.html
Copyright © 2011-2022 走看看