当我打电话
addChild('actor', 'John Doe');
这个孩子在最后添加。有没有办法让这个新生儿成为第一个孩子?
答案 0 :(得分:21)
正如它所提到的,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());
答案 1 :(得分:5)
看起来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);
答案 2 :(得分:2)
假设您可以使用insert_before函数,则可以使用以下函数:
function prependChild(parent,node){ parent.insertBefore(node,parent.firstChild); }