在PHP DOM中选择所选节点的下一个节点?

在PHP DOM中选择所选节点的下一个节点?,php,dom,xpath,Php,Dom,Xpath,到目前为止,我正在处理这样一个HTML文件 <div name="node"></div> <div></div> <div name="node"></div> <div></div> <div name="node"></div> <div></div> 但我只是犯了个错误 致命错误:调用未定义的方法DomeElement::next_siblin

到目前为止,我正在处理这样一个HTML文件

<div name="node"></div>
<div></div>
<div name="node"></div>
<div></div>
<div name="node"></div>
<div></div>
但我只是犯了个错误

致命错误:调用未定义的方法DomeElement::next_sibling()


有人能告诉我脚本有什么问题吗?

DOM中没有名为next_sibling()的函数。您应该使用DOMNode中定义的属性nextSibling(http://www.php.net/manual/en/class.domnode.php)


错误很明显:没有方法
domeElement::next\u sibling()
。阅读和它的父类。您考虑的是属性
DOMNode::nextSibling

但是,
nextSibling
获取下一个节点,而不是下一个元素。(没有获取下一个元素的DOM方法或属性。您需要继续使用
nextSibling
并检查
nodeType
,直到找到另一个元素。)您的问题是您想要下一个节点,但我想您可能实际上想要下一个元素(空的
)。使用XPath实际上很容易做到这一点,为什么不改为这样做呢

要立即获得:

$els = $xpath->query("//div[@name='node']/following-sibling::*[1]");
要在您已有
时获取它,请执行以下操作:

$nextelement = $xpath->query("following-sibling::*[1]", $currentdiv);

我不知道
php
,但是这个
xpath
得到了它们:

//div[@name="node"]/following-sibling::*[1]
忽略文本节点(希望未测试)

作为一项功能

function nextElement($node, $name=null){
    if(!$node){
        return null;
    }
    $next = $node->nextSibling;
    if(!$next){
        return null;
    }
    if($next->nodeType === 3){
        return self::nextElement($next, $name);
    }
    if($name && $next->nodeName !== $name){
        return null;
    }
    return $next;
}
用法


没错,我想获取下一个元素,但只是错过了used
nextSibling
。非常感谢您的精彩解释,脚本现在可以正常工作了!
//div[@name="node"]/following-sibling::*[1]
foreach($els as $el){
  $next = $el->nextSibling;
  while($next){
    if($next->nodeType!==3){
       $j++;
       break;
    }
    $next = $next->nextSibling;
  }
}
function nextElement($node, $name=null){
    if(!$node){
        return null;
    }
    $next = $node->nextSibling;
    if(!$next){
        return null;
    }
    if($next->nodeType === 3){
        return self::nextElement($next, $name);
    }
    if($name && $next->nodeName !== $name){
        return null;
    }
    return $next;
}
foreach($els as $el)
{
    if(nextElement($el,'div')) $j++;
}