在XML :: Atom :: Feed中取消引用

时间:2014-10-04 16:07:33

标签: perl

Stackoverflow的源是Atom提要,我无法使用XML::RSS本身解析它们,并尝试了当前开发但仍然不成功的其他解析器。我解析feed的最接近的是使用XML::Atom::Feed模块,但无法解开引用条目的链接对象。

use strict;
use warnings;
use feature 'say';
use XML::Atom::Feed;

my $url  = 'http://stackoverflow.com/feeds/tag?tagnames=r&sort=newest';

my $feed = XML::Atom::Feed->new(URI->new($url)) 
                or die XML::Atom::Feed->errstr;

for ($feed->entries) {
  say $_->title, "\n", $_->link;
}

其中输出最新的三十个条目如下:

Rcpp: Returning C array as NumericMatrix to R
XML::Atom::Link=HASH(0x24cbf00)

我知道链接对象是一个哈希引用,但我似乎错过了一些东西。

另外,还有另一个模块可以更好地解析XML Atom提要吗?

3 个答案:

答案 0 :(得分:3)

XML :: Atom没有完全记录。一旦你想出来,这是一个非常好的模块集合。无论如何,链接是具有各种可用方法的祝福对象,包括href

尝试类似:

for ($feed->entries) {
  say $_->title, "\n", $_->link->href;
}

XML::Atom::Link的源代码将向您展示其他可用方法。这很容易理解。

答案 1 :(得分:2)

正如XML::Atom::Feed文档所述,link()方法是上下文敏感的,因此根据您的需要,您可能希望使用标量上下文,通过强制scalar或隐式标量上下文分配给$link

for ($feed->entries) {
  my $link = $_->link;
  say $_->title, "\n", $link->href;
}

答案 2 :(得分:1)

正如the documentation所述,link()方法返回XML::Atom::Link类型的对象。该类的文档不存在,但似乎它有一个href()方法,可以提供您想要的结果。

for ($feed->entries) {
  say $_->title, "\n", $_->link->href;
}