2010-11-03 54 views
1

我有一个需要解析的xml。 我当找到某个特定元素时调用xml解析

$parser = new XML::Parser(Handlers => 
     {Init => \&handle_Init, Start => \&handle_Start, 
     Char => \&handle_Char, End =>\&handle_End, 
     Final => \&handle_Final}); 

$parser->parsefile("ababab.xml"); 

在handle_Char子程序,只要我找到一个特定的标签和它的价值,我想停下来。

如何实现它?

回答

4

您可以将调用包装到eval中的parsefile,然后死在处理程序中。然后,您将需要测试$ @以查看是否解析成功

一个例子:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Parser; 

my $p = XML::Parser->new(Handlers => { End => sub { if($_[1] eq 'e') { die "ok"; } } }); 

print "parsing well-formed xml: "; 
eval { $p->parse('<d><b/><e/></d>'); }; 
if([email protected] =~ m{^ok}) { print "success\n"; } else { print [email protected]; } 

print "parsing malformed xml: "; 
eval { $p->parse('<d<b/><e/></d>'); }; 
if([email protected] =~ m{^ok}) { print "success\n"; } else { print [email protected]; } 

不过我不会用XML解析器::。 Perl5 wiki有一个用于XML解析的list of recommended modules

+1

您的测试是向后的,您的打印成功时解析失败。 另外,如果你打算使用die来处理非致命的流量控制,请使用异常对象。 'die'接受它作为参数对象,然后在'$ @'中可用,这允许结构化测试而不是字符串匹配。有许多CPAN模块可以为您做一些工作,或者您可以推出自己的工作。 – 2010-11-03 15:18:12

+0

同意,很少*需要显式使用'eval'和'$ @'来检查异常。最简单和最小的异常处理包目前是Try :: Tiny;在单元测试中你可以使用Test :: Fatal。 – Ether 2010-11-03 16:13:31

+0

哎呀,向后测试是固定的,这就是我在早晨喝咖啡之前张贴答案的结果。至于异常建议,如果你有更好的方法,那么一定要发布。 – mirod 2010-11-03 16:35:50