XML中的XML :: Smart Parser

时间:2010-03-10 15:51:12

标签: perl xml-parsing

我正在继续使用过时的bioinformatics book,我正在尝试使用XML :: Smart模块。

我怀疑该模块的方法在6年的时间里已经发生了变化,而且我对使用cpan source进行故障排除的perl缺乏经验。注释掉的代码证明了ncbi.gov查询函数,我遇到了'new'方法的问题 - 它没有解析XML。我究竟做错了什么?谢谢!

更新具体来说,我在解析和显示Id数组时遇到了麻烦:my @Id = $results->{eSearchResult}{IdList}{Id}{'@'};我在OSX终端上运行它,当我运行时我看不到任何ID这个脚本。我看到了正确的伯爵。谢谢!

#!/usr/local/bin/perl
# use lib "/Users/fogonthedowns/myperllib";
# use LWP::Simple;
use XML::Smart;
use strict;

#Set base URL for all eutils
my $utils = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils";
my $db = "Pubmed";
my $query ="Cancer+Prostate";
my $retmax = 10;
my $esearch = "$utils/esearch.fcgi?" . 
              "db=$db&retmax=$retmax&term=";

# my $esearch_result = get($esearch.$query);
# print "ESEARCH RESULT: $esearch_result\n";
# print "Using Query: \n$esearch$query\n";
# print "hello world\n";

my $results = XML::Smart->new($esearch.$query,"XML::Parser");
my $count = $results->{eSearchResult}{Count};
my @Id = $results->{eSearchResult}{IdList}{Id}{'@'};
my $all_Id = join("\n", @Id);

print "Count = $count\n";
print "$all_Id\n";

2 个答案:

答案 0 :(得分:2)

您做错的第一件事是评论use strict,第二件事是使用-w代替use warnings

严格打开后,perl会报告:

  

在tmp:test.pl第19行使用“strict subs”时,不允许使用Bareword“XML :: Parser”。

这可以让我们追踪问题发生的位置。

应该引用第二个参数(要使用的解析器)的examples in the documentation say,而你没有引用它。

所以我们改为:

my $results = XML::Smart->new($esearch.$query,"XML::Parser");

......它就会运行。

(顺便提一下,该语言称为"Perl", not "perl" or "PERL"

答案 1 :(得分:-1)

改变:

my @Id = $results->{eSearchResult}{IdList}{Id}{'@'};

到:

my @Id = $results->{eSearchResult}{IdList}{Id}('@');