2011-07-21 5 views
0

これは愚かな質問かもしれませんが、私はそれを得ていません。私はあらゆる方法を試しました、多分私はどこかで愚かな間違いをしています。私はまだ解析を学んでいます。あなたの助けが私の知識を向上させるのに役立つはずです。私はauthorlistからforenameとlastnameを抽出したいと思います。私はコードを書こうとしましたが、私が正しいかどうかはわかりません。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}}; 

これは私にラストネームを与えますが、「アトゥルJビュート」のようにforenameも必要とします。また、これはそのようなxmlファイルの一般化されたコードなので、[0]は正しいと言えますか?他のXMLファイルの別の位置にある場合はどうなりますか?これを行う他の方法はありますか? ありがとうございます。

+0

(400 - > {FOO} - > {バーが} $データに相当します、悪い要求)私が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} {バー}

+0

ありがとうございました。 – smandape

+0

BTWどのような部分を強制するのか、そうしない部分をどのように認識していますか?木のどのレベルを強制的に考慮する必要がありますか? MeSH用語を得るために、私はMeshheadingを強制しました。私はちょうどレベルまで私が知っている木の上にforcearrayを置く必要がありますか? – smandape

+0

この例では、 'Authors'と' MeshHeading'の両方が 'ForceArray'オプションなしで' array refs'に自動的に変換されていました。しかし、Authorを1つしか持たない記事はまだ配列に変換されます。これらはどちらも、コンテナクラスの配列を必要としないので無視する必要があるコンテナクラスを持っています。その中に値の配列が必要です。これは少し物事をクリアすることを願っています。 – CoffeeMonster