XML::Twig: как указать twig_handler для ‹_tag›, который начинается с подчеркивания?

У меня есть файл 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);

person VolDeNuit    schedule 30.08.2013    source источник


Ответы (1)


Какую версию XML::Twig вы используете? Это ошибка, исправленная в версии 3.38.

Из файла изменений:

version 3.38
date: 2011-02-27
# minor maintenance release
fixed: RT 65865: _ should be allowed at the start on an XML name
       https://rt.cpan.org/Ticket/Display.html?id=65865
       reported by Steve Prokopowich

И действительно, когда я использую «__» в качестве значения для $xpath, код работает без ошибок и дает правильный результат.

person mirod    schedule 31.08.2013
comment
Большое спасибо. Моя текущая версия XML::Twig — 3.34. Я посмотрю, смогу ли я получить обновление завтра, и подтвержу, что оно устраняет проблему, как только смогу. (Следующей доступной стабильной версией Debian будет 3.39.) - person VolDeNuit; 01.09.2013
comment
Привет, Мирод, только что установил версию 3.39, и, как было заявлено, проблема исчезла. Еще раз спасибо за терпение и помощь :) - person VolDeNuit; 02.09.2013