3

タグごとにサブルーチンを呼び出そうとしましたが、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---
4

1 に答える 1

6

XML :: Twigのドキュメントから:

end_tag_handlers

ハッシュ{式=>\&handler}。要素が閉じられたときに呼び出される要素ハンドラーを設定します(XML :: Parser Endハンドラーの最後)。ハンドラーは、小枝と要素のタグの2つのパラメーターで呼び出されます。

twig_handlers要素が完全に解析されたときに呼び出されるのに、なぜこの冗長なオプションがあるのでしょうか。オプションend_tag_handlersを使用する場合、ルート外の要素のハンドラーをトリガーするための使用法は1つだけです。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
          },
        );
于 2009-09-21T02:38:33.890 に答える