我有这段代码:
$reader = new DOMDocument();
$reader->loadHTML($shell);
$xpath = new DomXPath($reader);
$xpath->registerNamespace('html','http://www.w3.org/1999/xhtml');
$res = $xpath->query('descendant-or-self::*[contains(@class,"content")]');
print_r($res);
$ shell只是一个包含以下html代码的变量:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="en-us" />
<title>Hello World</title>
</head>
<body>
<div class="content">
Hello World!!
</div>
</body>
</html>
如果我正确的xpath查询:
descendant-or-self::*[contains(@class,"content")]
应该使用“内容”类来获取div。但是,当我打印数组时,我看到的只是一个空对象:
DOMNodeList Object
(
)
这是否意味着查询无效? DomXPath查询语言是否与SimpleXML Xpath不同,因为查询适用于SimpleXML?
如果它正在工作,我如何查看和修改匹配的节点?
答案 0 :(得分:2)
print_r
- DOMNodeList
(或任何DOM类)对你的好处不大:它们大多是在C / Libxml2级别实现的,而不是本机暴露给PHP 。据我所知,这将有效,在查询后添加,并查看是否得到结果:
foreach($res as $node){
var_dump($node->ownerDocument->saveXML($node));
}
答案 1 :(得分:0)
我想你想要像这样的somthiing:
//*[@class='content']
这将获得包含课程内容的任何标签。
只要获得任何div,它的可读性就会略高一些:
//div[@class='content']
在xpath中,您使用//
运算符来获取dom中任何级别的标记。它将匹配所有。