如果我想知道我的XPath查询无效,那么什么是正确的验证。
$query_id = $xpath->query('//tr[@class="calendar_row"][@data-eventid]/@data-evenid');
if (!is_null($query_id)) {
...
} else {
echo 'Invalid Query!';
}
我正在使用上面的代码,但即使查询无法产生任何结果,它也不会显示任何内容。
答案 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。