2010-01-19 4 views

Répondre

20

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()); 
+0

excellente réponse. – understack

+0

Exactement ce que je cherchais - merci –

+0

Appel à la méthode non définie SimpleXMLElement :: prependChild() – user254153

5

Il ne ressemble pas à SimpleXML prend en charge le faire, vous avez deux options:

  1. Utilisez le module DOM au lieu (ou l'un des autres modules XML, probablement), et utiliser le DOMNode::insertBefore method, ou

  2. 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); 
+0

J'utilise déjà 2ème approche. Mais il semblait laid donc pensé à demander de meilleures alternatives. – understack

2

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

+0

+1 pour la définition de fonction – understack

Questions connexes