<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    博學而篤志,好問而近思

    用PHP解析器expat解析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。這些例子提出了本文沒有提到的其他一些概念以及處理文件錯誤的某些技術。

    posted on 2006-06-22 23:27 冰川 閱讀(1913) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2006年6月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    導航

    統計

    常用鏈接

    留言簿(14)

    隨筆檔案

    BlogJava的幫助

    朋友的博客

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    快樂工作—享受生活
    主站蜘蛛池模板: 亚洲人成色4444在线观看| 99久久亚洲综合精品成人网| 亚洲精品日韩一区二区小说| 国产卡一卡二卡三免费入口| 久久精品国产亚洲AV香蕉| 免费观看成人久久网免费观看| 国产成人亚洲综合无码精品| 在线看片免费人成视频福利| 亚洲国产a∨无码中文777| 久久久久久国产精品免费免费男同 | 无码国模国产在线观看免费| 亚洲av成人无码网站…| 人人狠狠综合久久亚洲高清| 久香草视频在线观看免费| 亚洲伊人久久大香线蕉综合图片| 久久99毛片免费观看不卡| 亚洲国产高清人在线| 美女网站免费福利视频| 亚洲日韩一区二区一无码| 亚洲国产成人a精品不卡在线| 国产免费久久精品99久久| 亚洲AV无码专区亚洲AV伊甸园| 免费av片在线观看网站| 亚洲色成人网一二三区| 最近免费中文字幕视频高清在线看 | 亚洲日本国产综合高清| 成年性羞羞视频免费观看无限| 国产AV无码专区亚洲AV蜜芽| 久久精品国产精品亚洲人人| 国精产品一区一区三区免费视频 | 亚洲国产精品成人久久| 蜜桃AV无码免费看永久| jizzjizz亚洲日本少妇| 亚洲无av在线中文字幕| 免费v片在线观看视频网站| 亚洲精品亚洲人成在线| 亚洲精品字幕在线观看| 99久久99久久精品免费看蜜桃| 日韩大片在线永久免费观看网站 | 亚洲精品V欧洲精品V日韩精品| 国产成人免费高清激情明星|