【问题标题】:Validate Invalid XPath Query验证无效的 XPath 查询
【发布时间】:2012-12-19 07:06:19
【问题描述】:

如果我想知道我的 XPath 查询不起作用,那么正确的验证是什么..

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

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

【问题讨论】:

    标签: php xpath domdocument domparser


    【解决方案1】:

    所以我理解的方式是你想检查一个空列表。以下是 PHP.net 对DOMXPath::query() 的评价:

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

    如果表达式格式错误或上下文节点无效, DOMXPath::query() 返回 FALSE。

    话虽如此,您必须检查一个空的 DOMNodeList,因为它是一个“可遍历”对象,所以在使用否定检查时实际上可能不会返回 FALSE。

    只需使用类似以下的内容:

    $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);
    }
    

    【讨论】:

      【解决方案2】:

      如果表达式格式错误或上下文节点无效,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!';
      }
      

      你的意思是这样的

      【讨论】:

      • 我已经尝试过了,这是不正确的,因为即使查询是正确的,它仍然显示无效的查询。
      【解决方案3】:

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

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

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

      当然,系统不可能知道所有员工过去都有一个雇佣日期,所以这个查询不会返回任何内容,您必须找出原因。

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

      将架构感知用于简单的即席查询可能会有点痛苦,这可能是大多数人不打扰的原因。但是,如果您正在开发一些复杂的东西,它可以真正帮助简化调试 - 特别是对于查询不返回任何内容的“空白屏幕”问题,并且没有办法找出原因,除非盯着它直到亮黎明。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多