Почему XML :: Twig не вызывает мой end_tag_handler? - PullRequest
3 голосов
/ 21 сентября 2009

Я пытаюсь вызвать подпрограмму для каждого тега, но end_tag_handlers никогда не вызывается.
Моя цель - эта последовательность:

--- --- последовательность
когда <auto> звоните \&loading.
когда <apps><title> звоните \&kicks.
когда <apps><logs> звоните \&bye.
когда <apps> звоните \&app.
когда <apps><title> звоните \&kicks.
когда <apps><logs> звоните \&bye.
когда <apps> звоните \&app.
когда </auto> звоните \&finish. & Rarr; Он не был вызван.

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 Ответ

6 голосов
/ 21 сентября 2009

Из документов для XML :: Twig :

end_tag_handlers

Хеш {выражение => \ & обработчик}. Устанавливает обработчики элементов, которые вызываются, когда элемент закрыто (в конце обработчика 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
          },
        );
...