XPath不断返回空节点列表

时间:2012-10-02 13:23:34

标签: php html xpath domdocument

我正在尝试解析一个充满.htm文件的文件夹。所有这些文件都包含需要删除的1个特定元素。 它是td元素class="hide"。到目前为止,这是我的代码。 $dir. entry是文件的完整路径。

$page = ($dir . $entry);
$this->domDoc->loadHTMLFile($page);
// Use xpath query to find the menu and remove it
$nodeList = $xpath->query('//td[@class="hide"]');

不幸的是,这是事情已经出错的地方。如果我执行了var_dump节点列表,我会得到以下结果:

object(DOMNodeList)#5 (0) { } 

请大家知道我想要选择的内容,这里有一段摘录:

<td width="160" align="left" valign="top" class="hide">
    lots of other TD's and content here
</td>

到目前为止,有人看到我提出的问题有什么不妥吗?

3 个答案:

答案 0 :(得分:5)

Var转储xpath节点列表对象不显示任何内容。 Var转储节点列表的长度。

var_dump($nodeList->length);

如果值大于0,则可以使用foreach迭代它:

foreach($nodeList as $node)var_dump($node->tagName);

希望这有帮助。

有关进一步说明,请参阅完整的代码片段:

<?php
$html = <<<END
<html>
    <body>
        <td>

        </td>
        <td class="hide"></td>
        <td class="hide"></td>
    </body>
</html>
END;
$dom = new DOMDocument;
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);
$nodeList = $xpath->query('//td[@class="hide"]');
// Shows a blank object
var_dump($nodeList);
// Shows 2
var_dump($nodeList->length);
// Echo out all the tag names.
foreach($nodeList as $node){
    echo $node->tagName . "\n";
}
?>

答案 1 :(得分:3)

也许您的class元素的td属性中有一个以上的课程:

<td class="hide anotherclass">

所以'//td[@class="hide"]'只匹配:

<td class="hide">

请尝试这样做以查看它是否包含您要查找的hide课程:

$nodeList = $xpath->query('//td[contains(@class,"hide")]');

查看此博文:XPath: Select element by class

答案 2 :(得分:3)

您的初始文件是xhtml(即<html xmlns="http://www.w3.org/1999/xhtml">)吗?如果是,那么您的元素将被命名空间,您需要使用$xpath->registerNamespace设置前缀映射,然后在表达式中使用此前缀

$xpath->registerNamespace('xhtml', 'http://www.w3.org/1999/xhtml');
$nodeList = $xpath->query('//xhtml:td[@class="hide"]');
相关问题