DOMNode для DOMElement в php

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

Ответ 1

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

$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

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

PHP будет в восторге от этого.

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

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

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

Ответ 3

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

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

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

Это работает как минимум в PHPStorm.

Ответ 4

Это то, что я использую в своем проекте, чтобы свести к минимуму предупреждение 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;
}