Как получить дочерний объект PHP DOMDocument по индексу

Я пытаюсь получить ребенка PHP DOMDocument. Скажем, у меня есть документ DOM:

<div> <h1 ></h1> <div id=2></div> <div class="test"></div> ... </div> 

У меня есть номер индекса 3. Затем мне нужно получить элемент <div class="test"></div> . В DOMDocument API нет такого метода, как children(3) . Здесь? Как я могу получить ребенка с индексом?

Related of "Как получить дочерний объект PHP DOMDocument по индексу"

Вы можете использовать childNodes . Это свойство элемента DOM, содержащего NodeList, содержащий все дочерние элементы элемента. В идеале вы сможете сделать $el->childNodes->item(2) (обратите внимание, что он основан на 0, а не на 1, поэтому 2 является третьим элементом). Однако это включает текстовые узлы. Поэтому трудно предсказать, какой номер будет у вашего узла. Это, вероятно, не лучшее решение.

Вы можете пойти с решением alexn ( getElementsByTagName('*')->item(2) ), но опять же это имеет свои недостатки. Если ваши узлы имеют дочерние узлы, они также будут включены в выборку. Это может отбросить ваши расчеты.

Моим предпочтительным решением было бы использовать XPath: это, вероятно, самое устойчивое решение, и не особенно сложно.

Вам нужно будет создать объект XPath с $xpath = new DOMXPath($document) где-нибудь, где $document – ваш экземпляр DOMDocument. Я собираюсь предположить, что $el является родительским элементом div, «контекстом», который мы ищем.

 $node = $x->query('*', $el)->item(2); 

Обратите внимание, что опять же мы используем индекс, основанный на 0, чтобы найти, какой элемент в его выборе. Здесь мы рассматриваем дочерние узлы только верхнего уровня div и * выбираем только узлы элементов, поэтому вычисления с текстовыми узлами не нужны.

Если вы используете DOMDocument, вы можете использовать getElementsByTagName('*') который возвращает DomNodeList со всеми элементами вашего документа. Затем вы можете вызвать функцию item которая принимает индекс как параметр:

 $nodes = $dom->getElementsByTagName('*'); $targetNode = $nodes->item(3); 

попробуй это

  foreach($dom->getElementsByTagName('div') as $div) { $class = $div->getAttribute('class'); } 

теперь вы можете сопоставить атрибут class или id этого конкретного div и делать то, что когда-либо. это не решение, но помогает находить содержимое и атрибуты со всеми div'ами. Надеюсь, поможет.

Попробуй это:

 $dom->childNodes->item(3)