php – 为什么DomDocument getElementsByTagName会返回一半NodeList?
发布时间:2020-05-25 10:28:21 所属栏目:PHP 来源:互联网
导读:我使用DomDocument生成一些非标准标记 HTML,结果如下: /* Input HTML div id=toobar_top widget id=flag_holder/widget widget id=horizontal_menu/widget /div div id=header widget name
|
我使用DomDocument生成一些非标准标记 HTML,结果如下: /* Input HTML
<div id="toobar_top">
<widget id="flag_holder"></widget>
<widget id="horizontal_menu"></widget>
</div>
<div id="header">
<widget name="header"></widget>
</div>
*/
我想要做的是用一些有用的东西“翻译”每个小部件……它们是带有参数的简单占位符. 该类的函数提取是: private function widgeter($doc) { //Give it an DomDocument HTML containing <widget> elements and will translate them into usable stuff
$this->_widgetList = $doc->getElementsByTagName($this->_widgetTransformTo);
foreach ($this->_widgetList as $widget) {
$data = array();
if ($widget->hasAttributes()) {
foreach ($widget->attributes as $attribute) {
$data[][$attribute->name] = $attribute->value;
// @TODO: Implements Widget Transformation
}
}
// Next 2 lines are just for debug
$string = serialize($data);
$newWidget = $doc->createElement('p',$string);
$widget->parentNode->replaceChild($newWidget,$widget);
}
return $doc;
}
然后,当我保存HTML()$doc时,我看到: /* Output HTML
<div id="toobar_top">
<p>[{"id":"flag_holder"}]</p>
<widget id="horizontal_menu"></widget>
</div>
<div id="header">
<p>[{"id":"header"}]</p>
</div>
*/
为什么“horizontal_menu”没有被翻译? 小部件的位置并不重要(我尝试只使用一个包含所有小部件的div,每个小部件使用div). 我弄不清楚…… 之所以发生这种情况,是因为您在循环它们的同时替换DOMNodeList中的元素. DOMNodeList不是数组,因此foreach不对副本进行操作,而是对对象本身进行操作.基本上,我认为正在发生的事情是: >您替换< widget>的第一个实例(第0项). 您需要做的是将元素保存在数组中然后更改它们,而不是在DOMNodeList上循环: $this->_widgetList = array();
foreach ($domNodeList as $node) {
$this->_widgetList[] = $node;
}
foreach ($this->_widgetList as $widget) {
// do stuff
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
