2016-09-30 3 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를 어떻게 평가할 수 있습니까? 항상 수익을 보장

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

../node[@rel="hd" and @pt="n"] 경우 : 2 XPath는 다음과 같은 부분이 1.0 - 어떤 DOMXPath supports-이 경로 단계에서 함수를 호출 지원하지 않습니다 XPath는 이후 유효하지 않은 때문이다

+0

내가 무엇입니까이 하나를 실행하고 있습니다 : - 경고 : DOMXPath :: evaluate() : 잘못된 e .......... on line 13'의 xpression. 하지만 당신의'$ xpathValid = 'count (row/entry [. = "en"])'; '를 변경했다면 : -'float (0)' –

+0

@Anant [http : /ideone.com/aVSX3G). –

+0

경고도 표시됩니다. BTW : - https://eval.in/653162. –

답변

0

당신은 반환되는 여러 항목의 경우 첫 번째 항목과 비교해야하는 경우 가장 한 결과에서, 또는, 당신은 대신에 다음 식을 사용할 수 있습니다

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

아. 그건 의미가 있습니다. 어떤 XPath 버전이 지원됩니까? 2.0? –

+0

@BramVanroy 예, 2.0부터 시작합니다. 확인하려면 [this] (http://www.xpathtester.com/xpath) 또는 [this] (http : //xpatheval.apphb)와 같이 XPath 1.0 이상을 지원하는 도구에서 XPath를 테스트 할 수 있습니다. .com /) – har07

+0

감사합니다. XPath는 자동으로 생성되어 인간 상호 작용자가 편집하므로 해당 유효성을 검사해야합니다. PHP에서 XPath 2.0의 유효성을 검증하는 방법을 계속 찾아 볼 것입니다. –

관련 문제