使用PHP DOMDocument时,nextSibling不起作用

时间:2013-12-31 03:02:57

标签: php domdocument

我尝试使用nextSibling获取以下元素,但以下代码不起作用。 我有一个错误如下 PHP警告:为第35行的/php/dom.php中的foreach()提供的参数无效

必须由foreach循环中的null值引起。

但如果我修改它以使用previousSibling获取前一个元素,它会按预期工作。

$doc = new DOMDocument();
$html = <<<HTML
<html>
<body>
<ul id="list">
<li>Foo</li>
<li>Bar</li>
</ul>
<h2 class = 'test'>heading2</h2>
<ul id="list2">
<li>list1</li>
<li>list2</li>
</ul>
</body>
</html>
HTML;

$doc ->loadHTML($html);

$DOMNodelist = $doc->getElementsByTagName('*');

foreach($DOMNodelist as $node) {
    if ($node -> hasAttribute('class')) {    
        foreach($node -> nextSibling ->childNodes as $morenodes) {
           print_r($morenodes);
       }
    }
}

2 个答案:

答案 0 :(得分:3)

下一个兄弟实际上是一个文本节点,没有任何子节点可以迭代;您可以使用此辅助函数来获取下一个兄弟元素:

function nextElementSibling($node)
{
    while ($node && ($node = $node->nextSibling)) {
        if ($node instanceof DOMElement) {
            break;
        }
    }
    return $node;
}

if ($node->hasAttribute('class')) {
    foreach(nextElementSibling($node)->childNodes as $morenodes) {
       print_r($morenodes);
   }
}

答案 1 :(得分:3)

因为你的文件有空格分隔元素,你实际上需要使用:
nextSibling->nextSibling
或者,我这样做的方式,因为你已经有'*'为所有元素生成的列表,我把它写成:

foreach($DOMNodelist as $i=>$node) {
    if ($node -> hasAttribute('class')) {
        foreach($DOMNodelist->item($i+1)->childNodes as $morenodes) {
           print_r($morenodes);
       }
    }
}

或者您可以从文档中删除空格:

$html = <<<HTML
<html><body><ul id="list"><li>Foo</li><li>Bar</li></ul><h2 class = 'test'>heading3</h2><h3>heading3</h3><ul id="list2"><li>list2</li><li>list2</li></ul></body></html>
HTML;
相关问题