用PHP工具包expat解析XML_PHP

來源:互聯網
上載者:User
關鍵字 解析 工具 xml 函數 php 定義 檔案
如今人人鼓吹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遇到這樣的開始標籤,“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 “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解析有關的函數。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為中心的天性促使它們聯合起來成為動態內容所需的理想解決方案。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.