2016-09-30 181 views
0

我想通过使用DOMXPath对象及其evaluate()函数来输入XPath的evaluate()。但是,我收到了一些意想不到的结果。在这个例子中,两个XPath结构或多或少都是相同的,除了在无效的结构中比较@begin。不过,我不明白为什么这段代码是无效的。为什么DOMXPath-> evaluate()返回false

<?php 

$newDomObj = new DOMDocument; 
$newXpathObj = new DOMXPath($newDomObj); 

$xpathValid = '//node[@cat="smain" and node[@rel="su" and @pt="vnw"] and node[@rel="hd" and @pt="ww"] and node[@rel="predc" and @cat="np" and node[@rel="det" and @pt="lid"] and node[@rel="hd" and @pt="n"]]]'; 
$xpathInvalid = '//node[@cat="smain" and node[@rel="su" and @pt="vnw" and number(@begin) < ../node[@rel="hd" and @pt="ww"]/number(@begin)] and node[@rel="hd" and @pt="ww" and number(@begin) < ../node[@rel="predc" and @cat="np"]/node[@rel="det" and @pt="lid"]/number(@begin)] and node[@rel="predc" and @cat="np" and node[@rel="det" and @pt="lid" and number(@begin) < ../node[@rel="hd" and @pt="n"]/number(@begin)] and node[@rel="hd" and @pt="n"]]]'; 

$valid = ($newXpathObj->evaluate($xpathValid) === false) ? false : true; 
$invalid = ($newXpathObj->evaluate($xpathInvalid) === false) ? false : true; 

var_dump($valid); 
var_dump($invalid); 

输出

bool(true) 
bool(false) 

(注意,以更好地检查你可以使用my beautifier给定的XPath结构 - 免责声明,我是该工具的作者可以测试上面的PHP代码here。 )

那么我的XPath出了什么问题,还是我用错误的方式评估它?我如何评估这种XPath?

+0

当我运行这一个时,我得到: - '警告:DOMXPath :: evaluate():无效e第13行..........中的表达式。但是,如果我改变了你的'$ xpathValid ='count(row/entry [。=“en”])';',那么我得到:'float(0)' –

+0

@Anant运行它[here](http:/ /ideone.com/aVSX3G)。 –

+0

这里也显示了警告,BTW: - https://eval.in/653162。 –

回答

0

那是因为你的第二的XPath下面的部分是无效的,因为XPath 1.0中哪位DOMXPath supports-不支持路径步骤调用函数:

../node[@rel="hd" and @pt="n"]/number(@begin)] 

如果../node[@rel="hd" and @pt="n"]保证总是返回最多1个结果,或者如果您只需要与第一个项目进行比较就可以返回多个项目,那么您可以使用以下表达式代替:

number(../node[@rel="hd" and @pt="n"]/@begin) 
+0

啊;这就说得通了。从哪个版本支持这种XPath? 2.0? –

+0

@BramVanroy是的,从2.0开始。要验证,您可以在支持XPath 1.0及更高版本的工具(如[this](http://www.xpathtester.com/xpath)或[this](http://xpatheval.apphb))中测试XPath .com /) – har07

+0

谢谢。由于XPath是自动生成的,然后由人类交互者编辑,所以我需要检查它的有效性。我将继续在PHP中寻找一种方法来验证XPath 2.0。 –