PHP 中的 SimpleXML 處理
了解和 PHP 版本 5 捆綁到一起的 SimpleXML 擴(kuò)展,它使 PHP 頁(yè)面能夠以 PHP 友好的語(yǔ)法來(lái)查詢、搜索、修改和重新發(fā)布 XML。
PHP 版本 5 引入了 SimpleXML,一種用于讀寫 XML 的新的應(yīng)用程序編程接口(API)。在 SimpleXML 中,下面的這樣的表達(dá)式:
$doc->rss->channel->item->title
從文檔中選擇元素。只要熟悉文檔的結(jié)構(gòu),很容易編寫這種表達(dá)式。但是,如果不很清楚需要的元素出現(xiàn)在何處(比如 Docbook、HTML 和類似的敘述性文檔中),SimpleXML 可以使用 XPath 表達(dá)式尋找這些元素。
開(kāi)始使用 SimpleXML
假設(shè)需要一個(gè) PHP 頁(yè)面將 RSS 提要(feed)轉(zhuǎn)化成 HTML。RSS 是一種簡(jiǎn)單的 XML 格式用于發(fā)布連鎖內(nèi)容。文檔的根元素是 rss,它包括一個(gè) channel 元素。channel 元素包含關(guān)于提要的元數(shù)據(jù),如標(biāo)題、語(yǔ)言和 URL。它還包含各種封裝在 item 元素中的報(bào)道。每個(gè) item 都有一個(gè) link 元素,包括一個(gè) URL,還有 title 或 description(通常兩者都有),包含普通文本。不使用名稱空間。RSS 的內(nèi)容當(dāng)然不止這些,不過(guò)對(duì)本文來(lái)說(shuō)知道這些就足夠了。清單 1 顯示了一個(gè)典型的例子,它包含兩個(gè)新聞項(xiàng)。
清單 1. RSS 提要
<?xml version='1.0' encoding='UTF-8'?><rss version='0.92'><channel> <title>Mokka mit Schlag</title> <link>http://www.elharo.com/blog</link> <language>en</language> <item> <title>Penn Station: Gone but not Forgotten</title> <description> The old Penn Station in New York was torn down before I was born. Looking at these pictures, that feels like a mistake.; The current site is functional, but no more; really just some office towers and underground corridors of no particular interest or beauty. The new Madison Square... </description> <link>http://www.elharo.com/blog/new-york/2006/07/31/penn-station</link> </item> <item> <title>Personal for Elliotte Harold</title> <description>Some people use very obnoxious spam filters that require you to type some random string in your subject such as E37T to get through. Needless to say neither I nor most other people bother to communicate with these paranoids. They are grossly overreacting to the spam problem. Personally I won't ...</description>
<link>http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/</link> </item></channel></rss>
我們來(lái)開(kāi)發(fā)一個(gè) PHP 頁(yè)面將 RSS 提要格式化為 HTML。清單 2 顯示了這個(gè)頁(yè)面的基本結(jié)構(gòu)。
清單 2. PHP 代碼的靜態(tài)結(jié)構(gòu)
<?php // Load and parse the XML document ?><html xml:lang='en' lang='en'><head> <title><?php // The title will be read from the RSS ?></title></head><body>
<h1><?php // The title will be read from the RSS again ?></h1>
<?php// Here we'll put a loop to include each item's title and description?>
</body></html>
解析 XML 文檔
第一步是解析 XML 文檔并保存到變量中。只需要一行代碼,向 simplexml_load_file() 函數(shù)傳遞一個(gè) URL 即可:
$rss = simplexml_load_file('http://partners.userland.com/nytRss/nytHomepage.xml');
對(duì)于這個(gè)例子,我已經(jīng)從 Userland 的 New York Times 提要(在 http://partners.userland.com/nytRss/nytHomepage.xml)填充了頁(yè)面。當(dāng)然,也可使用其他 RSS 提要的任何 URL。
要注意,雖然名稱為 simplexml_load_file(),該函數(shù)實(shí)際上解析遠(yuǎn)程 HTTP URL 上的 XML 文檔。但這并不是該函數(shù)唯一令人感到奇怪的地方。返回值(這里存儲(chǔ)在 $rss 變量中)并沒(méi)有指向整個(gè)文檔,如果使用過(guò)其他 API 如文檔對(duì)象模型(DOM)您可能會(huì)這樣期望。相反,它指向文檔的根元素。從 SimpleXML 不能訪問(wèn)文檔序言和結(jié)語(yǔ)部分的內(nèi)容。
尋找提要標(biāo)題
整個(gè)提要的標(biāo)題(不是提要中各報(bào)道的標(biāo)題)位于 rss 根元素 channel 的 title 孩子中。很容易找到這個(gè)標(biāo)題,就仿佛 XML 文檔是類 rss 的一個(gè)對(duì)象的序列化形式,它的 channel 字段本身帶有一個(gè) title 字段。使用常規(guī) PHP 對(duì)象引用語(yǔ)法,尋找標(biāo)題的語(yǔ)句如下:
$title = $rss->channel->title;
找到之后可以將其添加到輸出 HTML 中。這樣做很簡(jiǎn)單,只要回顯 $title 變量即可:
<title><?php echo $title; ?></title>
這一行輸出元素的字符串值而不是整個(gè)元素。就是說(shuō)寫入文本內(nèi)容但不包括標(biāo)簽。
甚至可以完全跳過(guò)中間變量 $title:
<title><?php echo $rss->channel->title; ?></title>
因?yàn)樵擁?yè)面在多處重用這個(gè)值,我發(fā)現(xiàn)用一個(gè)含義明確的變量來(lái)存儲(chǔ)會(huì)更方便。
……
