Я надеюсь, что было передано, что XML::Simple
не должен использоваться, поскольку давно заменен гораздо лучшими модулями и "категорически не рекомендуется" против его собственного автора, также много лет назад.
В этом примере показан способ использования родительского узла для запроса братьев и сестер, как это специально просили.(Я дополняю ваш образец корневым узлом <document>
, чтобы получить правильно сформированный XML.) Ответ ikegami показывает, как вы можете более прямо делать то, что вам нужно.
Если у вас есть причинадля сканирования через узлы <title>
(возможно, для поиска различных названий), их <year>
узлы могут быть найдены с помощью
use strict;
use warnings;
use feature 'say';
use XML::LibXML;
my $file = shift || die "Usage: $0 filename\n";
my $doc = XML::LibXML->load_xml(location => $file, no_blanks => 1);
my $xpath = '/document/movie/title';
foreach my $node ($doc->findnodes($xpath)) {
if ($node->to_literal =~ /(Titanic)/) {
say "Title: $1";
foreach my $yr ($node->parentNode->findnodes('./year')) {
say "\tyear: ", $yr->to_literal;
}
}
}
Если под одним узлом <year>
всегда есть один узелУзел <movie>
, тогда это можно упростить с помощью ярлыка findvalue
, заменив цикл на $node->parentNode->findnodes
, для
foreach my $node ($doc->findnodes($xpath)) {
if ($node->to_literal =~ /(Titanic)/) {
say "Title: $1";
say "\tyear: ", $node->parentNode->findvalue('./year');
}
}
Здесь мы получаем текст напрямую и поэтому нет необходимости в ->to_literal
Либо.
В XML :: LibXML :: Node , базовом классе для узлов, используемых для получения других конкретных классов, есть еще много методов.Один из интересующих здесь может быть nextSibling
, как способ просмотра другой информации о названии в пределах одного <movie>
.
Обратите внимание, что эта полная и полнофункциональная библиотека предоставляет гораздо больше инструментов для работы с XML.Например, добавление деталей в ваш исходный файл, например, атрибутов, позволит использовать другие сильные стороны библиотеки.
Документация распространяется на несколько страниц.См. в этом посте для краткого изложения ссылок на соответствующие документы.Существует также учебник по XML :: LibXML , автором XML::Simple
.