2

我正在尝试解析一个充满 .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>

到目前为止,有人认为我的想法有什么问题吗?

4

3 回答 3

5

您的初始文件是 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"]');
于 2012-10-02T15:41:44.913 回答
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";
}
?>
于 2012-10-02T13:27:09.250 回答
3

也许您的元素的class属性中有不止一个类:td

<td class="hide anotherclass">

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

<td class="hide">

像这样试试看它是否包含hide您要查找的类:

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

查看这篇博文:XPath:按类选择元素

于 2012-10-02T13:28:15.333 回答