我想将DOMNode
对象从调用getElementsByTagName()
转换为DOMElement
,以便在子元素上访问getElementsByTagName()
之类的方法。在任何其他语言中,我会投射并且它会很容易,但经过一些快速查看后,PHP没有对象转换。所以我需要知道的是如何从DOMElement
对象中获取DOMNode
对象。
答案 0 :(得分:15)
你不需要施放任何东西,只需调用方法:
$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);
答案 1 :(得分:2)
这是我在项目中用来最小化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;
}
答案 2 :(得分:1)
您不需要进行任何显式类型转换,只需检查您的DOMNode对象是否具有XML_ELEMENT_NODE
的nodeType。
PHP对此非常满意。
如果您使用PHPLint检查代码,您会注意到PHPLint抱怨在DOMNode对象上使用getElementsByTagName
。要解决这个问题,你需要跳过以下环节:
/*.object.*/ $obj = $node;
$element = /*.(DOMElement).*/ $obj;
然后你将得到一个正确类型的$ element变量,并且没有来自PHPLint的抱怨。
答案 3 :(得分:0)
我知道这主要是一个讨厌的IDE问题。
原因是$DOMNodeList->item(0)
返回一个DOMNode(或者至少IDE认为是这样)。
要解决此问题,您必须将$DOMDocument->getElementsByTagName( $tagName )->item($index)
解压缩为自己的方法。在DOCBlock中,您将@return语句设置为DOMElement,以修复检查问题。
这至少在PHPStorm中起作用。
答案 4 :(得分:0)
如果有人正在 IntelliJ / PHPStorm 中寻找更优雅的解决方案。我设法解决了这样的问题:
private function doSomething(DOMNode $child){
if(!$child instanceof DOMElement)
throw new Exception('DOMElement expected but got something else.');
$attr = $child->getAttribute('attr'); //recognized by PHPStorm now as DOMElement
/* and more code */
}
我所有的代码都正确地假定DOMNode是DOMElement的超类,而且也是DOMComment等。例如,当我需要DOMElement使用getAttribute
时,我会添加上面的检查。