php下使用SimpleXML 處理XML 文件
要處理XML 文件,有兩種傳統(tǒng)的處理思路:SAX 和DOM。SAX 基于事件觸發(fā)機(jī)制,
對(duì)XML 文件進(jìn)行一次掃描,完成要進(jìn)行的處理;DOM 則將整個(gè)XML 文件構(gòu)造為一棵DOM
樹(shù),通過(guò)對(duì)DOM 樹(shù)的遍歷完成處理。這兩種方法各有優(yōu)缺點(diǎn),SAX 的處理思路相對(duì)抽象,
DOM 的處理過(guò)程相對(duì)煩瑣,都不很適合新手的入門(mén)。
PHP5 推出了一套新的XML 處理函數(shù),即SimpleXML。名如其實(shí),SimpleXML 本身小
巧精干,只提供了少量的幾個(gè)方法函數(shù),但用它處理起XML 文件功能卻非常強(qiáng)大,操作也
非常的簡(jiǎn)單。
首先,它提供有簡(jiǎn)單的函數(shù)可以從XML 文檔、字符串、或DOM 對(duì)象上直接構(gòu)造出
SimpleXMLElement 對(duì)象;其次,SimpleXMLElement 提供有簡(jiǎn)單的方法可以進(jìn)行屬性、子節(jié)
點(diǎn)、和XPath 的操作;然而,SimpleXML 最簡(jiǎn)單的地方是,它提供有使用標(biāo)準(zhǔn)對(duì)象的屬性和
對(duì)象迭代器進(jìn)行節(jié)點(diǎn)操作的方法,這一處理思路使得用PHP 對(duì)XML 文檔的處理得到了極大
的簡(jiǎn)化。
2 SimpleXML 入門(mén)示例
下面我們通過(guò)一些小的代碼片段,稍微了解一下SimpleXML 的強(qiáng)大和簡(jiǎn)潔。為舉例方便,
我們使用一個(gè)Messages.xml 文件,里面包含這樣一段XML 代碼:
Messages.xml
<?xml version='1.0' standalone='yes'?>
<Messages>
<msg id='1'>
<title>This is Title</title>
<content>Here is Content</content>
<time>2008-03-20 21:50:23</time>
<reply id='11'>reply 1</reply>
<reply id='12'>reply 2</reply>
</msg>
</Messages>
這是一篇保存有留言信息的XML 文檔,每條信息包括屬性id,子節(jié)點(diǎn)title、content、time
以及若干條對(duì)于它的回復(fù)信息,每條回復(fù)包括屬性id 及回復(fù)的內(nèi)容。
用SimpleXML 處理并輸出此XML 文檔內(nèi)容的過(guò)程以及方法如下。
(1) 構(gòu)造SimpleXMLElement 對(duì)象
代碼片斷
$xml = simplexml_load_file('Messages.xml');
如果這段xml 已經(jīng)被讀入到一個(gè)字符串$messages 中,則可以使用如下語(yǔ)句:
代碼片斷
$xml = simplexml_load_string('Messages.xml');
(2)輸出留言1 的標(biāo)題
代碼片斷
//可以使用屬性的方式訪問(wèn)子節(jié)點(diǎn),通過(guò)節(jié)點(diǎn)的標(biāo)簽名可直接得到節(jié)點(diǎn)的內(nèi)容
echo $xml->msg->title;
(3)輸出留言1 的第一條回復(fù)信息
代碼片斷
//同級(jí)別的多個(gè)同名節(jié)點(diǎn)自動(dòng)成為數(shù)組,可以通過(guò)索引下標(biāo)訪問(wèn)其內(nèi)容
echo $xml->msg->reply[0];
(4)輸出留言的id
代碼片斷
//節(jié)點(diǎn)的屬性與值被封裝成為關(guān)聯(lián)數(shù)組的鍵與值
echo $xml->msg['id'];
(5)輸出第二條回復(fù)的id
代碼片斷
//成為二維數(shù)組,第一維表示節(jié)點(diǎn),第二維表示屬性
echo $xml->msg->reply[1][ 'id'];
(6)依次輸出所有回復(fù)的id
代碼片斷
//使用foreach 對(duì)同名節(jié)點(diǎn)進(jìn)行遍歷
foreach ($xml->msg->reply as $reply){
echo $reply['id'];
}
(7)使用XPath 檢索所有的回復(fù)信息
代碼片斷
//xpath 方法直接檢索定位(//表示任意深度)
foreach ($xml->xpath('//reply') as $reply){
echo $reply.'<br>';
}
(8)遍歷留言1 所有的子節(jié)點(diǎn)
代碼片斷
//children 方法得到所有子節(jié)點(diǎn)
foreach ($xml->msg->children() as $field){
echo $field.'<br>';
}
(9)重新設(shè)置留言1 的發(fā)布時(shí)間
代碼片斷
//直接設(shè)置屬性
$xml->msg->time = '2008-03-21 00:53:12';
(10)設(shè)置回復(fù)2 的id 屬性
代碼片斷
//設(shè)置管理數(shù)組的值
$xml->msg->reply[1]['id'] = '222';
(11)新增一個(gè)描述消息作者的字段
代碼片斷
//直接設(shè)置屬性
$xml->msg->author = 'zhangsan';
(12)將消息的作者保存為屬性
代碼片斷
//設(shè)置關(guān)聯(lián)數(shù)組的key
$xml->msg['author'] = 'zhangsan';
(13)重新保存對(duì)象到文件
代碼片斷
//保存
$xml->asXML('MessagesNew.xml');
應(yīng)該可以看出SimpleXML 有多簡(jiǎn)單了吧!
3 實(shí)例:XML 文件與數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)交互
下面提供一個(gè)相對(duì)完整的實(shí)例,將留言信息從MySQL 數(shù)據(jù)庫(kù)中查詢(xún)出來(lái),保存成為一
個(gè)如上例所示的XML 文件。留言信息和回復(fù)信息獨(dú)立保存在兩張表中,使用MySQL 函數(shù)包
可以非常簡(jiǎn)單地實(shí)現(xiàn)如下:
代碼如下:
<?php
//cong work atWed Mar 20 19:59:04 CST 2008
//將數(shù)據(jù)從MySQL 數(shù)據(jù)庫(kù)中保存到XML 文件中
//可以使用如下幾種方式構(gòu)造初始的SimpleXMLElement 對(duì)象
//1、從DOM 對(duì)象中構(gòu)造
//$dom = new DOMDocument();
//$dom->loadXML("<rows></rows>");
//$xml = simplexml_import_dom($dom);
//2、從僅包含根標(biāo)簽的xml 文件中構(gòu)造
//$xml = simplexml_load_file('messages.xml');
//3、直接寫(xiě)根標(biāo)簽字符串構(gòu)造
//$xml = simplexml_load_string("<Messages></Messages>");
//4、使用SimpleXMLElement 類(lèi)的構(gòu)造器構(gòu)造
$xml = new SimpleXMLElement('<Messages></Messages>');
//連接數(shù)據(jù)庫(kù)
mysql_connect('localhost','root','root');
mysql_select_db('test');
mysql_query('set names utf8');
//查詢(xún)消息
$rs = mysql_query("select * from messages");
$i = 0; //用做多條消息的數(shù)組索引下標(biāo)
while($row = mysql_fetch_assoc($rs)){
$xml->message[$i] = ''; //… … … … … … … … … … … … ①
$xml->message[$i]['id'] = $row['id'];
$xml->message[$i]->title = $row['title'];
$xml->message[$i]->content = $row['content'];
$xml->message[$i]->time = $row['time'];
//根據(jù)消息id 查詢(xún)它相關(guān)的回復(fù)信息
$rsReply = mysql_query("select * from replies where mid={$row['id']}");
$j = 0; //用于做多條回復(fù)的索引下標(biāo)
while($rowReply = mysql_fetch_assoc($rsReply)){
$xml->message[$i]->reply[$j] = $rowReply['reply'];
$xml->message[$i]->reply[$j]['id'] = $rowReply['id'];
$j++;
}
$i++;
}
$xml->asXML('messages.xml');
?>
上述代碼唯一值得一提的地方就是標(biāo)志①的那行。當(dāng)我們要向一個(gè)SimpleXML 對(duì)象中新
增一個(gè)節(jié)點(diǎn)或?qū)傩詴r(shí),必須保證它的父節(jié)點(diǎn)是存在的,否則會(huì)報(bào)一個(gè)致命錯(cuò)誤,提示信息是:
Objects used as arrays in post/pre increment/decrement must return values by reference。希望大家
不要被這段不知所云的提示所迷惑。相信讀者能通過(guò)對(duì)上述代碼的了解,對(duì)等地寫(xiě)出一個(gè)從XML文件到MySQL 的代碼出來(lái)。
- PHP XML操作的各種方法解析(比較詳細(xì))
- PHP讀取XML值的代碼(推薦)
- PHP中的生成XML文件的4種方法分享
- php中DOMDocument簡(jiǎn)單用法示例代碼(XML創(chuàng)建、添加、刪除、修改)
- PHP輸出XML到頁(yè)面的3種方法詳解
- php實(shí)現(xiàn)將數(shù)組轉(zhuǎn)換為XML的方法
- php的SimpleXML方法讀寫(xiě)XML接口文件實(shí)例解析
- php輸出xml必須header的解決方法
- php以post形式發(fā)送xml的方法
- php simplexmlElement操作xml的命名空間實(shí)現(xiàn)代碼
- php處理復(fù)雜xml數(shù)據(jù)示例
相關(guān)文章
PHP簡(jiǎn)單獲取多個(gè)checkbox值的方法
這篇文章主要介紹了PHP簡(jiǎn)單獲取多個(gè)checkbox值的方法,結(jié)合實(shí)例形式分析了php表單操作中針對(duì)checkbox值的傳遞與獲取技巧,需要的朋友可以參考下2016-06-06通用PHP動(dòng)態(tài)生成靜態(tài)HTML網(wǎng)頁(yè)的代碼
最近研究PHP的一些開(kāi)發(fā)技術(shù),發(fā)現(xiàn)PHP有很多ASP所沒(méi)有的優(yōu)秀功能,可以完成一些以前無(wú)法完成的功能,例如動(dòng)態(tài)生成HTML靜態(tài)頁(yè)面,以減少服務(wù)器CPU的負(fù)載,提高用戶訪問(wèn)的速度。2010-03-03ob_start(),ob_start(''ob_gzhandler'')使用
ob_start(),ob_start(''ob_gzhandler'')使用...2006-12-12php中$_POST與php://input的區(qū)別實(shí)例分析
這篇文章主要介紹了php中$_POST與php://input的區(qū)別,實(shí)例分析了$_POST與php://input的功能、使用技巧與用法區(qū)別,需要的朋友可以參考下2015-01-01一個(gè)簡(jiǎn)單安全的PHP驗(yàn)證碼類(lèi) 附調(diào)用方法
這篇文章主要為大家分享了一個(gè)簡(jiǎn)單安全的PHP驗(yàn)證碼類(lèi),附調(diào)用方法,感興趣的小伙伴們可以參考一下2016-06-06PHP實(shí)現(xiàn)合并兩個(gè)有序數(shù)組的方法分析
這篇文章主要介紹了PHP實(shí)現(xiàn)合并兩個(gè)有序數(shù)組的方法,結(jié)合實(shí)例形式分析了php針對(duì)數(shù)組的合并、遍歷、排序、去重等常見(jiàn)操作技巧,需要的朋友可以參考下2017-12-12php中實(shí)現(xiàn)獲取隨機(jī)數(shù)組列表的自定義函數(shù)
這篇文章主要介紹了php中實(shí)現(xiàn)獲取隨機(jī)數(shù)組列表的自定義函數(shù),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04PHP獲取時(shí)間戳等相關(guān)函數(shù)匯總
PHP是一種廣泛使用的服務(wù)器端腳本語(yǔ)言,具有豐富的時(shí)間戳相關(guān)函數(shù)。本文介紹了PHP中獲取時(shí)間戳的常用函數(shù),包括time()、strtotime()、date()等,并提供了使用示例。同時(shí),還介紹了PHP中其他與時(shí)間相關(guān)的函數(shù),如mktime()、microtime()等。2023-06-06