DOMNode для DOMElement в php

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

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

 $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); 

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

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

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

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

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

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

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

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

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