Как получить атрибуты тега с помощью XML :: Simple? - PullRequest
2 голосов
/ 18 марта 2009

Я просто пытаюсь извлечь атрибут из XML в мою программу Perl. Однако у меня проблемы с получением атрибутов.

Я использую XML :: Simple .

Я могу нормально восстановить информацию, когда XML выглядит следующим образом:

<IdList>
    <Id>17175540</Id>
</IdList>

с использованием этого кода

 $data->{'DocSum'}->{'Id'};

Однако, когда XML выглядит так:

<Item Name="Title" Type="String">
    Some Title
</Item>

Я не получаю никаких данных при использовании следующего кода

$data->{'DocSum'}->{'Title'};

Кстати, по этой ссылке я получаю XML с http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=19288470

Ответы [ 5 ]

4 голосов
/ 18 марта 2009

пробег:

$ perl -MXML::Simple -M'Data::Dump qw/pp/' 
my $ref = XMLin('<Item Name="Title" Type="String">Some Title</Item>');
pp $ref;

выход:

{ Name => "Title", Type => "String", content => "Some Title" }

Итак, похоже, вы должны искать в разделе «контент», чтобы найти его.

3 голосов
/ 18 марта 2009

Я взял xml с той страницы, которую вы предоставили, использовал все это как строку для аргумента XMLin и имел успех с

print $data->{DocSum}->{Item}->[5]->{content};

дает вывод

Разложение бромоксинила в илово-суглинистой почве Миссисипи.

Это почти то же самое, что говорил Дероберт.

Edit:

Вместо того, чтобы предполагать, что шестой элемент Item является тем, который вам нужен, чтобы напечатать содержимое узла, где атрибут Name имеет значение «Title» (и затем выйти из цикла, поскольку вы нашли то, что хотите):

foreach my $item_node (@{$data->{DocSum}->{Item}})
{
    if($item_node->{Name} eq 'Title')
    {
        print $item_node->{content};
        last;
    }
}

Конечно, это все еще только просмотр узлов Item непосредственно под DocSum, поэтому, если вы искали PubType вместо Title, он не будет найден из-за того, что он является дочерним для узла PubTypeList Item. *

2 голосов
/ 18 марта 2009

Но, конечно, «Заголовок» - это не ключ, а значение атрибута и, следовательно, значение хеш-функции. Вам нужен XPath, а затем вы можете указать /DocSum/Item[@Name='Title']

Эквивалент в XML :: Simple (или Perl ), равен

my ( $item ) = grep { $_->{Name} eq 'Title' } @{$data->{DocSum}{Item}};

или даже

use List::Util qw<first>;
...
( first { $_->{Name} eq 'Title' } @{$data->{DocSum}{Item}} )->{content};

Я должен не согласиться с daotoad. Насколько я понимаю, это не преобразует данные неправильно. Вы просто не работаете с тем, что он производит правильно. Это Простой модуль, он не надежный и не слишком DWIM.

2 голосов
/ 18 марта 2009

Я полагаю, вы используете XML :: Simple для анализа XML. Я бы посоветовал вам вывести свою структуру данных, используя Data :: Dumper . Тогда вы сможете найти его довольно легко.

use Data::Dumper;
print Dumper($data);
1 голос
/ 18 марта 2009

Похоже, что XML :: Simple неправильно угадывает, как преобразовывать данные. Вы пробовали использовать KeyAttr вариант XMLin()?

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