2014-02-12 38 views
0

从我的Perl脚本中,我正在寻找一种方法来严格评估/验证xpath表达式是否严格适用于语法问题/问题 - 仅此而已。我想出了以下工作方案:验证xpath表达式的语法错误

my $xpath = '//*'; ##good ; ##bad '//*?' 
eval { XML::LibXML->new()->parse_string('<X>boguscontent</X>')->findvalue($xpath) }; 
[email protected] ? print "bad xpath\n" : print "good xpath\n"; 

我觉得很奇怪,我必须把$ XPath的变量通这一切 - 我的以为会有存在一个更雄辩的方法直接做到这一点。任何人有任何想法?

回答

1

XML::LibXML::XPathExpression ->new($xpath)


$ perl -MXML::LibXML -E' 
    say "$_: ", eval { XML::LibXML::XPathExpression->new($_) } ?1:0 
     for @ARGV; 
' '//*' '///' 
//*: 1 
///: 0 
+0

谢谢@ikegami ...... 'XPathExpression' 界面更加雄辩。无论我用哪种方法检查XPath表达式的语法,在'eval'cmd中捕获的任何XPath表达式语法错误都会调用cmd并打印到STDERR(或者在我的情况中,因为我有SIG __DIE__子例程, -directs输出到日志文件)。我喜欢为这种情况抑制这种效应。是否有任何额外的参数可以添加到XPathExpression接口来抑制此效果?我检查了CPAN,没有运气。 – CraigP

+0

抑制'$ SIG {__ DIE __}'?是的,'当地$ SIG {__ DIE __};'。但是,您应该修复您的多功能处理程序:检查['$^S'](http://perldoc.perl.org/perlvar.html#$^S)。 – ikegami

+0

为什么建议我的本地$ SIG __DIE__是越野车?它的定义目的是简单地打印到我的日志文件句柄。 我一直在问,为什么'XPathxpression'界面 - 当它检测到语法错误时 - 正在抛出死亡......但是我猜想在'XPath'的眼中,语法错误是致命的,是吧? – CraigP