php操作xml詳解

XML是一種流行的半結構化文件格式,以一種類似伺服器的格式存儲數據。在實際應用中,一些簡單的、安全性較低的數據往往使用 XML文件的格式進行存儲。這樣做的好處一方面可以通過減少與伺服器的交互性操作提高讀取效率,另一方面可以有效利用 XML的優越性降低程式的編寫難度。 

PHP提供瞭一整套的讀取 XML文件的方法,很容易的就可以編寫基於 XML的腳本程式。本章將要介紹 PHP與 XML的操作方法,並對幾個常用的 XML類庫做一些簡要介紹。 

1 XML簡介 

XML是“可擴展性標識語言(eXtensible Markup Language)”的縮寫,是一種類似於 HTML的標記性語言。但是與 HTML不同,XML主要用於描述數據和存放數據,而 HTML主要用於顯示數據。 

XML是一種“元標記”語言,開發者可以根據自己的需要創建標記的名稱。例如,下面的 XML代碼可以用來描述一條留言。 

 

 

復制代碼 代碼如下:

<thread> 

<title>Welcome</title> 

<author>Simon</author> 

<content>Welcome to XML guestbook!!</content> 

</thread> 

 

其中,<thread>與</thread>標簽標記瞭這是一段留言。在留言中有標題、作者、內容,完整的表述瞭一條留言信息。 

在一個 XML文件的頂部,通常使用<?xml version=”1.0″?>來標識 XML數據的開始和 XML數據使用標準的版本信息。在瀏覽器中訪問 XML文件可以看到層次分明的 XML數據信息,如圖 1所示。 

 

XML的發展非常迅速,近些年來很多軟件開發商都開始采用 XML的開發標準進行應用程式的開發。並且,很多新興技術都架構在 XML數據之上。這意味著 XML將與 HTML一樣成為 Web技術不可或缺的一部分。 

2 簡單的 XML操作 

在實際應用中,PHP與 XML的交互操作應用非常廣泛。SimpleXML組件是 PHP5新增加的一個簡 

單的 XML操作組件,與傳統的 XML組件相比,SimpleXML組件的使用非常簡單。本節將對使用 

SimpleXML組件操作 XML的方法做一下詳細介紹。 

2.1 創建一個 SimpleXML對象 

SimpleXML對象是用來臨時存儲 XML數據的臨時變量,對 XML進行的操作都是通過操作 SimpleXML對象來完成的。SimpleXML組件提供瞭兩種創建 SimpleXML對象的方法。第一種方法是使用 simplexml_load_string函數讀取一個字符串型變量中的 XML數據來完成創建的,其語法格式如下所示。 

simplexml_load_string(string data) 

這裡的 data變量用於存儲 XML數據。以下代碼使用 simplexml_load_string函數創建瞭一個 SimpleXML對象 

復制代碼 代碼如下:

<?php 

$data = <<<XML //定義 XML數據 

<?xml version='1.0′?> 

<departs> 

<depart> 

<name>production support</name> 

<employees> 

<employee> 

<serial_no>100001</serial_no> 

<name>Simon</name> 

<age>24</age> 

<birthday>1982-11-06</birthday> 

<salary>5000.00</salary> 

<bonus>1000.00</bonus> 

</employee> 

<employee> 

<serial_no>100002</serial_no> 

<name>Elaine</name> 

<age>24</age> 

<birthday>1982-01-01</birthday> 

<salary>6000.00</salary> 

<bonus>2000.00</bonus> 

</employee> 

</employees> 

</depart> 

<depart> 

<name>testing center</name> 

<employees> 

<employee> 

<serial_no>110001</serial_no> 

<name>Helen</name> 

<age>23</age> 

<birthday>1983-07-21</birthday> 

<salary>5000.00</salary> 

<bonus>1000.00</bonus> 

</employee> 

</employees> 

</depart> 

</departs> 

XML; 

$xml = simplexml_load_string($data); //創建 SimpleXML對象 

print_r($xml); //輸出 XML 

?> 

 

在上面的例子中,$data變量存儲瞭一段 XML數據。 simplexml_load_string函數將變量$data轉化成 SimpleXML對象。通過 print_r函數的輸出可以看出該對象的結構,運行結果如下所示。 

復制代碼 代碼如下:

SimpleXMLElement Object 

[depart] => Array 

[0] => SimpleXMLElement Object 

[name] => production support 

[employees] => SimpleXMLElement Object 

( [employee] => Array ( 

[0] => SimpleXMLElement Object 

( [serial_no] => 100001 

[name] => Simon 

[age] => 24 

[birthday] => 1982-11-06 

[salary] => 5000.00 

[bonus] => 1000.00 

[1] => SimpleXMLElement Object 

( [serial_no] => 100002 

[name] => Elaine 

[age] => 24 

[birthday] => 1982-01-01 

[salary] => 6000.00 

[bonus] => 2000.00 

[1] => SimpleXMLElement Object 

[name] => testing center 

[employees] => SimpleXMLElement Object 

[employee] => SimpleXMLElement Object 

[serial_no] => 110001 

[name] => Helen 

[age] => 23 

[birthday] => 1983-07-21 

[salary] => 5000.00 

[bonus] => 1000.00 

 

從輸出結果可以看出,SimpleXML對象的結構與 XML數據的格式完全相同。 

第二種方法是使用 simplexml_load_flie函數讀取一個 XML文件來完成創建的,其語法格式如下所示。 

simplexml_load_file(string filename) 

這裡的 filename變量是用於存儲 XML數據文件的文件名及其所在路徑。以下代碼使用 simplexml_load_file函數來創建瞭一個 SimpleXML對象。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //創建 SimpleXML對象 

print_r($xml); //輸出 XML 

?> 

 

其中,example.xml存儲的數據與上面的$data完全相同,運行結果也與上面完全相同。 

上面兩種方法實現瞭同樣的功能,其區別就在於 XML的數據源不同。如果 XML的數據源在 PHP腳本文件中,則需要使用 simplexml_load_string來進行創建。如果 XML的數據源在一個單獨的 XML文件中,則需要使用 simplexml_load_file來進行創建。 

2.2 讀取 SimpleXML對象中的 XML數據 

前面介紹瞭使用 print_r函數來讀取 SimpleXML對象中的數據,其返回結果與數組的結構類似。顯然,這種顯示方式在實際應用中是不可取的。在這裡將介紹其他的幾種讀取 SimpleXML對象中 XML數據的方法。 

1.var_dump函數顯示對象詳細信息 

var_dump函數可以用於顯示 SimpleXML對象的詳細信息,與 print_r函數相比,var_dump函數顯示的信息更為完整,其語法如下所示。 

void var_dump(object1, object2 … ) 

以下代碼使用 var_dump函數輸出瞭上面例子中對象的詳細信息。 

復制代碼 代碼如下:

<?php $xml = simplexml_load_file('example.xml'); //創建 SimpleXML對象 var_dump($xml); //輸出 XML ?> 

 

運行結果如下所示。 

復制代碼 代碼如下:

object(SimpleXMLElement)#1 (1) { ["depart"]=> array(2) { 

[0]=> 

object(SimpleXMLElement)#2 (2) { 

["name"]=> 

string(18) “production support” 

["employees"]=> 

object(SimpleXMLElement)#4 (1) { 

["employee"]=> 

array(2) { 

[0]=> 

object(SimpleXMLElement)#5 (6) { 

["serial_no"]=> 

string(6) “100001″ 

["name"]=> 

string(5) “Simon” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-11-06″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

[1]=> 

object(SimpleXMLElement)#6 (6) { 

["serial_no"]=> 

string(6) “100002″ 

["name"]=> 

string(6) “Elaine” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-01-01″ 

["salary"]=> 

string(7) “6000.00″ 

["bonus"]=> 

string(7) “2000.00″ 

[1]=> 

object(SimpleXMLElement)#3 (2) { 

["name"]=> 

string(14) “testing center” 

["employees"]=> 

object(SimpleXMLElement)#7 (1) { 

["employee"]=> 

object(SimpleXMLElement)#8 (6) { 

["serial_no"]=> 

string(6) “110001″ 

["name"]=> 

string(5) “Helen” 

["age"]=> 

string(2) “23″ 

["birthday"]=> 

string(10) “1983-07-21″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

}}}}} 

 

與前面 print_r輸出的結果相比較,var_dump函數的輸出結果的結構更為嚴謹,並且將對象中的每一個屬性的數據類型均作出分析。在實際應用中,var_dump函數往往用於程式調試時的對象檢測。 

2.讀取 XML數據中的標簽 

與操作數組類型的變量類似,讀取 XML也可以通過類似的方法來完成。例如,如果需要讀取上面 XML數據中每一個“ depart”標簽下的“name”屬性,可以通過使用 foreach函數來完成,如以下代碼 

所示。 

復制代碼 代碼如下:

<?php $xml = simplexml_load_file('example.xml'); foreach($xml->depart as $a) 

echo “$a->name <BR>”; 

?> 

 

運行結果如下所示。 

production support 

testing center 

//讀取 XML文件 //循環讀取 XML數據中的每一個 depart標簽 

//輸出其中的 name屬性 

也可以使用方括號“ []”來直接讀取 XML數據中指定的標簽。以下代碼輸出瞭上面 XML數據中的第一個“depart”標簽的“name”屬性。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML文件 

echo $xml->depart->name[0]; //輸出節點 

?> 

 

運行結果如下所示。 

production support 

對於一個標簽下的所有子標簽,SimpleXML組件提供瞭 children方法進行讀取。例如,對於上面的 XML數據中的“ depart”標簽,其下包括兩個子標簽:“ name”和“employees”。以下代碼實現瞭對第一個“depart”標簽下的子標簽的讀取。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); 

foreach ($xml->depart->children() as $depart) //循環讀取 depart標簽下的子標簽 

var_dump($depart); //輸出標簽的 XML數據 

?> 

 

運行結果如下所示。 

復制代碼 代碼如下:

object(SimpleXMLElement)#3 (1) { 

[0]=> 

string(18) “production support” 

object(SimpleXMLElement)#5 (1) { 

["employee"]=> 

array(2) { 

[0]=> 

object(SimpleXMLElement)#3 (6) { 

["serial_no"]=> 

string(6) “100001″ 

["name"]=> 

string(5) “Simon” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-11-06″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

[1]=> 

object(SimpleXMLElement)#6 (6) { 

["serial_no"]=> 

string(6) “100002″ 

["name"]=> 

string(6) “Elaine” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-01-01″ 

["salary"]=> 

string(7) “6000.00″ 

["bonus"]=> 

string(7) “2000.00″ 

 

可以看出,使用 children方法後,所有的子標簽均被當作一個新的 XML文件進行處理。 

3.基於 XML數據路徑的查詢 

SimpleXML組件提供瞭一種基於 XML數據路徑的查詢方法。 XML數據路徑即從 XML的根到某一個標簽所經過的全部標簽。這種路徑使用斜線“ /”隔開標簽名。例如,對於上面的 XML數據,要查詢所有的標簽“name”中的值,從根開始要經過 departs、depart、employees和 employee標簽,則其路徑 

為“/departs/depart/employees/employee/name”。 SimpleXML組件使用 xpath方法來解析路徑,其語法格式如下所示。 

xpath(string path) 

其中的 path為路徑。該方法返回瞭一個包含有所有要查詢標簽值的數組。以下代碼查詢瞭上面 XML數據中的所有 name標簽。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML文件 

$result = $xml->xpath('/departs/depart/employees/employee/name'); //定義節點 

var_dump($result); //輸出節點 

?> 

 

運行結果如下所示。 

復制代碼 代碼如下:

array(3) { 

[0]=> object(SimpleXMLElement)#2 (1) { 

[0]=> string(5) “Simon” 

[1]=> object(SimpleXMLElement)#3 (1) { 

[0]=> string(6) “Elaine” 

[2]=> object(SimpleXMLElement)#4 (1) { 

[0]=> string(5) “Helen” 

 

可以看出,所有的 name標簽均被查詢出來。 

2.3 XML數據的修改 

對於 XML數據的修改與讀取 XML數據中的標簽方法類似。即通過直接修改 SimpleXML對象中的標簽的值來實現。以下代碼實現瞭對上面 XML數據中第一個“ depart”標簽的“ name”子標簽的修改。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML 

$xml->depart->name[0] = “Human Resource”; //修改節點 

?> 

 

修改後,並不會對 XML文件有任何影響。但是,在程式中,對於 SimpleXML對象的讀取將使用修改過的值。 

2.4 標準化 XML數據 

SimpleXML還提供瞭一種標準化 XML數據的方法 asXML。asXML方法可以有效的將 SimpleXML對象中的內容按照 XML 1.0標準進行重新編排並以字符串的數據類型返回。以下代碼實現瞭對上面 XML數據的標準化。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML數據 

echo $xml->asXML(); //標準化 XML數據 

?> 

 

2.5 XML數據的存儲 

將 SimpleXML對象中的 XML數據存儲到一個 XML文件的方法非常簡單,即將 asXML方法的返回結果輸出到一個文件中即可。以下代碼首先將 XML文件中的 depart name進行瞭修改,然後將修改過的 XML數據輸出到另一個 XML文件。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML數據 

$newxml = $xml->asXML(); //標準化 XML數據 

$fp = fopen(”newxml.xml”, “w”); //打開要寫入 XML數據的文件 

fwrite($fp, $newxml); //寫入 XML數據 

fclose($fp); //關閉文件 

?> 

 

代碼運行後,可以看到在 newxml.xml文件中的 XML數據如下所示。 

可以看出,對於 XML文件的修改已經保存到輸出文件中瞭。 

3 XML文檔的動態創建 

在實際應用中,時而會需要動態生成 XML文檔的操作。前面介紹的 SimpleXML組件並不提供創建 XML文檔的方法。因此,如果需要動態創建 XML文檔,往往使用 DOM組件進行創建。 DOM是文檔對象模型 Document Object Model的縮寫, DOM組件提供瞭對 XML文檔的樹型解析模式。以下代碼使用 DOM組件創建瞭一個 XML文檔。 

 

復制代碼 代碼如下:

<?php 

//創建一個新的 DOM文檔 

$dom = new DomDocument(); 

//在根節點創建 departs標簽 

$departs = $dom->createElement('departs'); 

$dom->appendChild($departs); 

//在 departs標簽下創建 depart子標簽 

$depart = $dom->createElement('depart'); 

$departs->appendChild($depart); 

//在 depart標簽下創建 employees子標簽 

$employees = $dom->createElement('employees'); 

$depart->appendChild($employees); 

//在 employees標簽下創建 employee子標簽 

$employee = $dom->createElement('employee'); 

$employees->appendChild($employee); 

//在 employee標簽下創建 serial_no子標簽 

$serial_no = $dom->createElement('serial_no'); 

$employee->appendChild($serial_no); 

//為 serial_no標簽添加值節點 100001 

$serial_no_value = $dom->createTextNode('100001′); 

$serial_no->appendChild($serial_no_value); 

//輸出 XML數據 

echo $dom->saveXML(); 

?> 

輸出結果如下所示。 

<?xml version=”1.0″?> 

<departs> 

<depart> 

<employees> 

<employee> 

<serial_no>100001</serial_no> 

</employee> 

</employees> 

</depart> 

</departs> 

 

DOM組件除瞭可以用來動態創建 XML文檔外,還可以用來讀取 XML文件。以下代碼實現瞭對前 

面 XML文件的讀取。 

復制代碼 代碼如下:

<?php 

$dom = new DomDocument(); //創建 DOM對象 

$dom->load('example.xml'); //讀取 XML文件 

$root = $dom->documentElement; //獲取 XML數據的根 

read_child($root); //調用 read_child函數讀取根對象 

function read_child($node) 

$children = $node->childNodes; //獲得$node的所有子節點 

foreach($children as $e) //循環讀取每一個子節點 

if($e->nodeType == XML_TEXT_NODE) //如果子節點為文本型則輸出 

echo $e->nodeValue.”<BR>”; 

else if($e->nodeType == XML_ELEMENT_NODE) //如果子節點為節點對象,則調用函數處理 

read_child($e); 

?> 

 

運行結果如下所示。 

復制代碼 代碼如下:

引用 

production support 

100001 

Simon 

24 

1982-11-06 

5000.00 

1000.00 

100002 

Elaine 

24 

1982-01-01 

6000.00 

2000.00 

testing center 

110001 

Helen 

23 

1983-07-21 

5000.00 

1000.00 

 

上面的例子使用瞭遞歸的方式對 XML數據進行瞭處理,實現瞭輸出 XML數據中的所有文本型標簽的功能。 

4 XML應用實例——留言本 

前面介紹瞭 XML的基本操作,本節將以設計一個 XML留言本為例來詳細說明在實際應用中如何實現 PHP與 XML數據的交互操作。 

4.1 XML文件結構設計 

XML文件用於存儲 XML數據,也就是留言本中的留言。這裡,對於每條留言,在 XML數據中主要包括三項內容:留言標題、留言者姓名、留言內容。因此,將 XML文件的格式設計如下。 

 

復制代碼 代碼如下:

<?xml version=”1.0″?> 

<threads> 

<thread> 

<title>這裡是留言的標題</title> 

<author>這裡是留言者</author> 

<content>這裡是留言內容</content> 

</thread> 

</threads> 

 

4.2 提交頁面的編寫 

提交留言頁面由兩個頁面組成。一個是讓訪問者用來書寫留言的表單的 HTML文件,一個是用來處理訪問者輸入的 PHP腳本。表單的 HTML代碼如下所示。 

復制代碼 代碼如下:

<html> 

<head> 

<title>發表新的留言</title> 

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″> 

</head> 

<body> 

<H1><p align=”center”>發表新的留言</p></H1> 

<form name=”form1″ method=”post” action=”Post.php”> 

<table width=”500″ border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″> 

<tr> 

<td>標題</td> 

<td><input name=”title” type=”text” id=”title” size=”50″></td> 

</tr> 

<tr> 

<td>作者</td> 

<td><input name=”author” type=”text” id=”author” size=”20″></td> 

</tr> 

<tr> 

<td>內容</td> 

<td><textarea name=”content” cols=”50″ rows=”10″ id=”content”></textarea></td> 

</tr> 

</table> 

<p align=”center”> 

<input type=”submit” value=”Submit”> 

<input type=”reset” value=”Reset”> 

</p> 

</form> 

</body> 

</html> 

 

對於用來處理用戶輸入的 PHP腳本,其基本邏輯是首先創建一個 DOM對象,然後讀取 XML文件中的 XML數據,接下來在 XML對象上創建新的節點並將用戶的輸入儲存起來,最後將 XML數據輸出到原來的 XML文件中。具體實現代碼如下所示。 

復制代碼 代碼如下:

<?php 

$guestbook = new DomDocument(); //創建一個新的 DOM對象 

$guestbook->load('DB/guestbook.xml'); //讀取 XML數據 

$threads = $guestbook->documentElement; //獲得 XML結構的根 

//創建一個新 thread節點 

$thread = $guestbook->createElement('thread'); 

$threads->appendChild($thread); 

//在新的 thread節點上創建 title標簽 

$title = $guestbook->createElement('title'); 

$title->appendChild($guestbook->createTextNode($_POST['title'])); 

$thread->appendChild($title); 

//在新的 thread節點上創建 author標簽 

$author = $guestbook->createElement('author'); 

$author->appendChild($guestbook->createTextNode($_POST['author'])); 

$thread->appendChild($author); 

//在新的 thread節點上創建 content標簽 

$content = $guestbook->createElement('content'); 

$content->appendChild($guestbook->createTextNode($_POST['content'])); 

$thread->appendChild($content); 

//將 XML數據寫入文件 

$fp = fopen(”DB/guestbook.xml”, “w”); 

if(fwrite($fp, $guestbook->saveXML())) 

echo “留言提交成功”; 

else 

echo “留言提交失敗”; 

fclose($fp); 

?> 

 

在瀏覽器中運行上述 HTML文件並填寫適當的留言內容,如圖 2所示。 

 

圖 2 發表新留言界面 

單擊【Submit】按鈕後,XML文件中的內容如下所示。 

可以看到 XML文件中已經將留言存儲起來瞭。 

4.3 顯示頁面的編寫 

顯示頁面可以使用前面介紹的 SimpleXML組件很容易的實現,具體實現代碼如下所示。 

復制代碼 代碼如下:

<?php 

//打開用於存儲留言的 XML文件 

$guestbook = simplexml_load_file('DB/guestbook.xml'); 

foreach($guestbook->thread as $th) //循環讀取 XML數據中的每一個 thread標簽 

echo “<B>標題:</B>”.$th->title.”<BR>”; 

echo “<B>作者:</B>”.$th->author.”<BR>”; 

echo “<B>內容:</B><PRE>”.$th->content.”</PRE>”; 

echo “<HR>”; 

?> 

 

 

在瀏覽器中查看運行結果如圖 3所示。 

 

 

您可能感興趣的文章:

PHP讀取XML值的代碼(推薦)

php讀取xml實例代碼

用PHP編寫和讀取XML的幾種方式

PHP中的生成XML文件的4種方法分享

用PHP讀取和編寫XML DOM的實現代碼

PHP中simplexml_load_string函數使用說明

php xml 入門學習資料

PHP操作XML作為伺服器的類

php生成xml簡單實例代碼

php與XML、XSLT、Mysql的結合運用實現代碼

PHP 生成的XML以FLASH獲取為亂碼終極解決

PHP讀取xml方法介紹

詳細出處參考:https://www.jb51.net/article/23912.htmXML是一種流行的半結構化文件格式,以一種類似伺服器的格式存儲數據。在實際應用中,一些簡單的、安全性較低的數據往往使用 XML文件的格式進行存儲。這樣做的好處一方面可以通過減少與伺服器的交互性操作提高讀取效率,另一方面可以有效利用 XML的優越性降低程式的編寫難度。 

PHP提供瞭一整套的讀取 XML文件的方法,很容易的就可以編寫基於 XML的腳本程式。本章將要介紹 PHP與 XML的操作方法,並對幾個常用的 XML類庫做一些簡要介紹。 

1 XML簡介 

XML是“可擴展性標識語言(eXtensible Markup Language)”的縮寫,是一種類似於 HTML的標記性語言。但是與 HTML不同,XML主要用於描述數據和存放數據,而 HTML主要用於顯示數據。 

XML是一種“元標記”語言,開發者可以根據自己的需要創建標記的名稱。例如,下面的 XML代碼可以用來描述一條留言。 

 

 

復制代碼 代碼如下:

<thread> 

<title>Welcome</title> 

<author>Simon</author> 

<content>Welcome to XML guestbook!!</content> 

</thread> 

 

其中,<thread>與</thread>標簽標記瞭這是一段留言。在留言中有標題、作者、內容,完整的表述瞭一條留言信息。 

在一個 XML文件的頂部,通常使用<?xml version=”1.0″?>來標識 XML數據的開始和 XML數據使用標準的版本信息。在瀏覽器中訪問 XML文件可以看到層次分明的 XML數據信息,如圖 1所示。 

 

XML的發展非常迅速,近些年來很多軟件開發商都開始采用 XML的開發標準進行應用程式的開發。並且,很多新興技術都架構在 XML數據之上。這意味著 XML將與 HTML一樣成為 Web技術不可或缺的一部分。 

2 簡單的 XML操作 

在實際應用中,PHP與 XML的交互操作應用非常廣泛。SimpleXML組件是 PHP5新增加的一個簡 

單的 XML操作組件,與傳統的 XML組件相比,SimpleXML組件的使用非常簡單。本節將對使用 

SimpleXML組件操作 XML的方法做一下詳細介紹。 

2.1 創建一個 SimpleXML對象 

SimpleXML對象是用來臨時存儲 XML數據的臨時變量,對 XML進行的操作都是通過操作 SimpleXML對象來完成的。SimpleXML組件提供瞭兩種創建 SimpleXML對象的方法。第一種方法是使用 simplexml_load_string函數讀取一個字符串型變量中的 XML數據來完成創建的,其語法格式如下所示。 

simplexml_load_string(string data) 

這裡的 data變量用於存儲 XML數據。以下代碼使用 simplexml_load_string函數創建瞭一個 SimpleXML對象 

復制代碼 代碼如下:

<?php 

$data = <<<XML //定義 XML數據 

<?xml version='1.0′?> 

<departs> 

<depart> 

<name>production support</name> 

<employees> 

<employee> 

<serial_no>100001</serial_no> 

<name>Simon</name> 

<age>24</age> 

<birthday>1982-11-06</birthday> 

<salary>5000.00</salary> 

<bonus>1000.00</bonus> 

</employee> 

<employee> 

<serial_no>100002</serial_no> 

<name>Elaine</name> 

<age>24</age> 

<birthday>1982-01-01</birthday> 

<salary>6000.00</salary> 

<bonus>2000.00</bonus> 

</employee> 

</employees> 

</depart> 

<depart> 

<name>testing center</name> 

<employees> 

<employee> 

<serial_no>110001</serial_no> 

<name>Helen</name> 

<age>23</age> 

<birthday>1983-07-21</birthday> 

<salary>5000.00</salary> 

<bonus>1000.00</bonus> 

</employee> 

</employees> 

</depart> 

</departs> 

XML; 

$xml = simplexml_load_string($data); //創建 SimpleXML對象 

print_r($xml); //輸出 XML 

?> 

 

在上面的例子中,$data變量存儲瞭一段 XML數據。 simplexml_load_string函數將變量$data轉化成 SimpleXML對象。通過 print_r函數的輸出可以看出該對象的結構,運行結果如下所示。 

復制代碼 代碼如下:

SimpleXMLElement Object 

[depart] => Array 

[0] => SimpleXMLElement Object 

[name] => production support 

[employees] => SimpleXMLElement Object 

( [employee] => Array ( 

[0] => SimpleXMLElement Object 

( [serial_no] => 100001 

[name] => Simon 

[age] => 24 

[birthday] => 1982-11-06 

[salary] => 5000.00 

[bonus] => 1000.00 

[1] => SimpleXMLElement Object 

( [serial_no] => 100002 

[name] => Elaine 

[age] => 24 

[birthday] => 1982-01-01 

[salary] => 6000.00 

[bonus] => 2000.00 

[1] => SimpleXMLElement Object 

[name] => testing center 

[employees] => SimpleXMLElement Object 

[employee] => SimpleXMLElement Object 

[serial_no] => 110001 

[name] => Helen 

[age] => 23 

[birthday] => 1983-07-21 

[salary] => 5000.00 

[bonus] => 1000.00 

 

從輸出結果可以看出,SimpleXML對象的結構與 XML數據的格式完全相同。 

第二種方法是使用 simplexml_load_flie函數讀取一個 XML文件來完成創建的,其語法格式如下所示。 

simplexml_load_file(string filename) 

這裡的 filename變量是用於存儲 XML數據文件的文件名及其所在路徑。以下代碼使用 simplexml_load_file函數來創建瞭一個 SimpleXML對象。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //創建 SimpleXML對象 

print_r($xml); //輸出 XML 

?> 

 

其中,example.xml存儲的數據與上面的$data完全相同,運行結果也與上面完全相同。 

上面兩種方法實現瞭同樣的功能,其區別就在於 XML的數據源不同。如果 XML的數據源在 PHP腳本文件中,則需要使用 simplexml_load_string來進行創建。如果 XML的數據源在一個單獨的 XML文件中,則需要使用 simplexml_load_file來進行創建。 

2.2 讀取 SimpleXML對象中的 XML數據 

前面介紹瞭使用 print_r函數來讀取 SimpleXML對象中的數據,其返回結果與數組的結構類似。顯然,這種顯示方式在實際應用中是不可取的。在這裡將介紹其他的幾種讀取 SimpleXML對象中 XML數據的方法。 

1.var_dump函數顯示對象詳細信息 

var_dump函數可以用於顯示 SimpleXML對象的詳細信息,與 print_r函數相比,var_dump函數顯示的信息更為完整,其語法如下所示。 

void var_dump(object1, object2 … ) 

以下代碼使用 var_dump函數輸出瞭上面例子中對象的詳細信息。 

復制代碼 代碼如下:

<?php $xml = simplexml_load_file('example.xml'); //創建 SimpleXML對象 var_dump($xml); //輸出 XML ?> 

 

運行結果如下所示。 

復制代碼 代碼如下:

object(SimpleXMLElement)#1 (1) { ["depart"]=> array(2) { 

[0]=> 

object(SimpleXMLElement)#2 (2) { 

["name"]=> 

string(18) “production support” 

["employees"]=> 

object(SimpleXMLElement)#4 (1) { 

["employee"]=> 

array(2) { 

[0]=> 

object(SimpleXMLElement)#5 (6) { 

["serial_no"]=> 

string(6) “100001″ 

["name"]=> 

string(5) “Simon” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-11-06″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

[1]=> 

object(SimpleXMLElement)#6 (6) { 

["serial_no"]=> 

string(6) “100002″ 

["name"]=> 

string(6) “Elaine” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-01-01″ 

["salary"]=> 

string(7) “6000.00″ 

["bonus"]=> 

string(7) “2000.00″ 

[1]=> 

object(SimpleXMLElement)#3 (2) { 

["name"]=> 

string(14) “testing center” 

["employees"]=> 

object(SimpleXMLElement)#7 (1) { 

["employee"]=> 

object(SimpleXMLElement)#8 (6) { 

["serial_no"]=> 

string(6) “110001″ 

["name"]=> 

string(5) “Helen” 

["age"]=> 

string(2) “23″ 

["birthday"]=> 

string(10) “1983-07-21″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

}}}}} 

 

與前面 print_r輸出的結果相比較,var_dump函數的輸出結果的結構更為嚴謹,並且將對象中的每一個屬性的數據類型均作出分析。在實際應用中,var_dump函數往往用於程式調試時的對象檢測。 

2.讀取 XML數據中的標簽 

與操作數組類型的變量類似,讀取 XML也可以通過類似的方法來完成。例如,如果需要讀取上面 XML數據中每一個“ depart”標簽下的“name”屬性,可以通過使用 foreach函數來完成,如以下代碼 

所示。 

復制代碼 代碼如下:

<?php $xml = simplexml_load_file('example.xml'); foreach($xml->depart as $a) 

echo “$a->name <BR>”; 

?> 

 

運行結果如下所示。 

production support 

testing center 

//讀取 XML文件 //循環讀取 XML數據中的每一個 depart標簽 

//輸出其中的 name屬性 

也可以使用方括號“ []”來直接讀取 XML數據中指定的標簽。以下代碼輸出瞭上面 XML數據中的第一個“depart”標簽的“name”屬性。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML文件 

echo $xml->depart->name[0]; //輸出節點 

?> 

 

運行結果如下所示。 

production support 

對於一個標簽下的所有子標簽,SimpleXML組件提供瞭 children方法進行讀取。例如,對於上面的 XML數據中的“ depart”標簽,其下包括兩個子標簽:“ name”和“employees”。以下代碼實現瞭對第一個“depart”標簽下的子標簽的讀取。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); 

foreach ($xml->depart->children() as $depart) //循環讀取 depart標簽下的子標簽 

var_dump($depart); //輸出標簽的 XML數據 

?> 

 

運行結果如下所示。 

復制代碼 代碼如下:

object(SimpleXMLElement)#3 (1) { 

[0]=> 

string(18) “production support” 

object(SimpleXMLElement)#5 (1) { 

["employee"]=> 

array(2) { 

[0]=> 

object(SimpleXMLElement)#3 (6) { 

["serial_no"]=> 

string(6) “100001″ 

["name"]=> 

string(5) “Simon” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-11-06″ 

["salary"]=> 

string(7) “5000.00″ 

["bonus"]=> 

string(7) “1000.00″ 

[1]=> 

object(SimpleXMLElement)#6 (6) { 

["serial_no"]=> 

string(6) “100002″ 

["name"]=> 

string(6) “Elaine” 

["age"]=> 

string(2) “24″ 

["birthday"]=> 

string(10) “1982-01-01″ 

["salary"]=> 

string(7) “6000.00″ 

["bonus"]=> 

string(7) “2000.00″ 

 

可以看出,使用 children方法後,所有的子標簽均被當作一個新的 XML文件進行處理。 

3.基於 XML數據路徑的查詢 

SimpleXML組件提供瞭一種基於 XML數據路徑的查詢方法。 XML數據路徑即從 XML的根到某一個標簽所經過的全部標簽。這種路徑使用斜線“ /”隔開標簽名。例如,對於上面的 XML數據,要查詢所有的標簽“name”中的值,從根開始要經過 departs、depart、employees和 employee標簽,則其路徑 

為“/departs/depart/employees/employee/name”。 SimpleXML組件使用 xpath方法來解析路徑,其語法格式如下所示。 

xpath(string path) 

其中的 path為路徑。該方法返回瞭一個包含有所有要查詢標簽值的數組。以下代碼查詢瞭上面 XML數據中的所有 name標簽。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML文件 

$result = $xml->xpath('/departs/depart/employees/employee/name'); //定義節點 

var_dump($result); //輸出節點 

?> 

 

運行結果如下所示。 

復制代碼 代碼如下:

array(3) { 

[0]=> object(SimpleXMLElement)#2 (1) { 

[0]=> string(5) “Simon” 

[1]=> object(SimpleXMLElement)#3 (1) { 

[0]=> string(6) “Elaine” 

[2]=> object(SimpleXMLElement)#4 (1) { 

[0]=> string(5) “Helen” 

 

可以看出,所有的 name標簽均被查詢出來。 

2.3 XML數據的修改 

對於 XML數據的修改與讀取 XML數據中的標簽方法類似。即通過直接修改 SimpleXML對象中的標簽的值來實現。以下代碼實現瞭對上面 XML數據中第一個“ depart”標簽的“ name”子標簽的修改。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML 

$xml->depart->name[0] = “Human Resource”; //修改節點 

?> 

 

修改後,並不會對 XML文件有任何影響。但是,在程式中,對於 SimpleXML對象的讀取將使用修改過的值。 

2.4 標準化 XML數據 

SimpleXML還提供瞭一種標準化 XML數據的方法 asXML。asXML方法可以有效的將 SimpleXML對象中的內容按照 XML 1.0標準進行重新編排並以字符串的數據類型返回。以下代碼實現瞭對上面 XML數據的標準化。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML數據 

echo $xml->asXML(); //標準化 XML數據 

?> 

 

2.5 XML數據的存儲 

將 SimpleXML對象中的 XML數據存儲到一個 XML文件的方法非常簡單,即將 asXML方法的返回結果輸出到一個文件中即可。以下代碼首先將 XML文件中的 depart name進行瞭修改,然後將修改過的 XML數據輸出到另一個 XML文件。 

復制代碼 代碼如下:

<?php 

$xml = simplexml_load_file('example.xml'); //讀取 XML數據 

$newxml = $xml->asXML(); //標準化 XML數據 

$fp = fopen(”newxml.xml”, “w”); //打開要寫入 XML數據的文件 

fwrite($fp, $newxml); //寫入 XML數據 

fclose($fp); //關閉文件 

?> 

 

代碼運行後,可以看到在 newxml.xml文件中的 XML數據如下所示。 

可以看出,對於 XML文件的修改已經保存到輸出文件中瞭。 

3 XML文檔的動態創建 

在實際應用中,時而會需要動態生成 XML文檔的操作。前面介紹的 SimpleXML組件並不提供創建 XML文檔的方法。因此,如果需要動態創建 XML文檔,往往使用 DOM組件進行創建。 DOM是文檔對象模型 Document Object Model的縮寫, DOM組件提供瞭對 XML文檔的樹型解析模式。以下代碼使用 DOM組件創建瞭一個 XML文檔。 

 

復制代碼 代碼如下:

<?php 

//創建一個新的 DOM文檔 

$dom = new DomDocument(); 

//在根節點創建 departs標簽 

$departs = $dom->createElement('departs'); 

$dom->appendChild($departs); 

//在 departs標簽下創建 depart子標簽 

$depart = $dom->createElement('depart'); 

$departs->appendChild($depart); 

//在 depart標簽下創建 employees子標簽 

$employees = $dom->createElement('employees'); 

$depart->appendChild($employees); 

//在 employees標簽下創建 employee子標簽 

$employee = $dom->createElement('employee'); 

$employees->appendChild($employee); 

//在 employee標簽下創建 serial_no子標簽 

$serial_no = $dom->createElement('serial_no'); 

$employee->appendChild($serial_no); 

//為 serial_no標簽添加值節點 100001 

$serial_no_value = $dom->createTextNode('100001′); 

$serial_no->appendChild($serial_no_value); 

//輸出 XML數據 

echo $dom->saveXML(); 

?> 

輸出結果如下所示。 

<?xml version=”1.0″?> 

<departs> 

<depart> 

<employees> 

<employee> 

<serial_no>100001</serial_no> 

</employee> 

</employees> 

</depart> 

</departs> 

 

DOM組件除瞭可以用來動態創建 XML文檔外,還可以用來讀取 XML文件。以下代碼實現瞭對前 

面 XML文件的讀取。 

復制代碼 代碼如下:

<?php 

$dom = new DomDocument(); //創建 DOM對象 

$dom->load('example.xml'); //讀取 XML文件 

$root = $dom->documentElement; //獲取 XML數據的根 

read_child($root); //調用 read_child函數讀取根對象 

function read_child($node) 

$children = $node->childNodes; //獲得$node的所有子節點 

foreach($children as $e) //循環讀取每一個子節點 

if($e->nodeType == XML_TEXT_NODE) //如果子節點為文本型則輸出 

echo $e->nodeValue.”<BR>”; 

else if($e->nodeType == XML_ELEMENT_NODE) //如果子節點為節點對象,則調用函數處理 

read_child($e); 

?> 

 

運行結果如下所示。 

復制代碼 代碼如下:

引用 

production support 

100001 

Simon 

24 

1982-11-06 

5000.00 

1000.00 

100002 

Elaine 

24 

1982-01-01 

6000.00 

2000.00 

testing center 

110001 

Helen 

23 

1983-07-21 

5000.00 

1000.00 

 

上面的例子使用瞭遞歸的方式對 XML數據進行瞭處理,實現瞭輸出 XML數據中的所有文本型標簽的功能。 

4 XML應用實例——留言本 

前面介紹瞭 XML的基本操作,本節將以設計一個 XML留言本為例來詳細說明在實際應用中如何實現 PHP與 XML數據的交互操作。 

4.1 XML文件結構設計 

XML文件用於存儲 XML數據,也就是留言本中的留言。這裡,對於每條留言,在 XML數據中主要包括三項內容:留言標題、留言者姓名、留言內容。因此,將 XML文件的格式設計如下。 

 

復制代碼 代碼如下:

<?xml version=”1.0″?> 

<threads> 

<thread> 

<title>這裡是留言的標題</title> 

<author>這裡是留言者</author> 

<content>這裡是留言內容</content> 

</thread> 

</threads> 

 

4.2 提交頁面的編寫 

提交留言頁面由兩個頁面組成。一個是讓訪問者用來書寫留言的表單的 HTML文件,一個是用來處理訪問者輸入的 PHP腳本。表單的 HTML代碼如下所示。 

復制代碼 代碼如下:

<html> 

<head> 

<title>發表新的留言</title> 

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″> 

</head> 

<body> 

<H1><p align=”center”>發表新的留言</p></H1> 

<form name=”form1″ method=”post” action=”Post.php”> 

<table width=”500″ border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″> 

<tr> 

<td>標題</td> 

<td><input name=”title” type=”text” id=”title” size=”50″></td> 

</tr> 

<tr> 

<td>作者</td> 

<td><input name=”author” type=”text” id=”author” size=”20″></td> 

</tr> 

<tr> 

<td>內容</td> 

<td><textarea name=”content” cols=”50″ rows=”10″ id=”content”></textarea></td> 

</tr> 

</table> 

<p align=”center”> 

<input type=”submit” value=”Submit”> 

<input type=”reset” value=”Reset”> 

</p> 

</form> 

</body> 

</html> 

 

對於用來處理用戶輸入的 PHP腳本,其基本邏輯是首先創建一個 DOM對象,然後讀取 XML文件中的 XML數據,接下來在 XML對象上創建新的節點並將用戶的輸入儲存起來,最後將 XML數據輸出到原來的 XML文件中。具體實現代碼如下所示。 

復制代碼 代碼如下:

<?php 

$guestbook = new DomDocument(); //創建一個新的 DOM對象 

$guestbook->load('DB/guestbook.xml'); //讀取 XML數據 

$threads = $guestbook->documentElement; //獲得 XML結構的根 

//創建一個新 thread節點 

$thread = $guestbook->createElement('thread'); 

$threads->appendChild($thread); 

//在新的 thread節點上創建 title標簽 

$title = $guestbook->createElement('title'); 

$title->appendChild($guestbook->createTextNode($_POST['title'])); 

$thread->appendChild($title); 

//在新的 thread節點上創建 author標簽 

$author = $guestbook->createElement('author'); 

$author->appendChild($guestbook->createTextNode($_POST['author'])); 

$thread->appendChild($author); 

//在新的 thread節點上創建 content標簽 

$content = $guestbook->createElement('content'); 

$content->appendChild($guestbook->createTextNode($_POST['content'])); 

$thread->appendChild($content); 

//將 XML數據寫入文件 

$fp = fopen(”DB/guestbook.xml”, “w”); 

if(fwrite($fp, $guestbook->saveXML())) 

echo “留言提交成功”; 

else 

echo “留言提交失敗”; 

fclose($fp); 

?> 

 

在瀏覽器中運行上述 HTML文件並填寫適當的留言內容,如圖 2所示。 

 

圖 2 發表新留言界面 

單擊【Submit】按鈕後,XML文件中的內容如下所示。 

可以看到 XML文件中已經將留言存儲起來瞭。 

4.3 顯示頁面的編寫 

顯示頁面可以使用前面介紹的 SimpleXML組件很容易的實現,具體實現代碼如下所示。 

復制代碼 代碼如下:

<?php 

//打開用於存儲留言的 XML文件 

$guestbook = simplexml_load_file('DB/guestbook.xml'); 

foreach($guestbook->thread as $th) //循環讀取 XML數據中的每一個 thread標簽 

echo “<B>標題:</B>”.$th->title.”<BR>”; 

echo “<B>作者:</B>”.$th->author.”<BR>”; 

echo “<B>內容:</B><PRE>”.$th->content.”</PRE>”; 

echo “<HR>”; 

?> 

 

 

在瀏覽器中查看運行結果如圖 3所示。 

 

 

您可能感興趣的文章:

PHP讀取XML值的代碼(推薦)

php讀取xml實例代碼

用PHP編寫和讀取XML的幾種方式

PHP中的生成XML文件的4種方法分享

用PHP讀取和編寫XML DOM的實現代碼

PHP中simplexml_load_string函數使用說明

php xml 入門學習資料

PHP操作XML作為伺服器的類

php生成xml簡單實例代碼

php與XML、XSLT、Mysql的結合運用實現代碼

PHP 生成的XML以FLASH獲取為亂碼終極解決

PHP讀取xml方法介紹

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *