我用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
}