3

我尝试为每个标签调用子例程,但end_tag_handlers从未调用过。
我的目标是这个序列:

---sequence---调用
时。打电话 时。打电话 时。打电话 时。打电话 时。打电话 时。打电话 时。打电话 时。→它没有被调用。<auto>\&loading
<apps><title>\&kicks
<apps><logs>\&bye
<apps>\&app
<apps><title>\&kicks
<apps><logs>\&bye
<apps>\&app
</auto>\&finish

温度.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";
  }

文档.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---
4

1 回答 1

6

来自XML::Twig的文档:

end_tag_handlers

哈希 { 表达式 => \&handler}。设置元素关闭时调用的元素处理程序(在 XML::Parser End 处理程序的末尾)。处理程序使用 2 个参数调用:树枝和元素的标签。

twig_handlers当一个元素被完全解析时被调用,那么为什么有这个冗余选项呢?: 只有一个用途,end_tag_handlers当使用该twig_roots选项时,触发根以外的元素的处理程序。

您正在为您的元素设置一个结束处理程序auto,即根。而你只使用twig_rootsfor 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
          },
        );
于 2009-09-21T02:38:33.890 回答