免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
用PHP讀取和編寫XML DOM
PHP 讀取和編寫可擴(kuò)展標(biāo)記語言(XML)看起來可能有點恐怖。實際上,XML 和它的所有相關(guān)技術(shù)可能是恐怖的,但是用 PHP 讀取和編寫 XML 不一定是項恐怖的任務(wù)。首先,需要學(xué)習(xí)一點關(guān)于 XML 的知識 —— 它是什么,用它做什么。然后,需要學(xué)習(xí)如何用 PHP 讀取和編寫 XML,而有許多種方式可以做這件事。

  本文提供了 XML 的簡短入門,然后解釋如何用 PHP 讀取和編寫 XML。

  什么是 XML?

  XML 是一種數(shù)據(jù)存儲格式。它沒有定義保存什么數(shù)據(jù),也沒有定義數(shù)據(jù)的格式。XML 只是定義了標(biāo)記和這些標(biāo)記的屬性。格式良好的 XML 標(biāo)記看起來像這樣:

<name>Jack Herrington</name>

  這個 <name> 標(biāo)記包含一些文本:Jack Herrington。

  不包含文本的 XML 標(biāo)記看起來像這樣:

<powerUp />

  用 XML 對某件事進(jìn)行編寫的方式不止一種。例如,這個標(biāo)記形成的輸出與前一個標(biāo)記相同:

<powerUp></powerUp>

  也可以向 XML 標(biāo)記添加屬性。例如,這個 <name> 標(biāo)記包含 first 和 last 屬性:

<name first="Jack" last="Herrington" />

  也可以用 XML 對特殊字符進(jìn)行編碼。例如,& 符號可以像這樣編碼:

  &

  包含標(biāo)記和屬性的 XML 文件如果像示例一樣格式化,就是格式良好的,這意味著標(biāo)記是對稱的,字符的編碼正確。清單 1 且環(huán)莞袷攪己玫?XML 的示例。

  清單 1. 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>            

  清單 1 中的 XML 包含一個圖書列表。父標(biāo)記 <books> 包含一組 <book> 標(biāo)記,每個 <book> 標(biāo)記又包含 <author>、<title> 和 <publisher> 標(biāo)記。

  當(dāng) XML 文檔的標(biāo)記結(jié)構(gòu)和內(nèi)容得到外部模式文件的驗證后,XML 文檔就是正確的。模式文件可以用不同的格式指定。對于本文來說,所需要的只是格式良好的 XML。

  如果覺得 XML 看起來很像超文本標(biāo)記語言(HTML),那么就對了。XMLHTML 都是基于標(biāo)記的語言,它們有許多相似之處。但是,要著重指出的是:雖然 XML 文檔可能是格式良好的 HTML,但不是所有的 HTML 文檔都是格式良好的 XML。換行標(biāo)記(br)是 XMLHTML 之間區(qū)別的一個好例子。這個換行標(biāo)記是格式良好的 HTML,但不是格式良好的 XML

<p>This is a paragraph<br>
With a line break</p>

  這個換行標(biāo)記是格式良好的 XMLHTML

<p>This is a paragraph<br />
With a line break</p>

  如果要把 HTML 編寫成同樣是格式良好的 XML,請遵循 W3C 委員會的可擴(kuò)展超文本標(biāo)記語言(XHTML)標(biāo)準(zhǔn)(參見 參考資料)。所有現(xiàn)代的瀏覽器都能呈現(xiàn) XHTML。而且,還可以用 XML 工具讀取 XHTML 并找出文檔中的數(shù)據(jù),這比解析 HTML 容易得多。

  使用 DOM 庫讀取 XML

  讀取格式良好的 XML 文件最容易的方式是使用編譯成某些 PHP 安裝的文檔對象模型 (DOM)庫。DOM 庫把整個 XML 文檔讀入內(nèi)存,并用節(jié)點樹表示它,如圖 1 所示。

  圖 1. 圖書 XMLXML DOM 樹


  樹頂部的 books 節(jié)點有兩個 book 子標(biāo)記。在每本書中,有 author、publisher 和 title 幾個節(jié)點。author、publisher 和 title 節(jié)點分別有包含文本的文本子節(jié)點。

  讀取圖書 XML 文件并用 DOM 顯示內(nèi)容的代碼如清單 2 所示。

  清單 2. 用 DOM 讀取圖書 XML

            <?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";            }            ?>            

  腳本首先設(shè)置 g_books 數(shù)組,它在內(nèi)存中容納所有圖書和圖書信息,g_elem 變量保存腳本目前正在處理的標(biāo)記的名稱。然后腳本定義回調(diào)函數(shù)。在這個示例中,回調(diào)函數(shù)是 startElement、endElement 和 textData。在打開和關(guān)閉標(biāo)記的時候,分別調(diào)用 startElement 和 endElement 函數(shù)。在開始和結(jié)束標(biāo)記之間的文本上面,調(diào)用 textData。

  在這個示例中,startElement 標(biāo)記查找 book 標(biāo)記,在 book 數(shù)組中開始一個新元素。然后,textData 函數(shù)查看當(dāng)前元素,看它是不是 publisher、title 或 author 標(biāo)記。如果是,函數(shù)就把當(dāng)前文本放入當(dāng)前圖書。

  為了讓解析繼續(xù),腳本用 XML_parser_create 函數(shù)創(chuàng)建解析器。然后,設(shè)置回調(diào)句柄。之后,腳本讀取文件并把文件的大塊內(nèi)容發(fā)送到解析器。在文件讀取之后,XML_parser_free 函數(shù)刪除解析器。腳本的末尾輸出 g_books 數(shù)組的內(nèi)容。

  可以看到,這比編寫 DOM 的同樣功能要困難得多。如果沒有 DOM 庫也沒有 SAX 庫該怎么辦?還有替代方案么?

  用正則表達(dá)式解析 XML

  可以肯定,即使提到這個方法,有些工程師也會批評我,但是確實可以用正則表達(dá)式解析 XML。清單 4 顯示了使用 preg_ 函數(shù)讀取圖書文件的示例。

  清單 4. 用正則表達(dá)式讀取 XML
            <?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" );            }            ?>            

  請注意這個代碼有多短。開始時,它把文件讀進(jìn)一個大的字符串。然后用一個 regex 函數(shù)讀取每個圖書項目。最后用 foreach 循環(huán),在每個圖書塊間循環(huán),并提取出 author、title 和 publisher。

  那么,缺陷在哪呢?使用正則表達(dá)式代碼讀取 XML 的問題是,它并沒先進(jìn)行檢查,確保 XML 的格式良好。這意味著在讀取之前,無法知道 XML 是否格式良好。而且,有些格式正確的 XML 可能與正則表達(dá)式不匹配,所以日后必須修改它們。

  我從不建議使用正則表達(dá)式讀取 XML,但是有時它是兼容性最好的方式,因為正則表達(dá)式函數(shù)總是可用的。不要用正則表達(dá)式讀取直接來自用戶的 XML,因為無法控制這類 XML 的格式或結(jié)構(gòu)。應(yīng)當(dāng)一直用 DOM 庫或 SAX 解析器讀取來自用戶的 XML。

 

上一頁  [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();            ?>            

  在腳本的頂部,用一些示例圖書裝入了 books 數(shù)組。這個數(shù)據(jù)可以來自用戶也可以來自數(shù)據(jù)庫。

  示例圖書裝入之后,腳本創(chuàng)建一個 new DOMDocument,并把根節(jié)點 books 添加到它。然后腳本為每本書的 author、title 和 publisher 創(chuàng)建節(jié)點,并為每個節(jié)點添加文本節(jié)點。每個 book 節(jié)點的最后一步是重新把它添加到根節(jié)點 books。

  腳本的末尾用 saveXML 方法把 XML 輸出到控制臺。(也可以用 save 方法創(chuàng)建一個 XML 文件。)腳本的輸出如清單 6 所示。

清單 6. DOM 構(gòu)建腳本的輸出
            % 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>            %            

  使用 DOM 的真正價值在于它創(chuàng)建的 XML 總是格式正確的。但是如果不能用 DOM 創(chuàng)建 XML 時該怎么辦?

  PHP 編寫 XML

  如果 DOM 不可用,可以用 PHP 的文本模板編寫 XML。清單 7 顯示了 PHP 如何構(gòu)建圖書 XML 文件。

清單 7. 用 PHP 編寫圖書 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"            );            ?>            <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>            

  腳本的頂部與 DOM 腳本類似。腳本的底部打開 books 標(biāo)記,然后在每個圖書中迭代,創(chuàng)建 book 標(biāo)記和所有的內(nèi)部 title、author 和 publisher 標(biāo)記。

  這種方法的問題是對實體進(jìn)行編碼。為了確保實體編碼正確,必須在每個項目上調(diào)用 HTMLentities 函數(shù),如清單 8 所示。

清單 8. 使用 HTMLentities 函數(shù)對實體編碼
            <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>            

  這就是用基本的 PHP 編寫 XML 的煩人之處。您以為自己創(chuàng)建了完美的 XML,但是在試圖使用數(shù)據(jù)的時候,馬上就會發(fā)現(xiàn)某些元素的編碼不正確。

  結(jié)束語

  XML 周圍總有許多夸大之處和混淆之處。但是,并不像您想像的那么難 —— 特別是在 PHP 這樣優(yōu)秀的語言中。在理解并正確地實現(xiàn)了 XML 之后,就會發(fā)現(xiàn)有許多強(qiáng)大的工具可以使用。XPath 和 XSLT 就是這樣兩個值得研究的工具。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
AJAX框架匯總
php xmlreader simplexml DOMDocument等讀取xml的例子
PHP XML Expat 解析器
一種基于DOM的Web信息提取方法 - 哈爾濱市道里區(qū)教育信息網(wǎng)
JS 腳本標(biāo)記
dom4j讀取網(wǎng)絡(luò)路徑xml
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服