基本的DOMXpath,可能是错的? (re:检查输入命名空间总是)

时间:2013-09-10 15:08:51

标签: php xpath domdocument

我正在将一个内部domDocument用于一个类$this->doc->dom,我认为这是可以的,因为$this->doc->dom->saveXML()有效,并显示我的XML,如

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <title>04</title>
      <link href="css/04.css" rel="stylesheet" type="text/css"/>
    </head>
   ...

当我使用

 $xpath = new DOMXpath($this->doc->dom);
 $elements = $xpath->query('//link'); 

没有报告错误......但是,没有元素(!),

   print $elements->length;

显示0(零)。 这就是问题,对我来说是一个DomDocument BUG:<link ../>元素就在那里!


编辑以添加更多线索......

当我使用getElementsByTagName()执行类似的操作(!)时,$this->doc->dom不会出现问题。

 $test = $this->doc->dom->getElementsByTagName('link');
 print $test->length; // OK, not zero, returns 1!

1 个答案:

答案 0 :(得分:3)

这不是“DomDocument bug”。

简单解决方案

整合发布的评论。

注册命名空间

(@ PaulT回答) 根(html标记)声明了名称空间xmlns="http://www.w3.org/1999/xhtml"。 使用registerNamespace(),您可以使用任意昵称(xx)注册它,然后执行正确的查询

$xpath->registerNamespace('xx', "http://www.w3.org/1999/xhtml"); 
$xpath->query('//xx:link');

从根

中删除命名空间属性

我过滤了我的输入,所以它改为

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<html>
 <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>04</title>
    <link href="css/04.css" rel="stylesheet" type="text/css"/>
 </head>
...
</html>

现在按照我的预期工作,不需要“该死的命名空间”。

调试XPath

(@ RolandoIsidoro回答) 遇到类似情况时遇到问题请尝试freeformatter.com/xpath-tester.html之类的工具。 在您的示例中,它会抛出一个错误,导致您找到解决方案:

  

XPath查询的默认(无前缀)命名空间URI始终为''    并且无法将其重新定义为“http://www.w3.org/1999/xhtml