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以及開源框架