我试着研究我有的简单问题,但做不到。我正在尝试从XML格式的web获取数据,并使用perl对其进行解析。现在,我知道了如何循环重复元素。但是,当它不重复的时候,我就卡住了(我知道这可能是愚蠢的)。如果元素重复,我将其放入数组并获取数据。但是,当只有一个元素时,它会抛出错误,并指出“不是数组引用”。我希望我的代码能够同时解析(对于单个元素和多个元素)。我使用的代码如下:
use LWP::Simple;
use XML::Simple;
use Data::Dumper;
open (FH, ">:utf8","xmlparsed1.txt");
my $db1 = "pubmed";
my $query = "13054692";
my $q = 16354118; #for multiple MeSH terms
my $xml = new XML::Simple;
$urlxml = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=$db1&id=$query&retmode=xml&rettype=abstract";
$dataxml = get($urlxml);
$data = $xml->XMLin("$dataxml");
#print FH Dumper($data);
foreach $e(@{$data->{PubmedArticle}->{MedlineCitation}->{MeshHeadingList}->{MeshHeading}})
{
print FH $e->{DescriptorName}{content}, ' $$ ';
} 另外,我是否可以做一些事情,使分隔符$$不会在最后一个元素之后打印?我还尝试了以下代码:
$mesh = $data->{PubmedArticle}->{MedlineCitation}->{MeshHeadingList}->{MeshHeading};
while (my ($key, $value) = each(%$mesh)){
print FH "$value";
}但是,这会打印所有的子节点,而我只需要内容节点。
发布于 2011-07-21 06:47:05
Perl的XML::Simple将接受单个项并将其作为标量返回,如果值重复,则将其作为数组引用返回。因此,要使您的代码正常工作,您只需强制MeshHeading始终返回数组引用:
$data = $xml->XMLin("$dataxml", ForceArray => [qw( MeshHeading )]);发布于 2011-07-21 06:46:32
我想您错过了"perldoc XML::Simple“中关于ForceArray选项的部分:
check out ForceArray because you'll almost certainly want to turn it on那么您将始终获得一个数组,即使该数组只包含一个元素。
发布于 2011-07-21 08:40:08
正如其他人所指出的,ForceArray选项将解决这个特定的问题。但是,由于XML::Simple的假设与您的不匹配,您很快就会遇到另一个问题。作为XML::Simple的作者,我强烈建议您阅读Stepping up from XML::Simple to XML::LibXML -如果没有其他内容,它将教您更多关于XML::Simple的知识。
https://stackoverflow.com/questions/6769338
复制相似问题