用php5的simplexml解析各種feed

  用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']);