La respuesta de Salathe me ayudó, pero desde que usé el método addChild de SimpleXMLElement, busqué una solución para hacer que la inserción de niños como primer hijo sea más transparente. La solución es tomar esa funcionalidad basada en DOM y esconderlo en una subclase de SimpleXMLElement:
class SimpleXMLElementEx extends SimpleXMLElement
{
public function insertChildFirst($name, $value, $namespace)
{
// Convert ourselves to DOM.
$targetDom = dom_import_simplexml($this);
// Check for children
$hasChildren = $targetDom->hasChildNodes();
// Create the new childnode.
$newNode = $this->addChild($name, $value, $namespace);
// Put in the first position.
if ($hasChildren)
{
$newNodeDom = $targetDom->ownerDocument->importNode(dom_import_simplexml($newNode), true);
$targetDom->insertBefore($newNodeDom, $targetDom->firstChild);
}
// Return the new node.
return $newNode;
}
}
Después de todo, SimpleXML permite especificar qué clase de elemento de empleo:
$xml = simplexml_load_file($inputFile, 'SimpleXMLElementEx');
Ahora puede llamar insertChildFirst en cualquier elemento para insertar al nuevo hijo como primer hijo. El método devuelve el nuevo elemento como un elemento SimpleXML, por lo que su uso es similar a addChild. Por supuesto, sería fácilmente posible crear un método insertChild que permita especificar un elemento exacto para insertar el elemento antes, pero como no lo necesito ahora, decidí no hacerlo.
No estoy seguro de que pueda hacerlo. De la documentación, parece que SimpleXML está diseñado para una manipulación ** realmente ** simple. – MvanGeest
¿No puedo de alguna manera almacenar C en otro lugar, eliminarlos, agregar B y volver a agregar Cs desde esa ubicación temporal? Simplemente no soy muy versado en PHP ... –