2014-10-04 101 views
2

Stackoverflow的提要是Atom提要,我无法使用XML::RSS本身解析它们,并尝试了其他目前已开发但仍不成功的解析器。我得到的最接近的分析结果是使用XML::Atom::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; 
} 

哪些最新的30项输出如下:

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

我意识到链接对象是一个散列引用,但我似乎失去了一些东西。

另外,有没有更好的解析XML Atom提要模块?

回答

3

XML :: Atom没有非常全面的文档。一旦你弄明白了,这是相当不错的模块集合。无论如何,链接是有各种方法可用的祝福对象,包括href

尝试类似:

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

XML::Atom::Link的源代码会告诉你可用其他方法。这很容易遵循。

+0

自从您首次提供了正确的'href()实现以来,我接受了您的答案。 '方法和来源。 – hwnd 2014-10-04 16:48:46

2

由于XML::Atom::Feed文档状态,link()方法是上下文敏感的,所以要根据你的需要,你可能想,无论是通过scalar或分配给$link时隐标量上下文强制使用标量上下文,

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

@hwnd你已经知道href()是方法。 – 2014-10-04 16:44:52

+0

是的,现在我可以,我以前找不到任何文档。谢谢。 – hwnd 2014-10-04 16:46:57

+0

'$ _'是[XML :: Atom :: Entry](https://metacpan.org/pod/XML::Atom::Entry),而不是[XML :: Atom :: Feed](https: //metacpan.org/pod/XML::Atom::Feed)。 (尽管正如它发生的那样,link()方法的行为在两者中都是相同的,因为它们从抽象基类中继承它。) – tobyink 2014-10-04 17:29:46

1

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

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