2010-11-03 51 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