zoukankan      html  css  js  c++  java
  • 详解SimpleXML添加_修改_删除_遍历XML节点属性

    SimpleXML概述

    要处理XML 文件,有两种传统的处理思路:SAX 和DOM。SAX 基于事件触发机制,对XML 文件进行一次扫描,完成要进行的处理;DOM 则将整个XML 文件构造为一棵DOM树,通过对DOM 树的遍历完成处理。这两种方法各有优缺点,SAX 的处理思路相对抽象,DOM 的处理过程相对烦琐,都不很适合新手的入门。

    PHP5 推出了一套新的XML 处理函数,即SimpleXML。名如其实,SimpleXML 本身小巧精干,只提供了少量的几个方法函数,但用它处理起XML 文件功能却非常强大,操作也非常的简单。

    首先,它提供有简单的函数可以从XML 文档、字符串、或DOM 对象上直接构造出SimpleXMLElement 对象;其次,SimpleXMLElement 提供有简单的方法可以进行属性、子节点、和XPath 的操作;然而,SimpleXML 最简单的地方是,它提供有使用标准对象的属性和对象迭代器进行节点操作的方法,这一处理思路使得用PHP 对XML 文档的处理得到了极大的简化。

    SimpleXML操作简要总结

    simplexml_load_file()  从 XML 文档获取 SimpleXMLElement 对象。  5

    simplexml_load_string()  从 XML 字符串获取 SimpleXMLElement 对象。

    simplexml_import_dom()  把 DOM 节点转换为 SimpleXMLElement 对象。

    (以上3个加载函数返回SimpleXMLElement对象,其路径在根标记上)

    addAttribute()  给 SimpleXML 元素添加一个属性。

    addChild()  给 SimpleXML 元素添加一个子元素。

    asXML()  从 SimpleXML 元素获取 XML 字符串。

    attributes()  获取 SimpleXML 元素的属性。

    children()  获取指定节点的子。

    getName()  获取 SimpleXML 元素的名称。

    xpath()  对 XML 数据运行 XPath 查询。

    $xml->$key=$value;  修改指定标签的值

    $xml->$key->attributes()->属性id=$attr;   修改属性的值

    unset($xml->$key);   删除标签行

    SimpleXML应用案例一:

    $string = <<<XML

    <a>

    <foo name="one" game="lonely">1</foo>

    <foo name="one" game="lonely">1</foo>

    </a>

    XML;

    $xml = simplexml_load_string($string);

    //显示xml属性,var_dump()、print_r不能够显示节点属性值

    foreach($xml->foo[0]->attributes() as $a => $b) {

        echo $a,'="',$b,"" ";

    }

    ///给 SimpleXML 元素添加属性

    $xml->addAttribute("type","html");

    $xml->addAttribute("name","top");

    $xml->foo[1]->addAttribute("other","ok");

    var_dump($xml->foo[1]->attributes());

    //向指定的 XML 节点添加一个子节点

    $xml->addChild("data","2014.5.26");

    var_dump($xml);

    echo "<hr/>";

    //把SimpleXMLElement对象返回可写入文件的文本字符串

    print($xml->asXML());

    SimpleXML应用案例二:

    $string2=<<<XML

    <note>

    <to dd="等等">George</to>

    <from nn="bb">John</from>

    <heading>Reminder</heading>

    <body>Don't forget the meeting!</body>

    <a>

    <b>

      <c>text</c>

      <c>stuff</c>

    </b>

    <d>

      <c>code</c>

    </d>

    </a>

    </note>

    XML;

    $xml2 = simplexml_load_string($string2);

    // 遍历子节点的属性名和值

    foreach ($xml2->children()as $child)

      {

       foreach($child->attributes() as $a => $b){

      echo "<br/>".$child.":".$a."==".$b;

       }

      }

    //遍历子节点之下的标签名和值

    foreach($xml2->children() as $a=>$b){

     echo "<br/>".$a."---".$b;

    }

    echo "<hr/>";

    //只获取元素名称

    foreach($xml2->children() as $ch){

     echo "<br/>".$ch->getName();

    }

    echo "<hr/>";

    //使用路径定位节点

    $mynode=$xml2->xpath("/note/a/b");

    var_dump($mynode);

    asXML()SimpleXML对象文本化并保存XML文件:

    $file = fopen($url,"w");

    fwrite($file,$xml->asXML());

    fclose($file);

    一个SimpleXML封装类:

    class SimpleXML{

        public $data="";

        //从 XML 文档获取 SimpleXMLElement 对象

        public function xml_simplexml_load_file($url){

           if (file_exists($url)) {

               $this->data=simplexml_load_file($url);

           }else{

               exit($url."<br/>文件不存在!");

           }

        }

        // 从 XML 字符串获取 SimpleXMLElement 对象

        public function xml_simplexml_load_string($xml_string){

           $this->data=simplexml_load_string($xml_string);

        }

        //把 DOM 节点转换为 SimpleXMLElement 对象

        public function xml_simplexml_import_dom($dom){

           $this->data=simplexml_import_dom($dom);

        }

        // 给 SimpleXML 元素添加一个子元素

        public function xml_addchild($simplexml,$name,$value){

           $simplexml->addChild($name,$value);

        }

        // 给 SimpleXML 元素添加一个属性

        public function xml_addattribute($simplexml,$name,$value){

           $simplexml->addAttribute($name,$value);

        }

        //返回 SimpleXML 元素获取 XML 字符串

        public function xml_asxml($simplexml){

           return $simplexml->asXML();

        }

        //返回获取 SimpleXML 元素的属性

        public function xml_attributes($simplexml){

           return $simplexml->attributes();

        }

        //打印 SimpleXML 元素的属性

        public function xml_attributes_show($simplexml){

           foreach ($simplexml->attributes() as $a=>$b){

               print($a."=".$b."<br/>");

           }

        }

        //返回指定节点的子节点SimpleXML

        public function xml_getchildren($simplexml){

           return $simplexml->children();

        }

        //返回 SimpleXML 元素的名称

        public function xml_getname($simplexml){

           return $simplexml->getName();

        }

        //返回指定路径的SimpleXML

        public function xml_getxpath($simplexml,$path_str){

           return $simplexml->xpath($path_str);

        }

        //返回以标签名为键值,某一属性为值的数组

        public function xml_getattributes_arr($attr_name){     

           $re_arr=array();

           foreach ($this->data as $d){

               foreach($d->attributes() as $a=>$b){         

                  if($a==$attr_name)

                      $re_arr[$this->xml_getname($d)]=$b;

               }

           }

           return $re_arr;

        }

        //检查是否存在重复的key

        public function xml_rekey($key){

           $re_bool=false;

           foreach($this->data as $d){

               if($this->xml_getname($d)==$key){

                  $re_bool=true;

               }

           }

           return $re_bool;

        }

        //追加节点

        public function xml_add($key,$value,$attr){

           $this->data->addChild($key,$value);

           $this->data->$key->addAttribute("nicheng",$attr);

        }

        //保存xml

        public function xml_save($url){

           $save_xml=$this->data->asXML();

           $file = fopen($url,"w");

           fwrite($file,$save_xml);

           fclose($file);

        }

        //修改XML元素

        public function xml_update($key,$value,$attr){

           $this->data->$key=$value;

           $this->data->$key->attributes()->nicheng=$attr;

        }

        //删除XML元素

        public function xml_delete($key){

           unset($this->data->$key);

        }  

       

    }

  • 相关阅读:
    struts 2.1.8.1的sx:datetimepicker标签出现NaN错误的原因和解决办法
    php windows与linux下的路径区别
    php递归删除文件夹
    php ffmpeg截取视频第一帧保存为图片的方法
    mysql group by使用方法注意
    PHP更新用户微信信息的方法
    PHP file_get_contents 读取js脚本的问题
    javascript采用Broadway实现安卓视频自动播放的方法(这种坑比较多 不建议使用)
    html5 textarea 写入换行的方法
    jquery swiper3自定义切换效果的方法
  • 原文地址:https://www.cnblogs.com/jianmingyuan/p/5909381.html
Copyright © 2011-2022 走看看