【发布时间】:2013-08-03 08:56:40
【问题描述】:
在 PHP 中遍历 DOM 时出现以下错误
致命错误:调用未定义的方法 DOMText::getAttribute()
我正在做的是,一个接一个地遍历 DOM 节点。但在某些情况下,我没有得到适当的 DOM 节点,我可以从中获得特定的属性。当我得到 DOMText 节点时,->nodeType==3 总是(不是 DOM 节点,->nodeType == 1),因此我无法获取返回的 DOM 节点的任何属性。
我在 PHP 中使用以下语法获取下一个 DOM 节点
$node = $node->nextSibling;
在某些情况下,我还需要像这样获取以前的节点
$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 并且没有终止循环。
【问题讨论】:
-
您的
GetNode不会改变$oNode的值,这就是它永远循环的原因。 -
请发布您正在处理的 xml/html 文件的示例。在我看来,有些节点既包含子元素节点又包含文本节点
-
@DCoder,我已经更新了代码。这里是打印错误,但不是在实际代码中:)
-
@NullVoid DOMText 节点有父节点.. 为什么不使用
->parentNode属性? -
@Prasanth,有时我在
!preg_match("/^Abc/",$node->getAttribute('class'))中有 DOMText 节点,但并非总是如此。这就是为什么我不能总是选择->parentNode。