<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> |
<?PHP $doc = new DOMDocument(); $doc->load( ‘books.XML‘ ); $books = $doc->getElementsByTagName( "book" ); foreach( $books as $book ) { $authors = $book->getElementsByTagName( "author" ); $author = $authors->item(0)->nodeValue; $publishers = $book->getElementsByTagName( "publisher" ); $publisher = $publishers->item(0)->nodeValue; $titles = $book->getElementsByTagName( "title" ); $title = $titles->item(0)->nodeValue; echo "$title - $author - $publisher\n"; } ?> |
腳本首先創(chuàng)建一個 new DOMdocument 對象,用 load 方法把圖書 XML 裝入這個對象。之后,腳本用 getElementsByName 方法得到指定名稱下的所有元素的列表。
在 book 節(jié)點的循環(huán)中,腳本用 getElementsByName 方法獲得 author、publisher 和 title 標(biāo)記的 nodeValue。nodeValue 是節(jié)點中的文本。腳本然后顯示這些值。
可以在命令行上像這樣運(yùn)行 PHP 腳本:
% PHP e1.PHP
PHP Hacks - Jack Herrington - O‘Reilly
Podcasting Hacks - Jack Herrington - O‘Reilly
%
可以看到,每個圖書塊輸出一行。這是一個良好的開始。但是,如果不能訪問 XML DOM 庫該怎么辦?
[1] [2] [3] 下一頁
用 SAX 解析器讀取 XML
讀取 XML 的另一種方法是使用 XML Simple API(SAX)解析器。PHP 的大多數(shù)安裝都包含 SAX 解析器。SAX 解析器運(yùn)行在回調(diào)模型上。每次打開或關(guān)閉一個標(biāo)記時,或者每次解析器看到文本時,就用節(jié)點或文本的信息回調(diào)用戶定義的函數(shù)。
SAX 解析器的優(yōu)點是,它是真正輕量級的。解析器不會在內(nèi)存中長期保持內(nèi)容,所以可以用于非常巨大的文件。缺點是編寫 SAX 解析器回調(diào)是件非常麻煩的事。清單 3 顯示了使用 SAX 讀取圖書 XML 文件并顯示內(nèi)容的代碼。
清單 3. 用 SAX 解析器讀取圖書 XML
<?PHP $g_books = array(); $g_elem = null; 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" ); $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"; } ?> |
<?PHP $XML = ""; $f = fopen( ‘books.XML‘, ‘r‘ ); while( $data = fread( $f, 4096 ) ) { $XML .= $data; } fclose( $f ); preg_match_all( "/\<book\>(.*?)\<\/book\>/s", $XML, $bookblocks ); foreach( $bookblocks[1] as $block ) { preg_match_all( "/\<author\>(.*?)\<\/author\>/", $block, $author ); preg_match_all( "/\<title\>(.*?)\<\/title\>/", $block, $title ); preg_match_all( "/\<publisher\>(.*?)\<\/publisher\>/", $block, $publisher ); echo( $title[1][0]." - ".$author[1][0]." - ". $publisher[1][0]."\n" ); } ?> |
上一頁 [1] [2] [3] 下一頁
用 DOM 編寫 XML
讀取 XML 只是公式的一部分。該怎樣編寫 XML 呢?編寫 XML 最好的方式就是用 DOM。清單 5 顯示了 DOM 構(gòu)建圖書 XML 文件的方式。
清單 5. 用 DOM 編寫圖書 XML
<?PHP $books = array(); $books [] = array( ‘title‘ => ‘PHP Hacks‘, ‘a(chǎn)uthor‘ => ‘Jack Herrington‘, ‘publisher‘ => "O‘Reilly" ); $books [] = array( ‘title‘ => ‘Podcasting Hacks‘, ‘a(chǎn)uthor‘ => ‘Jack Herrington‘, ‘publisher‘ => "O‘Reilly" ); $doc = new DOMDocument(); $doc->formatOutput = true; $r = $doc->createElement( "books" ); $doc->appendChild( $r ); foreach( $books as $book ) { $b = $doc->createElement( "book" ); $author = $doc->createElement( "author" ); $author->appendChild( $doc->createTextNode( $book[‘a(chǎn)uthor‘] ) ); $b->appendChild( $author ); $title = $doc->createElement( "title" ); $title->appendChild( $doc->createTextNode( $book[‘title‘] ) ); $b->appendChild( $title ); $publisher = $doc->createElement( "publisher" ); $publisher->appendChild( $doc->createTextNode( $book[‘publisher‘] ) ); $b->appendChild( $publisher ); $r->appendChild( $b ); } echo $doc->saveXML(); ?> |
% PHP e4.PHP <?XML version="1.0"?> <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> % |
<?PHP $books = array(); $books [] = array( ‘title‘ => ‘PHP Hacks‘, ‘a(chǎn)uthor‘ => ‘Jack Herrington‘, ‘publisher‘ => "O‘Reilly" ); $books [] = array( ‘title‘ => ‘Podcasting Hacks‘, ‘a(chǎn)uthor‘ => ‘Jack Herrington‘, ‘publisher‘ => "O‘Reilly" ); ?> <books> <?PHP foreach( $books as $book ) { ?> <book> <title><?PHP echo( $book[‘title‘] ); ?></title> <author><?PHP echo( $book[‘a(chǎn)uthor‘] ); ?> </author> <publisher><?PHP echo( $book[‘publisher‘] ); ?> </publisher> </book> <?PHP } ?> </books> |
<books> <?PHP foreach( $books as $book ) { $title = HTMLentities( $book[‘title‘], ENT_QUOTES ); $author = HTMLentities( $book[‘a(chǎn)uthor‘], ENT_QUOTES ); $publisher = HTMLentities( $book[‘publisher‘], ENT_QUOTES ); ?> <book> <title><?PHP echo( $title ); ?></title> <author><?PHP echo( $author ); ?> </author> <publisher><?PHP echo( $publisher ); ?> </publisher> </book> <?PHP } ?> </books> |