Как я могу получить атрибут элемента XML с помощью Perl XML :: Simple? - PullRequest
1 голос
/ 05 ноября 2010

У меня есть скрипт Perl, который читает XML-файл, который не имеет содержимого, только атрибуты в элементе.

Примерно так:

<league>
<game name="bla"/>
</league>

Теперь я пытаюсь получитьигровой атрибут 'name'.

Я пытался использовать $xml->{league}->{game}->{name} и $xml->{league}->{game}->['name'], но они оба не работают.Кое-что о проблеме с хешем.

Есть кто-нибудь, кто может помочь мне получить значение?

Ответы [ 2 ]

4 голосов
/ 05 ноября 2010

Я обычно создаю экземпляры своих объектов XML :: Simple следующим образом:

use XML::Simple ':strict';
my $xs = XML::Simple->new( KeepRoot => 1, KeyAttr => 1, ForceArray => 1 );

это позволяет структуре быть согласованной между одним и, возможно, несколькими подэлементами.С этими настройками этот код получает ваше значение:

#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple ':strict';

my $xs = XML::Simple->new( KeepRoot => 1, KeyAttr => 1, ForceArray => 1 );
my $ref = $xs->XMLin('data.xml');
print $ref->{league}[0]{game}[0]{name};

Я добавил еще один игровой тег и атрибут для тега лиги, например, это xml:

<league name="baz"> 
    <game name="bla"/>
    <game name="foo"/>
</league>

И вывод Data :: Dumper:

$VAR1 = {
          'league' => [
                      {
                        'game' => [
                                  {
                                    'name' => 'bla'
                                  },
                                  {
                                    'name' => 'foo'
                                  }
                                ],
                        'name' => 'baz'
                      }
                    ]
        };
4 голосов
/ 05 ноября 2010

Что ж, из отправленного вами XML-файла я получаю следующее:

Entity: line 3: parser error : Opening and ending tag mismatch: league line 0 and leage

Это даже не выглядит как вопрос строгого режима / предупреждения, потому что он появляется, когда я комментирую свой USUW.

Но если у вас есть нужные теги, это должно сработать:

$xml->{game}{name};

И если я позвоню XMLin с KeepRoot => 1, вы найдете его по адресу:

    $xml->{league}{game}{name};

Если у вас возникли проблемы с определением способа считывания данных, сделайте следующее:

use 5.010;
use strict;
use warnings;
use Data::Dumper;
use XML::Simple;

my $xml = XMLin( $input );
say Data::Dumper->Dump( [ $xml ], [ '$xml' ] );

И затем используйте путь к представленным структурам.


Примечание:

$xml->{league}->{game}->['name'];

должен был умереть с: «Не указана ссылка на массив» даже без включенных предупреждений.['string'] является ссылкой на массив со строкой 'string' в качестве единственного элемента.И если бы $xml->{league}{game} был массивом, он умер бы с нечисловой ошибкой, потому что строки не обращались к массивам.

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