2016-09-30 40 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。 –

相關問題