博客首页 注册 建议与交流 排行榜 加入友情链接         宝宝相册的专门空间
推荐 投诉 搜索: 帮助

剑心通明的资料库

文章均为转载,本人不负因参考它所导致的一切后果,请谨慎参考!如您的文章不愿被转载,请点击此处联系本人!
  jxtm.cublog.cn

关于作者
姓名:剑心通明
职业:高级工程师(专修灵魂^_^)
年龄:20出头30不到
位置:网络上一节点
个性介绍:努力学习每一天!
倾心打造:http://www.bsdlover.cn
http://bbs.bsdlover.cn
BSD爱好者的乐园!
|| << >> ||
我的分类


用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元素的例子:

CODE:
  1. $atom =  simplexml_load_file('http://www.ooso.net/index.php/feed/atom');
  2. $atom->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');
  3. $titles = $atom->xpath('//atom:title');
  4. foreach ($titles as $title)
  5.   echo "<h2>" . $title . "</h2>";

用simplexml处理rss数据

wordpress可以输出rss2的数据源,这里面也有一些不同的namespace,比如dc。一个使用simplexml解析rss2的例子:

PHP:
  1. $ns = array (
  2.         'content' => 'http://purl.org/rss/1.0/modules/content/',
  3.         'wfw' => 'http://wellformedweb.org/CommentAPI/',
  4.         'dc' => 'http://purl.org/dc/elements/1.1/'
  5. );
  6.  
  7. $articles = array();
  8.  
  9. // step 1: 获得feed
  10. $blogUrl = 'http://www.ooso.net/index.php/feed/rss2';
  11. $xml = simplexml_load_url($blogUrl);
  12.  
  13. // step 2: 获得channel metadata
  14. $channel = array();
  15. $channel['title']       = $xml->channel->title;
  16. $channel['link']        = $xml->channel->link;
  17. $channel['description'] = $xml->channel->description;
  18. $channel['pubDate']     = $xml->pubDate;
  19. $channel['timestamp']   = strtotime($xml->pubDate);
  20. $channel['generator']   = $xml->generator;
  21. $channel['language']    = $xml->language;
  22.  
  23. // step 3: 获得articles
  24. foreach ($xml->channel->item as $item) {
  25.         $article = array();
  26.         $article['channel'] = $blog;
  27.         $article['title'] = $item->title;
  28.         $article['link'] = $item->link;
  29.         $article['comments'] = $item->comments;
  30.         $article['pubDate'] = $item->pubDate;
  31.         $article['timestamp'] = strtotime($item->pubDate);
  32.         $article['description'] = (string) trim($item->description);
  33.         $article['isPermaLink'] = $item->guid['isPermaLink'];
  34.  
  35.         // get data held in namespaces
  36.         $content = $item->children($ns['content']);
  37.         $dc      = $item->children($ns['dc']);
  38.         $wfw     = $item->children($ns['wfw']);
  39.  
  40.         $article['creator'] = (string) $dc->creator;
  41.         foreach ($dc->subject as $subject)
  42.                 $article['subject'][] = (string)$subject;
  43.  
  44.         $article['content'] = (string)trim($content->encoded);
  45.         $article['commentRss'] = $wfw->commentRss;
  46.  
  47.         // add this article to the list
  48.         $articles[$article['timestamp']] = $article;
  49. }

这个例子中,使用children方法来获得名称空间中的数据:

PHP:
  1. $dc      = $item->children($ns['dc']);

发表于: 2008-05-17,修改于: 2008-05-17 18:44,已浏览182次,有评论0条 推荐 投诉


网友评论
 发表评论