熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用PHP工具包expat解析XML

2013-11-13 09:49:11  來源: .NET編程 

如今人人鼓吹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 threepart series Ill 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 XMLs attendant technologies data type definition (DTD)
Remedial XML: Using XML Schema            In this article well 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 its time to put on your programmers hat and get acquainted with Document Object Model (DOM) which provides easy access to XML documents via a treelike set of objects
Remedial XML: Learning to play SAX            In this fifth installment in our Remedial XML series Ill introduce you to the SAX API and provide some links to SAX implementations in several languages
表A  PHP解析XML的輸出結果
首先我創建了XML解析器的一個實例
$parser = xml_parser_create();
接著我定義解析器遭遇開始和結束標簽時的操作注意startElementendElement是用戶定義的函數當然你可以按照自己的喜好給它們起個其他名字但我起的這些名字可是標准的習慣要求
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函數下面我再具體解釋下其中用到的個用戶定義函數它們就是startElementendElementcharacterData
只要xml_parse遇到這樣的開始標簽startElement函數就由XML解析器調用在我們的例子中解析器就是$parser該函數是必須定義的函數它擁有個自動傳遞給它的參數XML解析器實例大寫的元素名稱比如URL以及該元素所具有的屬性數組在以上示例中XML文件中的元素沒有屬性集合所以數組參數為空但這個參數還是必須存在的
就這個例子而言我決定在一個HTML表中顯示我的XML數據如上所示出於簡化的緣故我沒有編寫錯誤處理代碼這裡我耍了個障眼法因為我知道XML文件中標簽出現的順序否則我可以用startElementcharacterDataendElement函數來定義數組然後用單獨的函數顯示結果
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()—這個函數用來略過startElementcharacterDataendElement函數的調用而把數據直接放進數組
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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.