Добрый день, что-то я туплю наверное. Имеем вот такой RSS (от twitterа)
| Код | <?xml version="1.0" encoding="UTF-8"?> <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com"> <channel> <title>Twitter / USERNAME</title> <link>http://twitter.com/USERNAME</link> <atom:link href="https://twitter.com/statuses/user_timeline/USERNAME.rss" rel="self" type="application/rss+xml"/> <description>Twitter updates fromblablabla</description> <language>en-us</language> <ttl>40</ttl> <item> <title>блаблаблабла</title> <description>блаблаблабла</description> <pubDate>Mon, 23 May 2011 09:15:32 +0000</pubDate> <guid>http://twitter.com/URL</guid> <link>http://twitter.com/URL</link> <twitter:source><a href="http://foursquare.com" rel="nofollow">foursquare</a></twitter:source> <georss:point>57.14987334 65.51693398</georss:point> <twitter:place xmlns:georss="http://www.georss.org/georss"> <twitter:id>37832387adecec</twitter:id> <twitter:name>ТВИТТЕРНАМЕ</twitter:name> <twitter:full_name>ТВИТЕРРФУЛЛНАМЕ</twitter:full_name> <twitter:place_type>city</twitter:place_type> <twitter:url>http://api.twitter.com/1/geo/id/URL</twitter:url> <twitter:attributes/> <twitter:bounding_box> <georss:polygon>56.994673 65.2612523 56.994673 65.8524368 57.3066131 65.8524368 57.3066131 65.2612523</georss:polygon> </twitter:bounding_box> <twitter:country code="RU">Russia</twitter:country> </twitter:place> </item> .. </channel> </rss>
|
парсю с помощью RSS::XML::Parser (крайне желательно юзать его, т.к. если будет другой модуль, придется переписывать в скрипт в других местах)
необходимо получать значение в тегах с двоеточием, для это регистрирую новый namespace и вроде как работает
| Код | #!/usr/bin/perl -w
use strict;
use XML::RSS::Parser; use FileHandle;
XML::RSS::Parser->register_ns_prefix('georss','http://www.georss.org/georss'); # register the geo ns
my $p = XML::RSS::Parser->new; my $fh = FileHandle->new('./myrss.rss'); my $feed = $p->parse_file($fh);
foreach my $i ( $feed->query('//item') ) { my $node = $i->query('georss:point'); if (defined($node)){ print ' '.$node->text_content."\n"} }
|
но если надо спуститься на уровень ниже , в <twitter:place>, то все встает колом
| Код | #!/usr/bin/perl -w
use strict;
use XML::RSS::Parser; use FileHandle;
XML::RSS::Parser->register_ns_prefix('georss','http://www.georss.org/georss'); # register the geo ns XML::RSS::Parser->register_ns_prefix('twitter','http://twitter.com'); # regis/ter the geo ns
my $p = XML::RSS::Parser->new; my $fh = FileHandle->new('./myrss.rss'); my $feed = $p->parse_file($fh);
foreach my $i ( $feed->query('//item') ) { my $node = $i->query('georss:point'); if (defined($node)){ print ' '.$node->text_content."\n"} foreach my $ii ( $feed->query('///twitter:place')) { my $node = $ii->query('twitter:full_name'); if (defined($node)){ print ' '.($node->text_content)."\n"} } }
|
Bad call to match: '/twitter:place' contains unknown token '' at /usr/lib/perl5/site_perl/5.8.8/XML/RSS/Parser/Element.pm line 31
что не так?
|