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

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

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

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

4 ответов


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

вы могли бы пойти с alexn это!--15--> (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 и делать то, что когда-либо. это не решение, но поможет вам найти содержимое и атрибуты со всеми divs . надеюсь, это поможет.


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

$dom->childNodes->item(3)