DOMNode в DOMElement в php
Я хочу, чтобы преобразовать DOMNode
объект из вызова getElementsByTagName()
до DOMElement
для доступа к таким методам, как getElementsByTagName()
на дочернем элементе. На любом другом языке я бы бросил, и это было бы легко, но после некоторого быстрого просмотра PHP не имеет объектного кастинга. Поэтому мне нужно знать, как получить DOMElement
объект
4 ответов
вам не нужно ничего, просто вызовите метод:
$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 правильного типа и никаких жалоб от Фплинта.
Это то, что я использую в своем проекте для минимизации предупреждения 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;
}
Я знаю, что это в основном раздражающая проблема IDE.
причина $DOMNodeList->item(0)
witch возвращает DOMNode (или, по крайней мере, IDE так думает ).
чтобы исправить это, вам придется извлечь $DOMDocument->getElementsByTagName( $tagName )->item($index)
в свой собственный метод. В DOCBlock вы устанавливаете оператор @return в DOMElement witch исправляет проблему проверки.
это работает, по крайней мере, в PHPStorm.