DomXML xpath接下来我该怎么办?

时间:2010-09-22 23:24:59

标签: php html xml domxpath

我有这段代码:

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

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

2 个答案:

答案 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中任何级别的标记。它将匹配所有。