我试图研究我所遇到的简单问题但却做不到.我试图从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)
但是,这会打印所有的子节点,我只想要内容节点.
Perl XML::Simple将采用单个项目并将其作为标量返回,如果值重复,则将其作为数组引用发回.因此,要使代码正常工作,您必须强制MeshHeading始终返回数组引用:
$data = $xml->XMLin("$dataxml", ForceArray => [qw( MeshHeading )]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1020 次 |
| 最近记录: |