在PHP DOM中选择所选节点的下一个节点?
到目前为止,我正在处理这样一个HTML文件在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
<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++;
}