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);
}
为什么它们不同?返回的 DOMNodeListgetElementsByTagName()
会在删除第一个节点时自动将索引向下移动,而返回的 DOMNodeListquery()
只会使第一个索引为空。还有其他区别吗?