我读了这个DOMNode文档,我发现DOMNode中没有getelementsbytagname方法。但是,在我的代码中,我可以使用带有DOMNode的getelementsbytagname方法。有人能解释我为什么吗?
有我的代码:
$dom = new DOMDocument;
@$dom->loadHTMLFile('http://www.poemjoy.com/show-8-27-1.html');
$xpath = new DOMXpath($dom);
$articles = $xpath->query('//div[@class="poem_detail"]');
foreach($articles as $tnode)
{
$ep=$tnode->getElementsByTagName('p');
}
$tnode
是DOMNode类型变量。在我之前提到的document中,我没有找到getelementsbytagname方法。为什么我可以使用它?
有人可以向我解释一下吗?
答案 0 :(得分:3)
来自您在问题中链接的文档:
澄清:
以前的海报和看似假设'发现' 未记录的方法(.getElementsByTagName和.getAttribute)就此而言 class(DOMNode)实际上是DOMElement类的方法 继承自DOMNode。
即。 $tnode
是DOMElement
,而不仅仅是DOMNode
。
DOM标准的规范(PHP实现)描述了DOM文档中允许的节点类型。这些是:
Document,DocumentType,DocumentFragment,Element,Text,ProcessingInstruction和Comment
它还注意到这些元素简称为节点,这意味着严格来说,实际上没有DOMNode
这样的东西,而DOMNode
是一般的用于讨论任何一种节点类型的术语。
在您的特定情况下(如标准所示)getElementsByTagName
只是Element
和Document
的成员。
由于你的选择器是选择div
元素,你实际上得到的是DOMElement
个对象而不是DOMNode
个对象的NodeList,你可以使用{{1 }}。但这很危险,因为无法保证所有结果都是getElementsByTagName
个对象,因此在使用该函数之前进行类型检查是很好的。