Быстрый вопрос о разборе XML - PullRequest
0 голосов
/ 21 июля 2011

это может быть глупый вопрос, но я его не понимаю. Я перепробовал все способы, возможно, я где-то совершаю глупую ошибку. Я все еще учусь парсингу. Ваша помощь, несомненно, поможет мне расширить мои знания. Я хочу извлечь имя и фамилию авторов из списка авторов. Я пытался написать код, но не уверен, прав ли я.

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 Ответ

2 голосов
/ 21 июля 2011

Вы вынуждены использовать первую ссылку на массив для 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}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...