DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 用PHP工具包expat解析XML
用PHP工具包expat解析XML
編輯:XML詳解     
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”);

我開始讀取文件內容,一次讀4K字節並放在變量“$data”內直到文件末尾。我用XML_parse解析讀取的這些數據段。
while ($data = fread($filehandler, 4096)) {
XML_parse($parser, $data, feof($filehandler));
}

最後進行清空、關閉文件和釋放解析器等操作。
fclose($filehandler);
XML_parser_free($parser);

以上就是腳本中所用到的所有XML函數,下面我再具體解釋下其中用到的3個用戶定義函數,它們就是“startElement”、“endElement”和“characterData”。


只要xml_parse遇到<url>這樣的開始標簽,“startElement”函數就由XML解析器調用,在我們的例子中解析器就是$parser。該函數是必須定義的函數,它擁有3個自動傳遞給它的參數:XML解析器實例、大寫的元素名稱,比如URL以及該元素所具有的屬性數組。在以上示例中,XML文件中的元素沒有屬性集合,所以數組參數為空,但這個參數還是必須存在的。

就這個例子而言,我決定在一個Html表中顯示我的XML數據。如上所示,出於簡化的緣故我沒有編寫錯誤處理代碼。這裡我耍了個障眼法,因為我知道XML文件中標簽出現的順序。否則我可以用“startElement”、“characterData”和“endElement”函數來定義數組,然後用單獨的函數顯示結果。

function startElement($parser_instance, $element_name, $attrs) {
switch($element_name) {
case “URL” : echo “<tr><td><a href=””;
break;
case “SUMMARY” : echo “<td>”;
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 “</a></td>”;
break;
case “SUMMARY” : echo “</td></tr>”;
break;
}
}


用PHP解析XML的輕量鍛煉到這裡就結束了,下面我們開始加些重活。

增加函數

PHP中還有其他一些同XML解析有關的函數。PHP.Net文檔對這些函數進行了完整的說明。我在這裡提到了一些,你或許不久就會用到這些函數:

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為中心的天性促使它們聯合起來成為動態內容所需的理想解決方案。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved