DOMNode для DOMElement в php - PullRequest
       40

DOMNode для DOMElement в php

10 голосов
/ 15 июня 2009

Я хочу преобразовать объект DOMNode из вызова в getElementsByTagName() в DOMElement, чтобы получить доступ к таким методам, как getElementsByTagName() для дочернего элемента. На любом другом языке я бы произвел приведение, и это было бы легко, но после некоторого быстрого просмотра PHP не имеет приведения объектов. Поэтому мне нужно знать, как получить объект DOMElement из объекта DOMNode.

Ответы [ 4 ]

15 голосов
/ 15 июня 2009

Вам не нужно ничего разыгрывать, просто вызовите метод:

$links = $dom->getElementsByTagName('a');

foreach ($links as $link) {
    $spans = $link->getElementsByTagName('span');
}

И, кстати, DOMElement является подклассом DOMNode. Если вы говорили о DOMNodeList, то получить доступ к элементам в таком списке можно, либо с помощью метода, представленного выше, с циклом foreach(), либо с помощью метода item() из DOMNodeList:

$link_0 = $dom->getElementsByTagName('a')->item(0);
2 голосов
/ 09 февраля 2018

Это то, что я использую в своем проекте, чтобы минимизировать предупреждение IDE.

/**
 * Cast a DOMNode into a DOMElement
 */
    function cast_e(DOMNode $node) : DOMElement {
    if ($node) {
        if ($node->nodeType === XML_ELEMENT_NODE) {
            return $node;
        }
    }
    return null;
}
1 голос
/ 03 июля 2009

Вам не нужно выполнять явное приведение типов, просто проверьте, имеет ли ваш объект DOMNode параметр nodeType XML_ELEMENT_NODE.

PHP будет очень доволен этим.

Если вы используете PHPLint для проверки своего кода, вы заметите, что PHPLint жалуется на использование getElementsByTagName для объекта DOMNode. Чтобы обойти это, вам нужно прыгнуть через следующий обруч:

/*.object.*/ $obj = $node;
$element = /*.(DOMElement).*/ $obj;

Тогда у вас будет переменная $ element правильного типа и никаких жалоб от PHPLint.

0 голосов
/ 18 октября 2015

Я знаю, что это в основном раздражающая проблема IDE.

Причина в том, что $DOMNodeList->item(0) ведьма возвращает DOMNode (или, по крайней мере, IDE так считает).

Чтобы это исправить, вам придется извлечь $DOMDocument->getElementsByTagName( $tagName )->item($index) в собственный метод. В DOCBlock вы устанавливаете для оператора @return значение DOMElement, которое решает проблему проверки.

Это работает по крайней мере в PHPStorm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...