$ node-> nextSibling总是给出DOMAttr(仅限文本节点)

时间:2013-08-03 08:56:41

标签: php xml dom

我在PHP中遍历DOM时遇到以下错误

  

致命错误:调用未定义的方法DOMText :: getAttribute()

我正在做的是,我一个接一个地遍历DOM节点。但在某些情况下,我没有得到正确的DOM节点,我可以从中获得特定的属性。当我获得DOMText节点时, - > nodeType == 3总是(不是DOM节点, - > nodeType == 1),因此我无法获取返回的DOM节点的任何属性。

我使用PHP中的以下语法获取Next DOM Node

$node = $node->nextSibling;

在某些情况下,我还需要像以前一样获取Previous Nodes

$node = $node->previousSibling;

现在,我的问题是,我如何获得正确的DOM节点?

我试过以下功能

function GetNode($oNode)
{
    while($oNode->nodeType != 1)
        $oNode = $oNode->previousSibling;
    return $oNode;
}

有检查条件(我使用过该节点),如

while($node && !empty($node) && $node->nodeType == 1 && !preg_match("/^Abc/",$node->getAttribute('class')))
{
    //further code
    $node = $node->nextSibling;
    $node = GetNode($node);
}

但是现在出现问题是它进入无限循环,因为它总是返回nodeType == 1并且不会终止循环。

1 个答案:

答案 0 :(得分:3)

Text节点是任何其他元素的dom元素。看来是因为xml中的标签之间存在纯文本(例如换行符char)。所以你应该只检查nodeType并跳过文本节点。

在你的代码中,你在“GetNode”函数中有一个错误:你应该使用$ oNode-> nextSibling而不是$ oNode-> previousSibling。

P.S。现代浏览器具有跳过文本节点的.nextElementSibling属性;)