2012-12-16 32 views
2

我正在使用MediaWiki API来获取搜索结果。我只想抓取第一个结果的URL,即标记为“Url”的XML元素。最终会有其他的事情我想要用XML来做,但我想在得到这个答案后我会意识到我做错了什么,并能够做其他的事情。 Here是我正在使用的页面。XML ::简单不抓取单个XML节点

require HTTP::Request; 
require LWP::UserAgent; 
require XML::Simple; 

my $url = URI->new("http://en.wikipedia.org/w/api.php?action=opensearch&search=rooney&limit=10&namespace=0&format=xml"); 
my $request = HTTP::Request->new(GET => $url); 
my $ua = LWP::UserAgent->new; 
my $response = $ua->request($request); 

my $xml = XML::Simple->new(); 
my $data = $xml->XMLin($response->content); 

一切都到这里似乎工作正常。我的HTTP请求通过好(如果我只是打印$response->content它返回的XML内容罚款,如果我打印$data,我被告知它是一个散列

为了获得'Url'元素,我试过根据我已经做了搜索各种不同的方法如下几个:

print $data->{'Url'}; 
print $data->{Url}; 
print $data{Url} 
+0

“XML :: Simple”模块通过第一行来建立其命名空间,我很遗憾新程序员仍然选择仅仅因为它的标签而使用它。它的作者已经付出了很多努力来改进它,但它仍然无法正确区分元素和属性,并且不会始终保持XML文档中元素的顺序。它错误地处理了处理指令,实体,命名空间,CDATA,PCDATA,注释等等。如果您的XML数据很琐碎,并且知道您在做什么,请仅使用XML :: Simple * *。 – Borodin

+0

我想我并不总是知道自己在做什么,特别是使用Perl。你能建议最好的选择吗? –

+0

XML :: LibXML,XML :: Twig或XML ::规则是最近流行的选择 – mirod

回答

3

临提示:使用Data::Dumper看看你的数据结构里面

use Data::Dumper; 
print Dumper($data); 

你会得到这样的事情.. 。

$VAR1 = { 
    'xmlns' => 'http://opensearch.org/searchsuggest2', 
    'Section' => { 
    'Item' => [ 
     { 
     'Url' => { 
      'content' => 'http://en.wikipedia.org/wiki/Rooney', 
      'xml:space' => 'preserve' 
     }, 
     'Description' => { 
      'content' => 'Rooney may refer to:', 
      'xml:space' => 'preserve' 
     }, 
     'Text' => { 
      'content' => 'Rooney', 
      'xml:space' => 'preserve' 
     } 
     }, 
... much much more ... 

,从中可以推断出你需要的数据的途径是通过

$data->{Section}{Item}[0]{Url}{content} 

你也应该考虑使用类似XML::XPath,这使得它更容易进行这种搜索。

+0

我对之前的评论表示歉意 - 我必须做错了一切,现在它正在工作。谢谢! 'Data :: Dumper'也很有用。 –