Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中DOMNode到DOMElement_Php_Xml_Dom - Fatal编程技术网

php中DOMNode到DOMElement

php中DOMNode到DOMElement,php,xml,dom,Php,Xml,Dom,我想将DOMNode对象从调用getElementsByTagName()转换为DOMElement,以便访问子元素上的getElementsByTagName()等方法。在任何其他语言中,我都会进行对象转换,这很容易,但是经过一些快速查找之后,PHP没有对象转换。因此,我需要知道的是如何从DOMNode对象获取DOMElement对象。您不需要强制转换任何内容,只需调用以下方法: $links = $dom->getElementsByTagName('a'); foreach ($l

我想将
DOMNode
对象从调用
getElementsByTagName()
转换为
DOMElement
,以便访问子元素上的
getElementsByTagName()
等方法。在任何其他语言中,我都会进行对象转换,这很容易,但是经过一些快速查找之后,PHP没有对象转换。因此,我需要知道的是如何从
DOMNode
对象获取
DOMElement
对象。

您不需要强制转换任何内容,只需调用以下方法:

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

foreach ($links as $link) {
    $spans = $link->getElementsByTagName('span');
}
顺便说一下,
DOMElement
DOMNode
的一个子类。如果您谈论的是
DOMNodeList
,那么可以使用上面介绍的方法,通过
DOMNodeList
item()
方法,使用
foreach()
循环,访问此类列表中的元素:

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

您不需要执行任何显式类型转换,只需检查DOMNode对象的节点类型是否为
XML\u ELEMENT\u NODE

PHP将对此非常满意

如果使用检查代码,您会注意到PHPLint抱怨在DOMNode对象上使用
getElementsByTagName
。要绕过这一点,您需要跳过以下障碍:

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

然后,您将有一个正确类型的$element变量,并且不会有来自PHPLint的抱怨。

我知道这主要是一个恼人的IDE问题

原因是
$DOMNodeList->item(0)
开关返回一个DOMNode(或者至少IDE这样认为)

要解决此问题,您必须将
$DOMDocument->getElementsByTagName($tagName)->item($index)
提取到自己的方法中。在DOCBlock中,您将@return语句设置为domeElement,从而修复检查问题


这至少在PHPStorm中有效。

这是我在项目中用来最小化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;
}

如果有人在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是DomeElement的de超类,但也是DOMComment等。例如,当我需要DomeElement使用
getAttribute
时,我添加了上面的检查。

您是否检查了getElementsByTagName()是否实际返回DomeElement对象,并带有类似if($item instanceof DomeElement)的内容?如果是,您不需要强制转换,您可以像使用DOMElementgetElementsByTagName()一样使用$item返回一个DOMNodeList,我确实假设DOMNodeList是一个DOMNode列表。我认为您必须强制转换的原因是,当我想执行相同的过程时,我必须用java强制转换。有趣的是getElementById返回DomeElement,但getElementsByTagName返回一个列表,其中每个项都是DOMNode!!DOMNodeList是否返回过不是DomeElement的DOMNode?只需说DOMNode,不要提DOMElement。例如,如果DOMNodeList来自?@user2016290是的,
DOMXPath::query
甚至
DOMNode::childNodes
。DomeElement有额外的方法,这些方法在DOMNode中不可用。例如getAttribute()。虽然如果您在DOMNode上使用此方法,它将在PHP中工作,但它不会在IDE中工作(在弹出方法列表中不可用)。所以问题是:如何从getElementsByTagName@Andrew
getElementsByTagName
返回
DOMElement
DOMNodeList
,这就是它被称为get元素的原因。因此,对该列表的项调用
domeElement
方法总是安全的。如果IDE无法处理此问题。。。那是另一个问题。PHP不是Java,我们应该相应地对待它们或切换语言。@IonuțG.Stan您在PHP手册中是否有一些参考资料会说DOMNodeList包含DomeElement而不是DOMNode?手册上说只返回了DOMNodeList,没有任何更多的信息,这个列表中到底有什么。默认的假设是它是一个DOMNode,但我遗漏了关于DOMElement的任何内容