了解和PHP 版本5 捆綁到一起的SimpleXML 擴展,它使PHP 頁面能夠以PHP 友好的語法來查詢、搜尋、修改和重新發布XML。
PHP 版本5 引入了SimpleXML,一個用於讀寫XML 的新的應用程式介面(API)。在SimpleXML 中,下面的這樣的表達式:
$doc->rss->channel->item->title
從文件中選擇元素。只要熟悉文件的結構,就很容易寫出這種表達式。但是,如果不很清楚需要的元素出現在何處(例如Docbook、HTML 和類似的敘述性文檔中),SimpleXML 可以使用XPath 表達式尋找這些元素。
開始使用SimpleXML
假設需要一個PHP 頁面將RSS 提要(feed)轉換成HTML。 RSS 是一種簡單的XML 格式用於發布連鎖內容。文件的根元素是rss,它包括一個channel 元素。 channel 元素包含關於提要的元數據,如標題、語言和URL。它還包含各種封裝在item 元素中的報道。每個item 都有一個link 元素,包括一個URL,還有title 或description(通常兩者都有),包含普通文字。不使用名稱空間。 RSS 的內容當然不只這些,不過對本文來說知道這些就夠了。清單1 顯示了一個典型的例子,它包含兩個新聞項目。
清單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>
我們來開發一個PHP 頁面將RSS 提要格式化為HTML。清單2 顯示了這個頁面的基本結構。
清單2. PHP 程式碼的靜態結構
<?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 文件並儲存到變數中。只需要一行程式碼,傳遞一個URL 到simplexml_load_file():
$rss = simplexml_load_file('http://partners.userland.com/nytRss/nytHomepage.xml');
對於這個例子,我已經從Userland 的New York Times 提要(在http://partners.userland.com/nytRss/nytHomepage.xml )填入了頁面。當然,也可使用其他RSS 提要的任何URL。
要注意,雖然名稱為simplexml_load_file(),但該函數實際上解析遠端HTTP URL 上的XML 文件。但這並不是該函數唯一令人感到奇怪的地方。返回值(這裡儲存在$rss 變數中)並沒有指向整個文檔,如果使用過其他API 如文檔物件模型(DOM)您可能會這樣期望。相反,它指向文檔的根元素。從SimpleXML 不能存取文件序言和結語部分的內容。
尋找提要標題
整個提要的標題(不是提要中各報道的標題)位於rss 根元素channel 的title 孩子中。很容易找到這個標題,就彷彿XML 文件是類別rss 的一個物件的序列化形式,它的channel 欄位本身帶有一個title 欄位。使用常規PHP 物件引用語法,尋找標題的語句如下:
$title = $rss->channel->title;
找到之後可以將其加入到輸出HTML 中。這樣做很簡單,只要回顯$title 變數:
<title><?php echo $title; ?></title>
這一行輸出元素的字串值而不是整個元素。是說寫入文字內容但不包括標籤。
甚至可以完全跳過中間變數$title:
<title><?php echo $rss->channel->title; ?></title>
因為該頁面在多處重複使用這個值,我發現用一個含義明確的變數來儲存會更方便。
……