nextSibling не работает при работе с PHP DOMDocument (решено)

Я попытался получить следующий элемент, используя nextSibling и следующий код не работает. Я получил ошибку, как показано ниже. PHP Предупреждение: неверный аргумент, предоставленный foreach () в /php/dom.php в строке 35

это должно быть вызвано нулевым значением в цикле foreach.

но если я изменю его, чтобы получить предыдущий элемент, используя 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); } } } 

Solutions Collecting From Web of "nextSibling не работает при работе с PHP DOMDocument (решено)"

Поскольку у вашего документа есть пробелы, разделяющие элементы, вам действительно нужно использовать:
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; 

Следующий брат – фактически текстовый узел, который не имеет дочерних узлов для итерации; вы можете использовать эту вспомогательную функцию, чтобы вместо этого получить следующий элемент:

 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); } }