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