2011-07-21 63 views
0

這可能是一個愚蠢的問題,但我沒有得到它。我嘗試了各種方法,也許我在某個地方犯了一個愚蠢的錯誤。我仍然在學習解析。你的幫助肯定會幫助我提高自己的知識水平。我想從作者列表中提取作者的姓氏和姓氏。我試圖寫代碼,但不知道我是否正確。關於XML解析的快速提問

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}}; 

這給了我姓氏,但我想forename像'Atul J Butte'。另外,因爲這是任何這樣的XML文件的通用代碼,提及[0]是否正確?如果它在其他xml文件的不同位置呢?有沒有其他方法可以做到這一點? 謝謝。

+0

我得到一個錯誤(400 ,錯誤的請求)當我嘗試的URL – mirod

+0

@ mirod謝謝你的幫助。但是,鏈接絕對正確。我不明白你爲什麼得到這個錯誤。無論如何,我得到了下面的解決方案。感謝您的幫助。 – smandape

回答

2

由於您設置了ForceArray => ... AuthorList,您不得不使用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 

注意$數據 - > {FOO} - > {條}相當於$數據 - > {FOO} {條}

+0

非常感謝。 – smandape

+0

順便說一句,你如何認識到什麼部分強制和什麼不強制。應該認爲樹的什麼級別被強制?因爲要獲得MeSH術語我強制Meshheading。我只是想知道,我應該在樹的哪個層次上下功夫? – smandape

+0

在本例中'Author'和'MeshHeading'都會自動轉換爲'array refs'而沒有'ForceArray'選項。但是你仍然應該指定這個,這樣只有1個作者的文章仍然會變成一個數組。因爲你不需要容器類的數組,所以這兩個容器類都應該被忽略;你想要一個數組中的值。希望這可以稍微清理一下。 – CoffeeMonster