0

我有这个代码:

$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?

如果它正在工作,我如何查看和修改匹配的节点?

4

2 回答 2

2

print_r- 一个DOMNodeList(或任何 DOM 类)对你没有多大好处:它们主要在 C / Libxml2 级别实现,而不是原生暴露给 PHP。据我所知,这将起作用,在您的查询后添加它,看看您是否得到结果:

foreach($res as $node){
        var_dump($node->ownerDocument->saveXML($node));
}
于 2010-09-22T23:34:25.433 回答
0

我在想你想要这样的东西:

//*[@class='content']

这将获得任何带有类内容的标签。

获取任何 div 会更易读:

//div[@class='content']

在 xpath 中,您使用//运算符在 dom 中的任何级别获取标签。它将匹配所有这些。

于 2010-09-22T23:31:51.057 回答