如何用PHP工具包expat解析XML
來(lái)源:程序員人生 發(fā)布時(shí)間:2013-12-19 21:50:08 閱讀次數(shù):3798次
如今人人鼓吹XML是Web開發(fā)者最好的朋友,有了XML的幫忙,后者即可輕松地格式化和顯示來(lái)自幾乎任何數(shù)據(jù)源的數(shù)據(jù)。但是,對(duì)動(dòng)態(tài)內(nèi)容而言,格式優(yōu)良的數(shù)據(jù)卻還遠(yuǎn)遠(yuǎn)談不上達(dá)到理想狀態(tài)。大多數(shù)的Web開發(fā)者都會(huì)告訴你,今天的網(wǎng)絡(luò)上沒(méi)有動(dòng)態(tài)內(nèi)容怎么能行!問(wèn)題是:“到底該如何用XML創(chuàng)建動(dòng)態(tài)內(nèi)容呢?”
答案是用動(dòng)態(tài)內(nèi)容處理語(yǔ)言來(lái)解析XML,比如用PHP或者Perl等,從理論上說(shuō),這類程序語(yǔ)言是可以出于各種目的利用XML的。無(wú)非是采用一些能解析XML的工具包而已。James Clark就提供了一種名叫expat的工具包。expat XML工具包用C語(yǔ)言解析XML,令PHP與XML輕松共舞。
PHP是一種專為Web設(shè)計(jì)的絕佳腳本語(yǔ)言。XML是表示W(wǎng)eb內(nèi)容的標(biāo)準(zhǔn)。兩者聯(lián)手真是要多美有多美!
下面我會(huì)給讀者演示一個(gè)簡(jiǎn)單的示例,通過(guò)這個(gè)例子即可說(shuō)明如何用PHP把XML文檔解析為HTML。然后我會(huì)介紹一些PHP的其他XML概念。用PHP解析XML很簡(jiǎn)單,操作起來(lái)很直觀但卻需要對(duì)細(xì)節(jié)有所解釋。一旦真正掌握了應(yīng)用的要領(lǐng),你肯定會(huì)驚奇自己怎么不早想到把它們倆攏一塊兒來(lái)。
概述
PHP用expat這種XML工具包,通過(guò)C語(yǔ)言來(lái)解析XML。這個(gè)工具包的函數(shù)集同Perl XML解析所采用的函數(shù)集是一樣的,此外,這種工具包還是事件驅(qū)動(dòng)型的解析器。這就是說(shuō),expat把每個(gè)XML標(biāo)簽或者新一行代碼當(dāng)作事件的起始,而事件就是函數(shù)的觸發(fā)器。Expat的安裝非常簡(jiǎn)單,如果你正在用著Apache Web服務(wù)器,那么你可以在PHP XML參考頁(yè)上找到安裝和下載指南。
用PHP解析XML的基本任務(wù)是這樣的:首先,創(chuàng)建XML解析器的一個(gè)實(shí)例。接著,定義處理觸發(fā)事件的函數(shù),比如開始或者結(jié)束標(biāo)簽等。隨后,定義實(shí)際意義的數(shù)據(jù)處理程序。最后,打開XML文件,讀取文件數(shù)據(jù)并解析數(shù)據(jù)。之后關(guān)閉文件釋放XML解析器。
你瞧,就像我說(shuō)的那樣,這套操作過(guò)程沒(méi)什么特別的。不過(guò),在我們討論具體的示例之前先了解以下的一些警示:
Expat不對(duì)XML進(jìn)行檢驗(yàn)。這意味著只要XML文件格式正確——所有的元素嵌套得當(dāng)、開始和關(guān)閉標(biāo)簽沒(méi)有任何錯(cuò)誤——它就會(huì)被解析。Expat可不管XML是否遵守XML文件頭中引用的標(biāo)準(zhǔn)或者定義。
Expat把XML標(biāo)簽全部轉(zhuǎn)換為大寫字母。如果你的腳本在標(biāo)簽名和其他內(nèi)容上大小寫字母混用可就要小心了。
PHP是在magic quotes設(shè)置啟用的情況下編譯而成,那么復(fù)雜的XML文件不會(huì)得到正確的解析。要是magic quotes不是默認(rèn)設(shè)置,你就當(dāng)我沒(méi)說(shuō)。
好了,我們現(xiàn)在就來(lái)看看有關(guān)的示例!
基本示例
為了把復(fù)雜的事情簡(jiǎn)單化,我在例子中省略了錯(cuò)誤檢查和其他一些不必要的東西,當(dāng)然,你可以在自己的代碼隨心所欲。我假定你早就熟悉PHP及其語(yǔ)法,而我會(huì)對(duì)XML函數(shù)做一番解釋。首先我會(huì)說(shuō)明腳本程序的含義,接著定義用戶定義函數(shù),實(shí)際上這些函數(shù)位于引用它們的代碼之前。相關(guān)附件:程序清單A 所示為腳本的完整代碼,腳本要解析的XML文檔則是 相關(guān)附件:程序清單B。處理之后的輸出結(jié)果如表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的輸出結(jié)果
首先我創(chuàng)建了XML解析器的一個(gè)實(shí)例:
$parser = xml_parser_create();
接著,我定義解析器遭遇開始和結(jié)束標(biāo)簽時(shí)的操作。注意“startElement”和“endElement”是用戶定義的函數(shù),當(dāng)然你可以按照自己的喜好給它們起個(gè)其他名字,但我起的這些名字可是標(biāo)準(zhǔn)的習(xí)慣要求。
xml_set_element_handler($parser, “startElement”, “endElement”);
然后我定義了數(shù)據(jù)操作。這里的“characterData”也是用戶定義的函數(shù),名字也是習(xí)慣性的。
xml_set_character_data_handler($parser, “characterData”);
現(xiàn)在打開文件讀取數(shù)據(jù)。你可以在這里開始編寫錯(cuò)誤處理代碼,我在例子中省略了這些錯(cuò)誤處理。不要忘了在腳本的開頭定義$xml_file。
$filehandler = fopen($xml_file, “r”);
我開始讀取文件內(nèi)容,一次讀4K字節(jié)并放在變量“$data”內(nèi)直到文件末尾。我用xml_parse解析讀取的這些數(shù)據(jù)段。
while ($data = fread($filehandler, 4096)) {
xml_parse($parser, $data, feof($filehandler));
}
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)