0

我在一个类中使用了一个内部 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!
4

1 回答 1

3

这不是“DomDocument 错误”。

简单的解决方案

合并已发布的评论。

注册命名空间

(@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 '

于 2013-09-10T17:07:56.063 回答