验证无效的XPath查询

时间:2012-12-19 07:06:19

标签: php xpath domdocument domparser

如果我想知道我的XPath查询无效,那么什么是正确的验证。

$query_id = $xpath->query('//tr[@class="calendar_row"][@data-eventid]/@data-evenid');
if (!is_null($query_id)) {
    ...
} else {
    echo 'Invalid Query!';
}

我正在使用上面的代码,但即使查询无法产生任何结果,它也不会显示任何内容。

3 个答案:

答案 0 :(得分:3)

所以我理解这一点的方法是你要检查一个空列表。以下是PHP.net对DOMXPath::query()所说的内容:

  

返回包含与给定XPath匹配的所有节点的DOMNodeList   表达。任何不返回节点的表达式都将返回一个   空DOMNodeList。

     

如果表达式格式错误或contextnode无效,   DOMXPath :: query()返回FALSE。

说到这一点,你必须检查一个空的DOMNodeList,当用“否定”检查时,它实际上可能不会返回FALSE,因为它是一个“Traversable”对象。

相反,只需使用以下内容:

$query_id_entries = $xpath->query('//tr[@class="calendar_row"][@data-eventid]/@data-evenid');
if ($query_id_entries->length == 0) {
    echo "invalid query";
} else {
    foreach($query_id_entries as $query_id) {
        // ...
    }
    // Or you could do the following.
    // $query_id = $query_id_entries->item(0);
}

答案 1 :(得分:1)

如果表达式格式错误或contextnode无效,DOMXPath::query()将返回FALSE。所以,

$query_id = $xpath->query('//tr[@class="calendar_row"][@data-eventid]/@data-evenid');
if (!($query_id)) {
    echo "invalid query";
} else {
    echo 'Valid Query!';
}

你的意思是什么

答案 2 :(得分:1)

  

即使查询无法产生任何结果,它也不显示任何结果

有许多查询无法产生任何结果。一个例子是

//employee[hire-date gt current-date()]

当然,系统无法知道所有员工过去都有雇用日期,因此这个查询只会返回任何内容,您将不得不弄清楚原因。

但也许您错误地输入了“雇用日期”。也许应该是“hireDate”或“@ hire-date”?在这种情况下,您可能希望系统能够发现您的错误。答案是,如果您使用可识别模式的查询处理器,并且通过向查询处理器告知您的模式(通常在查询序言中使用“import schema”声明),它可以利用模式感知。

对简单的即席查询使用模式感知可能有点痛苦,这可能是大多数人不打扰的原因。但是如果你正在开发一些复杂的东西,它可以帮助你简化调试 - 特别是对于你的查询什么也没有返回的“空白屏幕”问题,并且没有办法找到原因,除非直到光线盯着它黎明。

使用模式在编译时检测错误的模式感知查询处理器的一个示例是Saxon-EE。