XML::LibXML
- мой самый используемый модуль XML - есть много других, но этот делает практически все, что мне нужно, за счет того, что иногда он немного более многословен, чем другие модули.Далее печатаются четыре желаемых узла:
use warnings;
use strict;
use XML::LibXML;
my $dom = XML::LibXML->load_xml(string => <<'EOT');
<tag-0>
<tag-1>This is<tag-2>some example</tag-2>text</tag-1>
<tag-3>This is some <ice-8> more </ice-8>text</tag-3>
<tag-4>This
<tag-5>is
<tag-6>even more</tag-6>
</tag-5>
<tag-7> text</tag-7>
</tag-4>
</tag-0>
EOT
my $expr = "*[substring(name(), 1, 4) = 'tag-']";
for my $node ( $dom->findnodes("//$expr") ) {
my @children = $node->findnodes("./$expr");
if (@children) {
print $node->nodeName,"\n";
}
}
Обратите внимание, что описание вашей проблемы немного неясно: содержит ли "вложенный <tag-[num]>
" означает, что должны быть только прямые потомкирассматривается или должно <tag-0>A<x>B<tag-1>C</tag-1>D</x>E</tag-0>
также вернуть tag-0
?
Если это так, то вы можете изменить второе findnodes
выражение на ".//$expr"
.