如何使用 XML::P arser's START 处理程序引用文件名(使用 parsefile 时)?



如果我实例化XML::Parser:

$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => &start_handler);

然后调用parsefile:

$parser->parsefile($filename);

是否可以从start_handler中检索$filename的值?

如果不了解XML::Parser的精髓,我的建议是使用闭包:

my $filename = "foo.bar";
my $start_handler = sub { 
    # ues $filename here
};
$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => $start_handler);

解决这个问题的一个笨拙的方法是将parsefile方法包装在子函数parse_file中(见下文),并将文件名存储在$current_filename中(这与gensym的答案类似,但允许递归)。

$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => &start_handler);
$current_filename = '';
$previous_filename = '';
parse_file($filename);
sub parse_file {
   $previous_filename = $current_filename;
   $current_filename = shift;
   $parser->parsefile($current_filename);
   $current_filename = $previous_filename;
}
sub start_handler { 
...
... $current_filename ...
...
}

最新更新