【问题标题】:Dereferencing in XML::Atom::FeedXML::Atom::Feed 中的取消引用
【发布时间】:2014-10-04 16:07:32
【问题描述】:

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

【问题讨论】:

    标签: perl


    【解决方案1】:

    XML::Atom 的文档并不十分完整。一旦你弄清楚它,它就是一个很好的模块集合。无论如何,链接是具有各种可用方法的祝福对象,包括href

    尝试类似:

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

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

    【讨论】:

    • 我接受了您的回答,因为您首先提供了href() 方法的正确实现和源代码。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,现在我知道了,我之前找不到任何文档。谢谢。
    • $_XML::Atom::Entry,而不是 XML::Atom::Feed。 (尽管碰巧,link() 方法的行为在两者中是相同的,因为它们从抽象基类继承它。)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2011-06-16
      • 1970-01-01
      • 2010-12-26
      相关资源
      最近更新 更多