我的目标是start_tag_handler(见下文)在找到应用程序/标题标签时获取应用程序/标题内容(请参阅下面的示例
XML).
和
end_tag_handler在找到apps / logs标记时获取应用程序/日志内容.
这是用于解析的Perl代码(使用XML::Twig)###:
- #!/usr/local/bin/perl -w
- use XML::Twig;
- my $twig = XML::Twig->new(
- start_tag_handlers =>
- { 'apps/title' => \&kicks
- },twig_roots =>
- { 'apps' => \&app
- },end_tag_handlers =>
- { 'apps/logs' => \&bye
- }
- );
- $twig -> parsefile( "doc.xml");
- 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";
- }
这是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 parse.pl
- ---kicks---
- ---app---
- watchset,endcsv
- ---kicks---
- ---app---
- machinedown,enddump
查看
start_tag_handlers
的XML :: Twig文档:
The handlers are called with 2 params: the twig and the element. The element is empty at that point,its attributes are created though.
在调用start_tag_handlers时,甚至还没有看到文本内容,因为解析开始标记(例如< title>,而不是结束标记< / title>)刚刚完成.
end_tag_handlers不提供元素文本的原因可能是对称:-).
您想要的可能是使用twig_handlers:
- my $twig = XML::Twig->new(
- twig_handlers => {
- 'apps/title' => \&kicks,'apps/logs' => \&bye
- },twig_roots => {
- 'apps' => \&app
- },);
输出是:
- ---kicks---
- watch
- bye
- csv
- ---app---
- watchset,endcsv
- ---kicks---
- machine
- bye
- dump
- ---app---
- machinedown,enddump