PHP XML操作的各種方法解析

[此處原創]今天把自己的應用轉到另一個開放平臺上,由於那個平臺的提供的SDK大量的調用了服務器本地IO操作,從初始化的第一步就要寫本地IO,我的應用是部署在SAE上的,不允許本地IO,所以直接導致了所有的SDK都無法使用。本來就想以此爲藉口不移植了,反正也沒什麼好處,不過後來一想,要不嘗試一下自己用php的代碼完成調用吧——我是菜鳥,開發應用調用開放平臺的API都是直接用別人封裝好的SDK來調用。在以前的調用過程中用的一直都是json格式返回數據,這次自己親自寫代碼,不妨嘗試一下XML格式的數據,便到網上搜了一下,找到一篇帖子,用該帖子中的代碼完成了本次移植工作,感覺還不錯,挺簡單的。[原創結束]


[此處轉載]

PHP提供了一整套的讀取 XML文件的方法,很容易的就可以編寫基於 XML的腳本程序。本章將要介紹 PHP與 XML的操作方法,並對幾個常用的 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 提交頁面的編寫
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>
上面的例子使用了遞歸的方式對 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> <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> &l
相關文章
相關標籤/搜索