使用perl进行XML解析

sma*_*ape 1 perl

我试图研究我所遇到的简单问题但却做不到.我试图从Web获取XML格式的数据并使用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}, ' $$ ';
     } 
Run Code Online (Sandbox Code Playgroud)

另外,我可以做一些事情,以便在最后一个元素之后不会打印分隔符$$吗?我也尝试了以下代码:

$mesh = $data->{PubmedArticle}->{MedlineCitation}->{MeshHeadingList}->{MeshHeading};
while (my ($key, $value) = each(%$mesh)){
    print FH "$value";
}
Run Code Online (Sandbox Code Playgroud)

但是,这会打印所有的子节点,我只想要内容节点.

unp*_*nic 5

Perl XML::Simple将采用单个项目并将其作为标量返回,如果值重复,则将其作为数组引用发回.因此,要使代码正常工作,您必须强制MeshHeading始终返回数组引用:

$data = $xml->XMLin("$dataxml", ForceArray => [qw( MeshHeading )]);
Run Code Online (Sandbox Code Playgroud)