Perl получает значение узла XML, используя XML:LibXML

Я пытаюсь распечатать содержимое узлов для дальнейшего процесса. Хотел распечатать содержимое x_id="123" и узла "a". Я использую парсер XML:LibXML. Любое предложение? Я очень новичок в этом парсере файлов.

Пример XML:

<header>
    <id x_id="123">                            
        <a>testing</a>
        <b></b>
    </id>
</header>

Текущий не рабочий код:

use strict;
use warnings;
use XML::LibXML;

my $template = "xx.xml";
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($template);
my($object) = $doc->findnodes("/header/id/");
print $doc->findvalue("/header/id/x_id");

person Blurman    schedule 11.04.2020    source источник


Ответы (1)


Пример фрагмента кода для демонстрации

use strict;
use warnings;
use feature 'say';

use XML::LibXML;

my $file = 'test.xml';

my $dom = XML::LibXML->load_xml(location => $file);

foreach my $node ($dom->findnodes('//idset')) {
    say 'NodeID: ', $node->{id};
    say 'ItemA: ', $node->findvalue('./a');
    say 'ItemB: ', $node->findvalue('./b');
    say '';
}

Содержимое входного файла text.xml

<header>
    <idset id="100">                            
        <a>item_a</a>
        <b>item_b</b>
    </idset>
    <idset id="101">                            
        <a>item_c</a>
        <b>item_d</b>
    </idset>
</header>

Выход

NodeID: 100
ItemA: item_a
ItemB: item_b

NodeID: 101
ItemA: item_c
ItemB: item_d
person Polar Bear    schedule 11.04.2020
comment
Привет, полярный медведь, попробовал твой код, но показывает ссылку Not HASH в строке 12. - person Blurman; 11.04.2020
comment
Строка 12: say 'NodeID: ', $node-›{id}; - person Blurman; 11.04.2020
comment
@toolic - данные OP не являются хорошим примером для демонстрации. Только один узел со сбивающей с толку идентификацией id и x_id, теги не соответствуют XML спецификация. - person Polar Bear; 11.04.2020
comment
@Blurman - Какие версии OS, perl и XML::LibXML вы используете? В моем случае это Windows 10, Strawberry perl v5.30.2, XML::LibXML 2.0203. - person Polar Bear; 11.04.2020
comment
Я просматриваю образец из [grantm.github.io/perl -libxml-by-example/basics.html] и понимаю, как вызвать дочерний узел (название, директор в первом примере в ссылке), но не знаю, как вызвать id в элементе фильма. - person Blurman; 13.04.2020
comment
@Blurman - я не специалист по XML::LibXML, но say 'ID: ', $movie->{id}; выдает результат с ожидаемым идентификатором. - person Polar Bear; 13.04.2020
comment
@Polar Bear, он показывает для меня не ссылку HASH при вызове узла элемента. Позвольте мне открыть новую тему, чтобы спросить об этом. Спасибо - person Blurman; 22.04.2020