Я пытаюсь получить ребенка PHP DOMDocument. Скажем, у меня есть документ DOM:
<div> <h1 ></h1> <div id=2></div> <div class="test"></div> ... </div>
У меня есть номер индекса 3. Затем мне нужно получить элемент <div class="test"></div>
. В DOMDocument API нет такого метода, как children(3)
. Здесь? Как я могу получить ребенка с индексом?
Вы можете использовать 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)