关于XML解析的快速问题

时间:2011-07-21 03:25:37

标签: perl

这可能是一个愚蠢的问题,但我没有得到它。我试过各种各样的方式,也许我在某个地方犯了一个愚蠢的错误。我还在学习解析。你的帮助肯定会帮助我增强知识。我想从作者列表中提取作者的姓名和姓氏。我曾尝试编写代码但不确定我是否正确。

use LWP::Simple;
use XML::Simple;
use Data::Dumper;

open (FH, ">:utf8","xmlparsed1.txt");

my $db1 = "pubmed";
my $q = 16404398;
my $xml = new XML::Simple;
$urlxml = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=$db1&id=$q&retmode=xml&rettype=abstract";
$dataxml = get($urlxml);
$data = $xml->XMLin("$dataxml", ForceArray => [qw( MeshHeading AuthorList )]);
print FH Dumper($data);
print FH "Authors: ".join '$$', map $_->{LastName},@{$data->{PubmedArticle}->{MedlineCitation}->{Article}->{AuthorList}->[0]->{Author}};

这给了我姓氏,但我想要'和'Atul J Butte'这样的名字。另外,因为这是任何这样的xml文件的通用代码,所以提到[0]是正确的吗?如果它在其他一些xml文件中的位置不同怎么办?有没有其他方法可以做到这一点? 谢谢。

1 个答案:

答案 0 :(得分:2)

您被迫使用第一个数组引用作为AuthorList,因为您设置了ForceArray => ... AuthorList

而是尝试:

$data = $xml->XMLin("$dataxml", ForceArray => [qw( MeshHeading Author )]);
...
my $author_list = $data->{PubmedArticle}{MedlineCitation}{Article}{AuthorList}{Author};
foreach my $author ( @$author_list ) {
    print "Author: $author->{LastName}, $author->{ForeName}\n";
}
# Author: Butte, Atul J
# Author: Kohane, Isaac S

请注意,$ data-> {foo} - > {bar}相当于$ data-> {foo} {bar}