为什么XML :: Twig不调用我的end_tag_handler?

时间:2009-09-21 00:09:57

标签: xml perl xml-twig

我尝试为每个标记调用子例程,但从不调用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---

1 个答案:

答案 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}}