2009-12-01 17 views
4

J'ai cet objet SimpleXMLElement avec une configuration XML semblable au suivant ...Ajout d'un bloc de XML comme enfant d'un objet SimpleXMLElement

$xml = <<<EOX 
<books> 
    <book> 
     <name>ABCD</name> 
    </book> 
</books> 
EOX; 

$sx = new SimpleXMLElement($xml); 

Maintenant, j'ai une classe livre nommé qui contient des informations. à propos de chaque livre. La même classe peut également cracher les informations du livre. au format XML s'apparente le précède (le bloc imbriqué) .. par exemple,

$book = new Book('EFGH'); 
$book->genXML(); 

... will generate 
<book> 
    <name>EFGH</name> 
</book> 

Maintenant, je suis en train de trouver un moyen par lequel je peux utiliser ce produit bloc XML et ajouter comme un enfant de sorte que maintenant il ressemble ... par exemple ..

// Non-existent member method. For illustration purposes only. 
$sx->addXMLChild($book->genXML());  

...XML tree now looks like: 
<books> 
    <book> 
     <name>ABCD</name> 
    </book> 
    <book> 
     <name>EFGH</name> 
    </book> 
</books> 

de quels documents j'ai lu sur SimpleXMLElement, addChild() ne sera pas ce fait pour vous car il ne prend pas en charge les données XML comme balise valeur.

+0

En relation: [Existe-t-il un moyen d'ajouter un PHP SimpleXMLElement à un autre SimpleXMLElement?] (Http://stackoverflow.com/q/1157104/367456) – hakre

Répondre

4

Deux solutions. Tout d'abord, vous le faites avec l'aide de libxml/DOMDocument/SimpleXML: vous devez importer votre objet $sx-DOM, créer un DOMDocumentFragment et utiliser DOMDocumentFragment::appendXML():

$doc = dom_import_simplexml($sx)->ownerDocument; 

$fragment = $doc->createDocumentFragment();  
$fragment->appendXML($book->genXML()); 
$doc->documentElement->appendChild($fragment); 

// your original $sx is now already modified. 

Voir la Online Demo.

Vous pouvez également étendre de SimpleXMLElement et ajouter une méthode qui fournit cela. En utilisant cet objet spécialisé serait alors vous permettre de créer facilement les éléments suivants:

$sx = new MySimpleXMLElement($xml); 

$sx->addXML($book->genXML()); 

Une autre solution consiste à utiliser une bibliothèque XML qui a déjà cette fonctionnalité intégrée comme SimpleDOM. Vous saisissez SimpleDOM et vous utilisez insertXML(), qui fonctionne comme la méthode addXMLChild() que vous décrivez.

include 'SimpleDOM.php'; 

$books = simpledom_load_string(
    '<books> 
     <book> 
      <name>ABCD</name> 
     </book> 
    </books>' 
); 

$books->insertXML(
    '<book> 
     <name>EFGH</name> 
    </book>' 
); 
+0

Je choisirais la 1ère méthode car elle n'implique pas toutes les bibliothèques externes. Joué avec le code un peu et a réussi à comprendre la séquence de code exacte. Merci. Cela a aidé bigtime :) –

+0

S'il vous plaît contribuer avec la séquence de code exacte si vous l'avez toujours ...! – maralbjo

+0

Bonjour les enfants, j'ai ajouté un code-exemple qui montre comment cela fonctionne, y compris une démo en ligne. Je ne sais pas pourquoi cela n'a pas été rendu disponible au cours des trois dernières années et demie, car ce Q & A montre un concept basique et utile. Vous pourriez tous avoir eu un super code secret;) - Et oui, de nos jours * SimpleDOM * est totalement superflu à mes yeux. – hakre

3

Jetez un oeil à mon code:

$doc = new DOMDocument();  
$doc->loadXML("<root/>");  

$fragment = $doc->createDocumentFragment();  
$fragment->appendXML("<foo>text</foo><bar>text2</bar>"); 
$doc->documentElement->appendChild($fragment); 

echo $doc->saveXML(); 

Ceci modifie le document XML en ajoutant un fragment XML. Online Demo.

+1

Votre code fonctionne bien et fonctionne: http://eval.in/17709 - Il suffit de supprimer la partie sur la sauvegarde pour le moment, vous avez juste un XML modifiant, problème d'enregistrement sur disque que vous devriez placer dans une question différente. – hakre

+0

@hakre saveXML renvoie une chaîne, elle ne l'enregistre pas réellement sur le disque. – oskarth