1

我有一个 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);
4

1 回答 1

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,代码运行没有错误,并给出正确的输出。

于 2013-08-31T07:26:56.000 回答