php中的DOMNode到DOMElement

时间:2009-06-15 00:15:08

标签: php xml dom

我想将DOMNode对象从调用getElementsByTagName()转换为DOMElement,以便在子元素上访问getElementsByTagName()之类的方法。在任何其他语言中,我会投射并且它会很容易,但经过一些快速查看后,PHP没有对象转换。所以我需要知道的是如何从DOMElement对象中获取DOMNode对象。

5 个答案:

答案 0 :(得分:15)

你不需要施放任何东西,只需调用方法:

$links = $dom->getElementsByTagName('a');

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

顺便说一下,DOMElementDOMNode的子类。如果您正在讨论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时,我会添加上面的检查。

相关问题