Как получить дочерний 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 . надеюсь, это поможет.