如今人人鼓吹XML是Web開發者最好的朋友
有了XML的幫忙
後者即可輕松地格式化和顯示來自幾乎任何數據源的數據
但是
對動態內容而言
格式優良的數據卻還遠遠談不上達到理想狀態
大多數的Web開發者都會告訴你
今天的網絡上沒有動態內容怎麼能行!問題是
到底該如何用XML創建動態內容呢?
答案是用動態內容處理語言來解析XML
比如用PHP或者Perl等
從理論上說
這類程序語言是可以出於各種目的利用XML的
無非是采用一些能解析XML的工具包而已
James Clark就提供了一種名叫expat的工具包
expat XML工具包用C語言解析XML
令PHP與XML輕松共舞
PHP是一種專為Web設計的絕佳腳本語言
XML是表示Web內容的標准
兩者聯手真是要多美有多美!
下面我會給讀者演示一個簡單的示例
通過這個例子即可說明如何用PHP把XML文檔解析為HTML
然後我會介紹一些PHP的其他XML概念
用PHP解析XML很簡單
操作起來很直觀但卻需要對細節有所解釋
一旦真正掌握了應用的要領
你肯定會驚奇自己怎麼不早想到把它們倆攏一塊兒來
概述
PHP用expat這種XML工具包
通過C語言來解析XML
這個工具包的函數集同Perl XML解析所采用的函數集是一樣的
此外
這種工具包還是事件驅動型的解析器
這就是說
expat把每個XML標簽或者新一行代碼當作事件的起始
而事件就是函數的觸發器
Expat的安裝非常簡單
如果你正在用著Apache Web服務器
那麼你可以在PHP XML參考頁上找到安裝和下載指南
用PHP解析XML的基本任務是這樣的
首先
創建XML解析器的一個實例
接著
定義處理觸發事件的函數
比如開始或者結束標簽等
隨後
定義實際意義的數據處理程序
最後
打開XML文件
讀取文件數據並解析數據
之後關閉文件釋放XML解析器
你瞧
就像我說的那樣
這套操作過程沒什麼特別的
不過
在我們討論具體的示例之前先了解以下的一些警示
Expat不對XML進行檢驗
這意味著只要XML文件格式正確——所有的元素嵌套得當
開始和關閉標簽沒有任何錯誤——它就會被解析
Expat可不管XML是否遵守XML文件頭中引用的標准或者定義
Expat把XML標簽全部轉換為大寫字母
如果你的腳本在標簽名和其他內容上大小寫字母混用可就要小心了
PHP是在magic quotes設置啟用的情況下編譯而成
那麼復雜的XML文件不會得到正確的解析
要是magic quotes不是默認設置
你就當我沒說
好了
我們現在就來看看有關的示例!
基本示例
為了把復雜的事情簡單化
我在例子中省略了錯誤檢查和其他一些不必要的東西
當然
你可以在自己的代碼隨心所欲
我假定你早就熟悉PHP及其語法
而我會對XML函數做一番解釋
首先我會說明腳本程序的含義
接著定義用戶定義函數
實際上這些函數位於引用它們的代碼之前
相關附件:程序清單A 所示為腳本的完整代碼
腳本要解析的XML文檔則是 相關附件:程序清單B
處理之後的輸出結果如表A所示
XML Articles
Remedial XML for programmers: Basic syntax
In this first installment in a three
part series
I
ll introduce you to XML and its basic syntax
Remedial XML: Enforcing document formats with DTDs
To enforce structure requirements for an XML document
you have to turn to one of XML
s attendant technologies
data type definition (DTD)
Remedial XML: Using XML Schema
In this article
we
ll briefly touch on the shortcomings of DTDs and discuss the basics of a newer
more powerful standard: XML Schemas
Remedial XML: Say hello to DOM
Now it
s time to put on your programmer
s hat and get acquainted with Document Object Model (DOM)
which provides easy access to XML documents via a tree
like set of objects
Remedial XML: Learning to play SAX
In this fifth installment in our Remedial XML series
I
ll introduce you to the SAX API and provide some links to SAX implementations in several languages
表A PHP解析XML的輸出結果
首先我創建了XML解析器的一個實例
$parser = xml_parser_create();
接著
我定義解析器遭遇開始和結束標簽時的操作
注意
startElement
和
endElement
是用戶定義的函數
當然你可以按照自己的喜好給它們起個其他名字
但我起的這些名字可是標准的習慣要求
xml_set_element_handler($parser
startElement
endElement
);
然後我定義了數據操作
這裡的
characterData
也是用戶定義的函數
名字也是習慣性的
xml_set_character_data_handler($parser
characterData
);
現在打開文件讀取數據
你可以在這裡開始編寫錯誤處理代碼
我在例子中省略了這些錯誤處理
不要忘了在腳本的開頭定義$xml_file
$filehandler = fopen($xml_file
r
);
我開始讀取文件內容
一次讀
K字節並放在變量
$data
內直到文件末尾
我用xml_parse解析讀取的這些數據段
while ($data = fread($filehandler
)) {
xml_parse($parser
$data
feof($filehandler));
}
最後進行清空
關閉文件和釋放解析器等操作
fclose($filehandler);
xml_parser_free($parser);
以上就是腳本中所用到的所有XML函數
下面我再具體解釋下其中用到的
個用戶定義函數
它們就是
startElement
endElement
和
characterData
只要xml_parse遇到這樣的開始標簽
startElement
函數就由XML解析器調用
在我們的例子中解析器就是$parser
該函數是必須定義的函數
它擁有
個自動傳遞給它的參數
XML解析器實例
大寫的元素名稱
比如URL以及該元素所具有的屬性數組
在以上示例中
XML文件中的元素沒有屬性集合
所以數組參數為空
但這個參數還是必須存在的
就這個例子而言
我決定在一個HTML表中顯示我的XML數據
如上所示
出於簡化的緣故我沒有編寫錯誤處理代碼
這裡我耍了個障眼法
因為我知道XML文件中標簽出現的順序
否則我可以用
startElement
characterData
和
endElement
函數來定義數組
然後用單獨的函數顯示結果
function startElement($parser_instance
$element_name
$attrs) {
switch($element_name) {
case
URL
: echo
break;
case
SUMMARY
: echo
;
break;
}
}
處理元素標簽之後
xml_parse一旦遇到XML數據就會調用
characterData
函數
這個函數也是由解析器自動調用的
該函數需要兩個參數
解析器實例和包含數據的字符串
function characterData($parser_instance
$xml_data) {
echo $xml_data;
}
最後xml_parse遭遇結束標簽
運行
endElement
函數
該函數帶兩個參數
解析器實例和元素名稱
function endElement($parser_instance
$element_name) {
switch($element_name) {
case
URL
: echo
>
;
break;
case
TITLE
: echo
;
break;
case
SUMMARY
: echo
;
break;
}
}
用PHP解析XML的輕量鍛煉到這裡就結束了
下面我們開始加些重活
增加函數
PHP中還有其他一些同XML解析有關的函數
文檔對這些函數進行了完整的說明
我在這裡提到了一些
你或許不久就會用到這些函數
xml_set_default_handler()—該函數的工作方式和xml_set_character_data_handler()函數相近
但它捕獲定義的一切
這個函數常用於文檔類型聲明控制數據的處理
xml_parser_set_option()—你可以用這個函數禁用字母的轉大寫操作或者選擇其他替代的字符編碼集
xml_parse_into_struct()—這個函數用來略過
startElement
characterData
和
endElement
函數的調用
而把數據直接放進數組
xml_error_string()—這個函數用來從xml_parser() 錯誤中獲取文本信息
xml_get_error_code()—你可以用這個函數獲取上面提到的錯誤字符串
後兩個函數的用法是這樣的
if(!xml_parse($parser
$data
feof($filehandler))) { die(xml_error_string(xml_get_error_code($parser)); )
如果你覺得自己已經上手
我建議你仔細讀讀PHP手冊頁中提供的XML External Entity Example
這些例子提出了本文沒有提到的其他一些概念以及處理文件錯誤的某些技術
小結
本文演示了PHP和XML的緊密結合過程
兩種技術以Web為中心的天性促使它們聯合起來成為動態內容所需的理想解決方案
From:http://tw.wingwit.com/Article/program/net/201311/11667.html