Php DOMDocument::getElementsByTagName和DOMXPath::query之间的区别?

Php DOMDocument::getElementsByTagName和DOMXPath::query之间的区别?,php,dom,Php,Dom,DOMDocument::getElementsByTagName()和DOMXPath::query()都返回一个DOMNodeList。然而,它们的工作方式似乎有所不同: // Works as expected, removes all scripts $r=$doc->getElementsByTagName('script'); while($r->length){ $el=$r->item(0); $el->parentNode->rem

DOMDocument::getElementsByTagName()和DOMXPath::query()都返回一个DOMNodeList。然而,它们的工作方式似乎有所不同:

// Works as expected, removes all scripts
$r=$doc->getElementsByTagName('script');
while($r->length){
    $el=$r->item(0);
    $el->parentNode->removeChild($el);
}

// Error
$r=$xpath->query('//comment()');
while($r->length){
    $el=$r->item(0);
    $el->parentNode->removeChild($el);
}

// Works as expected, removes all comments
$r=$xpath->query('//comment()');
foreach($r as $el){
    $el->parentNode->removeChild($el);

}

为什么它们不同?当删除第一个节点时,
getElementsByTagName()
返回的DOMNodeList会自动下移索引,而
query()
返回的DOMNodeList只会使第一个索引为空。还有其他区别吗?

我认为问题在于
$r
中的节点列表是否为“活动”:它是否会在修改DOM时自动更新?看起来像是
DOMDocument
返回了一个活动节点列表,
DOMXPath
没有。PHP的XML实现有故障。我面临着很多问题。我还注意到使用
query
进行遍历似乎比遍历其他函数生成的列表更有意义;节点列表的顺序与两者不同