Php DOMDocument::getElementsByTagName和DOMXPath::query之间的区别?
DOMDocument::getElementsByTagName()和DOMXPath::query()都返回一个DOMNodeList。然而,它们的工作方式似乎有所不同: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
// 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
进行遍历似乎比遍历其他函数生成的列表更有意义;节点列表的顺序与两者不同