我正在将一个内部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!
答案 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>
现在按照我的预期工作,不需要“该死的命名空间”。
(@ RolandoIsidoro回答) 遇到类似情况时遇到问题请尝试freeformatter.com/xpath-tester.html之类的工具。 在您的示例中,它会抛出一个错误,导致您找到解决方案:
XPath查询的默认(无前缀)命名空间URI始终为'' 并且无法将其重新定义为“http://www.w3.org/1999/xhtml”