【发布时间】:2010-01-19 08:13:24
【问题描述】:
当我打电话时
addChild('actor', 'John Doe');
这个孩子是最后添加的。有没有办法让这个新孩子成为第一个孩子?
【问题讨论】:
当我打电话时
addChild('actor', 'John Doe');
这个孩子是最后添加的。有没有办法让这个新孩子成为第一个孩子?
【问题讨论】:
正如前面提到的,SimpleXML 不支持这一点,因此您必须使用 DOM。以下是我的建议:使用您需要在程序中使用的任何内容扩展 SimpleXMLElement。通过这种方式,您可以将所有 DOM 操作和其他 XML 魔法保留在您的实际程序之外。通过将这两个事项分开,您可以提高可读性和可维护性。
以下是如何使用新方法 prependChild() 扩展 SimpleXMLElement:
class my_node extends SimpleXMLElement
{
public function prependChild($name, $value)
{
$dom = dom_import_simplexml($this);
$new = $dom->insertBefore(
$dom->ownerDocument->createElement($name, $value),
$dom->firstChild
);
return simplexml_import_dom($new, get_class($this));
}
}
$actors = simplexml_load_string(
'<actors>
<actor>Al Pacino</actor>
<actor>Zsa Zsa Gabor</actor>
</actors>',
'my_node'
);
$actors->addChild('actor', 'John Doe - last');
$actors->prependChild('actor', 'John Doe - first');
die($actors->asXML());
【讨论】:
看起来 SimpleXML 不支持这样做,所以你有两个选择:
改用 DOM 模块(或其他 XML 模块之一,可能),并使用 DOMNode::insertBefore method,或
创建一个新的 SimpleXMLElement,复制属性,然后添加新节点,然后添加原始节点的所有子节点,然后用新节点替换原始节点。
更新: 在浏览了更多文档之后,我建议如下(假设您仍然想在大多数情况下坚持使用 SimpleXML,否则,只需直接使用 DOM 来处理所有内容):
$dom_elem = dom_import_simplexml($simple_xml_element);
$dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild);
【讨论】:
假设你可以使用函数 insert_before 你可以使用以下函数:
函数 prependChild(父节点) { parent.insertBefore(节点,parent.firstChild); }
【讨论】: