У меня есть файл XML, тег корневого элемента которого равен <__>
(два символа подчеркивания). Однако когда это имя тега используется в списке twig_handlers, XML::Twig->new умирает с сообщением об ошибке:
unrecognized expression in handler: '__'
Фактически, ЛЮБОЙ тег, начинающийся с подчеркивания, вызывает эту ошибку, за исключением специальных тегов Twig _all_
и _default_
, любой из которых я могу использовать для обработки файла за счет отбрасывания всех обратных вызовов обработчика, кроме последнего.
Неудачный вызов:
XML::Twig->new (twig_handlers => { '__' => \&show })
Я предполагаю, что здесь можно использовать выражение XML::Twig Xpath, но документация CPAN довольно расплывчата в отношении их синтаксиса. Я также теперь задаюсь вопросом, что мне нужно сделать, чтобы добраться до элемента <_all_>
:)
Если у кого-то есть предложение, было бы очень признательно.
Проблема возникает только при создании ветки, поскольку после начала обработки (с использованием выражения обратного вызова _all_
) элементы <__>
на любом уровне ввода обрабатываются нормально.
Если кто-то хочет поиграть с проблемой, вот программа, которую я использовал, чтобы попытаться найти решение. Установите $xpath на выражение, которое вы хотите протестировать.
use strict;
use XML::Twig;
my $xpath = '_all_'; # <---- fails if one puts '__' here
my $xml = <<EOS; # <---- here's the XML data to process
<__>
<AA>first</AA>
<__>second</__>
</__>
EOS
sub show {
print "handler called for element ", $_->gi, ", whose children are\n";
my @children = $_->children;
for my $elt (@children) {
print "\t", $elt->gi, " holds \"", $elt->text, "\"\n";
}
1;
}
my $twig = XML::Twig->new (twig_handlers => { $xpath => \&show });
$twig->parse ($xml);