首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用perl进行XML解析

使用perl进行XML解析
EN

Stack Overflow用户
提问于 2011-07-21 06:33:43
回答 4查看 1K关注 0票数 1

我试着研究我有的简单问题,但做不到。我正在尝试从XML格式的web获取数据,并使用perl对其进行解析。现在,我知道了如何循环重复元素。但是,当它不重复的时候,我就卡住了(我知道这可能是愚蠢的)。如果元素重复,我将其放入数组并获取数据。但是,当只有一个元素时,它会抛出错误,并指出“不是数组引用”。我希望我的代码能够同时解析(对于单个元素和多个元素)。我使用的代码如下:

代码语言:javascript
复制
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}, ' $$ ';
     } 

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

代码语言:javascript
复制
$mesh = $data->{PubmedArticle}->{MedlineCitation}->{MeshHeadingList}->{MeshHeading};
while (my ($key, $value) = each(%$mesh)){
    print FH "$value";
}

但是,这会打印所有的子节点,而我只需要内容节点。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-21 06:47:05

Perl的XML::Simple将接受单个项并将其作为标量返回,如果值重复,则将其作为数组引用返回。因此,要使您的代码正常工作,您只需强制MeshHeading始终返回数组引用:

代码语言:javascript
复制
$data = $xml->XMLin("$dataxml", ForceArray => [qw( MeshHeading )]);
票数 5
EN

Stack Overflow用户

发布于 2011-07-21 06:46:32

我想您错过了"perldoc XML::Simple“中关于ForceArray选项的部分:

代码语言:javascript
复制
check out ForceArray because you'll almost certainly want to turn it on

那么您将始终获得一个数组,即使该数组只包含一个元素。

票数 2
EN

Stack Overflow用户

发布于 2011-07-21 08:40:08

正如其他人所指出的,ForceArray选项将解决这个特定的问题。但是,由于XML::Simple的假设与您的不匹配,您很快就会遇到另一个问题。作为XML::Simple的作者,我强烈建议您阅读Stepping up from XML::Simple to XML::LibXML -如果没有其他内容,它将教您更多关于XML::Simple的知识。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6769338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档