用 PHP 讀取和編寫 XML

 
用 PHP 讀取和編寫 XML
參考http://www.ibm.com/developerworks/cn/opensource/os-xmldomphp/
PHP中解析XML的主要方法有兩種:使用 DOM 庫和使用 SAX 解析器。
一、讀取解析XML
1、使用 DOM 庫讀取 XML
讀取格式良好的 XML 文件最容易的方式是使用編譯成某些 PHP 安裝的文檔對象模型DOM)庫。DOM 庫把整個 XML 文檔讀入內存,並用節點樹表示它。
2、用 SAX 解析器讀取 XML
讀取 XML 的另一種方法是使用 XML Simple APISAX)解析器。PHP 的大多數安裝都包含 SAX 解析器。SAX 解析器運行在回調模型上。每次打開或關閉一個標記時,或者每次解析器看到文本時,就用節點或文本的信息回調用戶定義的函數。
SAX 解析器的優點是,它是真正輕量級的。解析器不會在內存中長期保持內容,所以可以用於非常巨大的文件。缺點是編寫 SAX 解析器回調是件非常麻煩的事。
 
我使用的是SAX來解析XML,因爲考慮到DOM庫需要構建樹節點,對性能影響可能會比使用SAX較大。
XML 圖書列表示例
 
 <books>
 <book>
 <author>Jack Herrington</author>
 <title>PHP Hacks</title>
 <publisher>O'Reilly</publisher>
 </book>
 <book>
 <author>Jack Herrington</author>
 <title>Podcasting Hacks</title>
 <publisher>O'Reilly</publisher>
 </book>
 </books>
 
處理代碼如下。
SAX 解析器讀取圖書 XML
 
 <?php
 $g_books = array();
 $g_elem = null;
 
//該函數爲讀取一個標籤時作的處理,$name獲取標籤的名稱,該處將標籤名賦給$g_elem,在讀取該標籤內容時作判斷。如果標籤是BOOK就在$g_books []中新增一個元素,$g_books []是一個二維數組
 function startElement( $parser, $name, $attrs )
 {
 global $g_books, $g_elem;
 if ( $name == 'BOOK' ) $g_books []= array();
 $g_elem = $name;
 }
 //在該標籤解析完成時作的處理
 function endElement( $parser, $name )
 {
 global $g_elem;
 $g_elem = null;
 }
 
  //讀取到該標籤內容時作的處理,該處是將內容加到數組中。
 function textData( $parser, $text )
 {
 global $g_books, $g_elem;
 if ( $g_elem == 'AUTHOR' ||
 $g_elem == 'PUBLISHER' ||
 $g_elem == 'TITLE' )
 {
 $g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
 }
 }
 
 //創建解析器
 $parser = xml_parser_create();
 
 xml_set_element_handler( $parser, "startElement", "endElement" );
 xml_set_character_data_handler( $parser, "textData" );
 
//該處我們是直接處理字符串,則不需要讀取文件這一步驟,直接運行//xml_parse( $parser, $data );
 
 $f = fopen( 'books.xml', 'r' );
 
 while( $data = fread( $f, 4096 ) )
 {
 xml_parse( $parser, $data );
 }
 
//釋放
 xml_parser_free( $parser );
 
 //該處根據頁面需要顯示。
 foreach( $g_books as $book )
 {
 echo $book['TITLE']." - ".$book['AUTHOR']." - ";
 echo $book['PUBLISHER']."/n";
 }
 ?>
 
腳本首先設置g_books數組,它在內存中容納所有圖書和圖書信息,g_elem變量保存腳本目前正在處理的標記的名稱。然後腳本定義回調函數。在這個示例中,回調函數是startElementendElementtextData。在打開和關閉標記的時候,分別調用startElementendElement函數。在開始和結束標記之間的文本上面,調用textDatastartElement標記查找book標記,在book數組中開始一個新元素。然後,textData函數查看當前元素,看它是不是publishertitleauthor標記。如果是,函數就把當前文本放入當前圖書。爲了讓解析繼續,腳本用xml_parser_create函數創建解析器。然後,設置回調句柄。之後,腳本讀取文件並把文件的大塊內容發送到解析器。在文件讀取之後,xml_parser_free函數刪除解析器。腳本的末尾輸出g_books數組的內容。
該示例是將內容解析到二維數組後再顯示到頁面中,也可以根據需要在上述回調函數中處理的時候直接輸出頁面。如textData中讀取到內容的時候直接將內容ECHO在頁面上。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章