DOM-getelementsbytagname方法在DOMNode类中不存在

时间:2018-05-01 16:18:50

标签: php

我读了这个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方法。为什么我可以使用它?

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:3)

来自您在问题中链接的文档:

  

澄清:

     

以前的海报和看似假设'发现'   未记录的方法(.getElementsByTagName和.getAttribute)就此而言   class(DOMNode)实际上是DOMElement类的方法   继承自DOMNode。

     

请参阅:http://www.php.net/manual/en/class.domelement.php

即。 $tnodeDOMElement,而不仅仅是DOMNode

DOM标准的规范(PHP实现)描述了DOM文档中允许的节点类型。这些是:

  

Document,DocumentType,DocumentFragment,Element,Text,ProcessingInstruction和Comment

     

Source

它还注意到这些元素简称为节点,这意味着严格来说,实际上没有DOMNode这样的东西,而DOMNode是一般的用于讨论任何一种节点类型的术语。

在您的特定情况下(如标准所示)getElementsByTagName只是ElementDocument的成员。

由于你的选择器是选择div 元素,你实际上得到的是DOMElement个对象而不是DOMNode个对象的NodeList,你可以使用{{1 }}。但这很危险,因为无法保证所有结果都是getElementsByTagName个对象,因此在使用该函数之前进行类型检查是很好的。