Quand j'appelleSimpleXML comment préfixer un enfant dans un noeud?
addChild('actor', 'John Doe');
cet enfant est ajouté dans la dernière. Y a-t-il un moyen de faire de ce nouvel enfant un premier enfant?
Quand j'appelleSimpleXML comment préfixer un enfant dans un noeud?
addChild('actor', 'John Doe');
cet enfant est ajouté dans la dernière. Y a-t-il un moyen de faire de ce nouvel enfant un premier enfant?
Comme il a été mentionné, SimpleXML ne prend pas en charge que si vous auriez à utiliser DOM. Voici ce que je recommande: étendre SimpleXMLElement avec tout ce que vous devez utiliser dans vos programmes. De cette façon, vous pouvez garder toute la manipulation DOM et toute autre magie XML en dehors de votre programme actuel. En gardant les deux sujets séparés, vous améliorez la lisibilité et la maintenabilité.
Voici comment étendre SimpleXMLElement avec une nouvelle méthode prependChild():
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());
Il ne ressemble pas à SimpleXML prend en charge le faire, vous avez deux options:
Utilisez le module DOM au lieu (ou l'un des autres modules XML, probablement), et utiliser le DOMNode::insertBefore method, ou
Créez un nouveau SimpleXMLElement, copiez les attributs, puis ajoutez votre nouveau noeud, puis ajoutez tous les enfants de votre noeud d'origine, puis remplacez l'original par le nouveau.
mise à jour: Après un peu plus regardant à travers les documents, je vous suggère quelque chose comme ce qui suit (en supposant que vous voulez toujours rester avec SimpleXML pour la plupart, sinon, il suffit d'utiliser DOM directement tout):
$dom_elem = dom_import_simplexml($simple_xml_element);
$dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild);
J'utilise déjà 2ème approche. Mais il semblait laid donc pensé à demander de meilleures alternatives. – understack
En supposant que vous pouvez utiliser la fonction insert_before vous pouvez utiliser la fonction suivante:
fonction prependChild (parent, noeud) { parent.insertBefore (noeud, parent.firstChild); }
référence Source: XML Matters: Beyond the DOM
+1 pour la définition de fonction – understack
excellente réponse. – understack
Exactement ce que je cherchais - merci –
Appel à la méthode non définie SimpleXMLElement :: prependChild() – user254153