用simplexml處理atom數據很多部落格使用atom來輸出數據,但是atom使用了名稱空間(namespace),所以現在請求被命名的元素和本地名稱時必須指定名稱空間統一資源標識符(URI),還有一點就是simplexml的xpath方法無法直接query這個xml tree。
從PHP 5.1 版開始,SimpleXML 可以直接對帶有名稱空間的文件使用XPath 查詢。和通常一樣,XPath 位置路徑必須使用名稱空間前綴,即使搜尋的文件使用預設名稱空間仍然如此。 registerXPathNamespace() 函數把前綴和後續查詢中使用的名稱空間URL 連結在一起。
以下是使用xpath查詢atom文檔title元素的範例:
PLAIN TEXT
CODE:
$atom = simplexml_load_file('http://www.ooso.net/index.php/feed/atom');
$atom->registerXPathNamespace('atom','http://www.w3.org/2005/Atom');
$titles = $atom->xpath('//atom:title');
foreach($titles as $title)
echo"<h2>". $title ."</h2>";
用simplexml處理rss數據
wordpress可以輸出rss2的資料來源,這裡面也有一些不同的namespace,像是dc。一個使用simplexml解析rss2的例子:
PLAIN TEXT
PHP:
$ns=array(
'content'=>'http://purl.org/rss/1.0/modules/content/',
'wfw'=>'http://wellformedweb.org/CommentAPI/',
'dc'=>'http://purl.org/dc/elements/1.1/'
);
$articles=array();
// step 1: 獲得feed
$blogUrl='http://www.ooso.net/index.php/feed/rss2';
$xml= simplexml_load_url($blogUrl);
// step 2: 取得channel metadata
$channel=array();
$channel['title'] =$xml->channel->title;
$channel['link'] =$xml->channel->link;
$channel['description']=$xml->channel->description;
$channel['pubDate'] =$xml->pubDate;
$channel['timestamp'] =strtotime($xml->pubDate);
$channel['generator'] =$xml->generator;
$channel['language'] =$xml->language;
// step 3: 獲得articles
foreach($xml->channel->itemas$item){
$article=array();
$article['channel']=$blog;
$article['title']=$item->title;
$article['link']=$item->link;
$article['comments']=$item->comments;
$article['pubDate']=$item->pubDate;
$article['timestamp']=strtotime($item->pubDate);
$article['description']=(string)trim($item->description);
$article['isPermaLink']=$item->guid['isPermaLink'];
// get data held in namespaces
$content=$item->children($ns['content']);
$dc =$item->children($ns['dc']);
$wfw =$item->children($ns['wfw']);
$article['creator']=(string)$dc->creator;
foreach($dc->subjectas$subject)
$article['subject'][]=(string)$subject;
$article['content']=(string)trim($content->encoded);
$article['commentRss']=$wfw->commentRss;
// add this article to the list
$articles[$article['timestamp']]=$article;
}
在這個例子中,使用children方法來獲得名稱空間中的資料:
PLAIN TEXT
PHP:
$dc =$item->children($ns['dc']);