La réponse de Salathe m'a aidé, mais comme j'ai utilisé la méthode addChild de SimpleXMLElement, j'ai cherché une solution pour rendre l'insertion des enfants comme un premier enfant plus transparente. La solution est de prendre cette fonctionnalité en fonction de DOM et de le cacher dans une sous-classe 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;
}
}
Après tout, SimpleXML permet de spécifier quelle classe l'élément à utiliser:
$xml = simplexml_load_file($inputFile, 'SimpleXMLElementEx');
Maintenant, vous pouvez appeler insertChildFirst sur n'importe quel élément pour insérer le nouvel enfant en tant que premier enfant. La méthode renvoie le nouvel élément en tant qu'élément SimpleXML, son utilisation est donc similaire à addChild. Bien sûr, il serait facilement possible de créer une méthode insertChild qui permet de spécifier un élément exact pour insérer l'élément avant, mais puisque je n'en ai pas besoin maintenant, j'ai décidé de ne pas le faire.
Je ne suis pas sûr que vous le pouvez. De la documentation, il semble que SimpleXML soit destiné à une manipulation ** vraiment ** simple. – MvanGeest
Est-ce que je ne peux pas stocker les Cs ailleurs, les supprimer, ajouter B et ajouter Cs à partir de cet emplacement temporaire? Je ne suis pas très versé dans PHP ... –