【问题标题】:$node->nextSibling always giving DOMAttr (text node only)$node->nextSibling 总是给出 DOMAttr (仅文本节点)
【发布时间】: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

标签: php xml dom


【解决方案1】:

文本节点和其他节点一样是一个 dom 元素。它出现是因为您的 xml 中的标签之间有纯文本(例如换行符)。所以你应该只检查 nodeType 并跳过文本节点。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2011-05-27
    • 2019-07-08
    相关资源
    最近更新 更多