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@AndrewgetElementsByTagName
返回DOMElement
的DOMNodeList
,这就是它被称为get元素的原因。因此,对该列表的项调用domeElement
方法总是安全的。如果IDE无法处理此问题。。。那是另一个问题。PHP不是Java,我们应该相应地对待它们或切换语言。@IonuțG.Stan您在PHP手册中是否有一些参考资料会说DOMNodeList包含DomeElement而不是DOMNode?手册上说只返回了DOMNodeList,没有任何更多的信息,这个列表中到底有什么。默认的假设是它是一个DOMNode,但我遗漏了关于DOMElement的任何内容