XML :: FeedPP和访问media:* property

时间:2016-02-19 03:42:02

标签: perl xml-parsing

我正在尝试解析youtube xml Feed并想要访问Feed中的某些媒体元素。

我可以访问 title link 等基本元素,但访问 media:group 下的任何内容都会返回空字符串。

enter image description here

use XML::FeedPP; 
my $feed = XML::FeedPP->new("https://www.youtube.com/feeds/videos.xml\?channel_id\=UCzJuUAme9EABE1quatA8z-Q"); 

foreach my $item ( $feed->get_item() ) { 
    print $item->get("media:group") . "\n";
}

有关如何访问媒体:群组及其子元素的任何建议?

1 个答案:

答案 0 :(得分:1)

使用Data :: Printer检查该Feed中的$item个对象,表明对象知道media:group命名空间中的media:和其他内容。

use strict;
use warnings;
use Data::Printer;
use XML::FeedPP;
my $feed = XML::FeedPP->new("https://www.youtube.com/feeds/videos.xml?channel_id=UCzJuUAme9EABE1quatA8z-Q");

foreach my $item ( $feed->get_item() ) {
    p $item;
}

__END__
XML::FeedPP::Atom::Atom10::Entry  {
    Parents       XML::FeedPP::Atom::Common::Entry
    public methods (6) : category, description, get_pubDate_native, link, pubDate, title
    private methods (0)
    internals: {
        author         {
            name   "Fun to Origami",
            uri    "http://www.youtube.com/channel/UCzJuUAme9EABE1quatA8z-Q"
        },
        id             "yt:video:332UeGpfY3E",
        link           {
            -href   "http://www.youtube.com/watch?v=332UeGpfY3E",
            -rel    "alternate"
        },
        media:group    {
            media:community     {
                media:starRating   {
                    -average   4.56,
                    -count     9,
                    -max       5,
                    -min       1
                },
                media:statistics   {
                    -views   940
                }
            },
            media:content       {
                -height   390,
                -type     "application/x-shockwave-flash",
                -url      "https://www.youtube.com/v/332UeGpfY3E?version=3",
                -width    640
            },
            media:description   "...",
            media:thumbnail     {
                -height   360,
                -url      "https://i4.ytimg.com/vi/332UeGpfY3E/hqdefault.jpg",
                -width    480
            },
            media:title         "Origami Pteranodon : Paper Dinosaur Tutorial"
        },
        published      "2015-02-20T01:22:36+00:00",
        title          "Origami Pteranodon : Paper Dinosaur Tutorial",
        updated        "2016-02-15T13:42:07+00:00",
        yt:channelId   "UCzJuUAme9EABE1quatA8z-Q",
        yt:videoId     "332UeGpfY3E"
    }
}

资料来源:Youtube,Omission mine

因此最明显的方法是直接访问数据结构。当然你不想那样做,因为它的风格很糟糕,底层实现可能会改变

foreach my $item ( $feed->get_item() ) {
    say $item->{'media:group'}->{'media:content'}->{'-height'};
}

__END__
390
...

如果这是一次只运行一次的脚本,请停在这里。

现在有趣的部分开始了。 $itemXML::FeedPP::Atom::Atom10::EntryXML::FeedPP::ItemXML::FeedPP::Element。那个人has a method get。看起来处理:部分不会有问题,但它会返回undef.

该模块似乎已经过广泛测试。有一个11_media.t实际上与media:命名空间一起玩。然而,在那里的例子中,它不仅可能工作(或者我不能安装模块),但它也有点不同。 media:元素不是很深。它只是一个带有属性的标签。

从这一点开始,请随意进行研究。