詳解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,"\"\n";

}

 

///給 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);

    }  

   

}

 

制作人:飛虎                                           無兄弟不編程!

=====================================================

歡迎加QQ群進行更多交流:305397511     專注於php、mysql以及開源框架


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM