DOMNode to DOMElement in php

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

I want to convert a DOMNode object from a call to getElementsByTagName() to a DOMElement in order to access methods like getElementsByTagName() on the child element. In any other language, I would cast and it would be easy, but after some quick looking, PHP does not have object casting. So what I need to know is how to get a DOMElement object from a DOMNode object.

回答1:

You don't need to cast anything, just call the method:

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

And by the way, DOMElement is a subclass of DOMNode. If you were talking about a DOMNodeList, then accessing the elements in such a list can be done, be either the method presented above, with a foreach() loop, either by using the item() method of DOMNodeList:

$link_0 = $dom->getElementsByTagName('a')->item(0); 


回答2:

You don't need to do any explicit typecasting, just check if your DOMNode object has a nodeType of XML_ELEMENT_NODE.

PHP will be perfectly happy with this.

If you use PHPLint to check your code you will notice that PHPLint complains about using getElementsByTagName on a DOMNode object. To get around this you need to jump through the following hoop:

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

Then you will have a $element variable of the correct type and no complaints from PHPLint.



回答3:

This is what I use in my project to minimize IDE warning.

/**  * Cast a DOMNode into a DOMElement  */     function cast_e(DOMNode $node) : DOMElement {     if ($node) {         if ($node->nodeType === XML_ELEMENT_NODE) {             return $node;         }     }     return null; } 


回答4:

I know this is mostly an annoying IDE problem.

The reason is $DOMNodeList->item(0) witch returns a DOMNode ( or at least the IDE thinks so ).

To fix this you will have to Extract out the $DOMDocument->getElementsByTagName( $tagName )->item($index) into a method of its own. In the DOCBlock you set the @return statement to DOMElement witch fixes the inspection problem.

This Works at least in PHPStorm.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!