2014-10-04 32 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; 
}