php下使用SimpleXML 處理XML 檔案_PHP教程

來源:互聯網
上載者:User
1 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 文檔的處理得到了極大
的簡化。
2 SimpleXML 入門樣本
下面我們通過一些小的程式碼片段,稍微瞭解一下SimpleXML 的強大和簡潔。為舉例方便,
我們使用一個Messages.xml 檔案,裡麵包含這樣一段XML 代碼:
Messages.xml
複製代碼 代碼如下:



This is Title
Here is Content
2008-03-20 21:50:23
reply 1
reply 2



這是一篇儲存有留言資訊的XML 文檔,每條資訊包括屬性id,子節點title、content、time
以及若干條對於它的回複資訊,每條回複包括屬性id 及回複的內容。
用SimpleXML 處理並輸出此XML 文檔內容的過程以及方法如下。
(1) 構造SimpleXMLElement 對象

代碼片斷
$xml = simplexml_load_file('Messages.xml');
如果這段xml 已經被讀入到一個字串$messages 中,則可以使用如下語句:
代碼片斷
$xml = simplexml_load_string('Messages.xml');
(2)輸出留言1 的標題
代碼片斷
//可以使用屬性的方式訪問子節點,通過節點的標籤名可直接得到節點的內容
echo $xml->msg->title;
(3)輸出留言1 的第一條回複資訊
代碼片斷
//同層級的多個同名節點自動成為數組,可以通過索引下標訪問其內容
echo $xml->msg->reply[0];
(4)輸出留言的id
代碼片斷
//節點的屬性與值被封裝成為關聯陣列的鍵與值
echo $xml->msg['id'];
(5)輸出第二條回複的id
代碼片斷
//成為二維數組,第一維表示節點,第二維表示屬性
echo $xml->msg->reply[1][ 'id'];
(6)依次輸出所有回複的id
代碼片斷
//使用foreach 對同名節點進行遍曆
foreach ($xml->msg->reply as $reply){
echo $reply['id'];
}
(7)使用XPath 檢索所有的回複資訊
代碼片斷
//xpath 方法直接檢索定位(//表示任意深度)
foreach ($xml->xpath('//reply') as $reply){
echo $reply.'
';
}

(8)遍曆留言1 所有的子節點
代碼片斷
//children 方法得到所有子節點
foreach ($xml->msg->children() as $field){
echo $field.'
';
}
(9)重新設定留言1 的發布時間
代碼片斷
//直接設定屬性
$xml->msg->time = '2008-03-21 00:53:12';
(10)設定回複2 的id 屬性
代碼片斷
//設定管理數組的值
$xml->msg->reply[1]['id'] = '222';
(11)新增一個描述訊息作者的欄位
代碼片斷
//直接設定屬性
$xml->msg->author = 'zhangsan';
(12)將訊息的作者儲存為屬性
代碼片斷
//設定關聯陣列的key
$xml->msg['author'] = 'zhangsan';
(13)重新儲存對象到檔案
代碼片斷
//儲存
$xml->asXML('MessagesNew.xml');
應該可以看出SimpleXML 有多簡單了吧!
3 執行個體:XML 檔案與資料庫之間進行資料互動
下面提供一個相對完整的執行個體,將留言資訊從MySQL 資料庫中查詢出來,儲存成為一
個如上例所示的XML 檔案。留言資訊和回複資訊獨立儲存在兩張表中,使用MySQL 函數包
可以非常簡單地實現如下:

代碼如下:
複製代碼 代碼如下:
//cong work atWed Mar 20 19:59:04 CST 2008
//將資料從MySQL 資料庫中儲存到XML 檔案中
//可以使用如下幾種方式構造初始的SimpleXMLElement 對象
//1、從DOM 對象中構造
//$dom = new DOMDocument();
//$dom->loadXML("");
//$xml = simplexml_import_dom($dom);
//2、從僅包含根標籤的xml 檔案中構造
//$xml = simplexml_load_file('messages.xml');
//3、直接寫根標籤字串構造
//$xml = simplexml_load_string("");
//4、使用SimpleXMLElement 類的構造器構造
$xml = new SimpleXMLElement('');
//串連資料庫
mysql_connect('localhost','root','root');
mysql_select_db('test');
mysql_query('set names utf8');
//查詢訊息
$rs = mysql_query("select * from messages");
$i = 0; //用做多條訊息的數組索引下標
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'];
//根據訊息id 查詢它相關的回複資訊
$rsReply = mysql_query("select * from replies where mid={$row['id']}");
$j = 0; //用於做多條回複的索引下標
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');
?>

上述代碼唯一值得一提的地方就是標誌①的那行。當我們要向一個SimpleXML 對象中新
增一個節點或屬性時,必須保證它的父節點是存在的,否則會報一個致命錯誤,提示資訊是:
Objects used as arrays in post/pre increment/decrement must return values by reference。希望大家

不要被這段不知所云的提示所迷惑。相信讀者能通過對上述代碼的瞭解,對等地寫出一個從XML檔案到MySQL 的代碼出來。

http://www.bkjia.com/PHPjc/321422.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/321422.htmlTechArticle1 SimpleXML 簡介 要處理XML 檔案,有兩種傳統的處理思路:SAX 和DOM。SAX 基於事件觸發機制, 對XML 檔案進行一次掃描,完成要進行的處理;...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.