【问题标题】:XML::Simple not grabbing individual XML nodesXML::Simple 不抓取单个 XML 节点
【发布时间】:2012-12-03 15:10:36
【问题描述】:

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

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}

【问题讨论】:

  • XML::Simple 模块通过排在第一位建立了它的命名空间,我很遗憾新程序员仍然因为它的标签而选择使用它。它的作者已经投入了大量的工作来改进它,但它仍然无法正确区分元素和属性,并且不能始终如一地保留 XML 文档中元素的顺序。它对处理指令、实体、命名空间、CDATA、PCDATA、cmets 等的处理不当。请使用XML::Simple如果您的 XML 数据是微不足道的并且知道您在做什么。
  • 我想我并不总是知道自己在做什么,尤其是使用 Perl。你能推荐最好的替代品吗?
  • XML::LibXML、XML::Twig 或 XML::Rules 是当今流行的选择

标签: perl xml-parsing mediawiki-api


【解决方案1】:

专业提示:使用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 之类的东西,这样可以更轻松地进行此类搜索。

【讨论】:

  • 我为之前的评论道歉 - 我一定做错了什么,现在它正在工作。谢谢! Data::Dumper 也很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多