我尝试为每个标记调用子例程,但从不调用end_tag_handlers
我的目标是这个序列:
--- ---序列
当<auto>
致电\&loading
时
当<apps><title>
致电\&kicks
时
当<apps><logs>
致电\&bye
时
当<apps>
致电\&app
时
当<apps><title>
致电\&kicks
时
当<apps><logs>
致电\&bye
时
当<apps>
致电\&app
时
在</auto>
致电\&finish
时。 → 未被调用。
temp.pl:
#!/usr/local/bin/perl -w
use XML::Twig;
my $twig = XML::Twig->new(
start_tag_handlers =>
{ 'auto' => \&loading
},
twig_handlers =>
{ 'apps/title' => \&kicks,
'apps/logs' => \&bye
},
twig_roots =>
{ 'apps' => \&app
},
end_tag_handlers =>
{ 'auto' => \&finish
}
);
$twig -> parsefile( "doc.xml");
sub loading {
print "---loading--- \n";
}
sub kicks {
my ($twig, $elt) = @_;
print "---kicks--- \n";
print $elt -> text;
print " \n";
}
sub app {
my ($twig, $apps) = @_;
print "---app--- \n";
print $apps -> text;
print " \n";
}
sub bye {
my ($twig, $elt) = @_;
print "---bye--- \n";
print $elt->text;
print " \n";
}
sub finish {
print "---fishish--- \n";
}
doc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<auto>
<apps>
<title>watch</title>
<commands>set,start,00:00,alart,end</commands>
<logs>csv</logs>
</apps>
<apps>
<title>machine</title>
<commands>down,select,vol_100,check,line,end</commands>
<logs>dump</logs>
</apps>
</auto>
输出:
C:\>perl temp.pl
---loading---
---kicks---
watch
---bye---
csv
---app---
watchset,start,00:00,alart,endcsv
---kicks---
machine
---bye---
dump
---app---
machinedown,select,vol_100,check,line,enddump
我想在这里更多。
---finish---
答案 0 :(得分:6)
来自XML::Twig的文档:
end_tag_handlers
哈希{expression =&gt; \&安培;处理程序}。设置元素时调用的元素处理程序 关闭(在XML :: Parser End处理程序的末尾)。处理程序用2调用 params:树枝和元素的标记。
当一个元素被完全解析时,会调用
twig_handlers
,所以为什么这会多余 选项?end_tag_handlers
只有一种用途:使用twig_roots
选项时,可以使用auto
触发根之外的元素的处理程序。
您正在为twig_roots
元素设置一个结束处理程序,它是根。而且您只对apps
使用twig_handlers
。所以永远不会调用结束处理程序。
您应该使用my $twig = XML::Twig->new(
start_tag_handlers =>
{ 'auto' => \&loading
},
twig_handlers =>
{ 'apps/title' => \&kicks,
'apps/logs' => \&bye,
'auto' => \&finish
},
twig_roots =>
{ 'apps' => \&app
},
);
安装处理程序。
所以试试这个:
{{1}}