J'ai deux arbres XML et aimerais ajouter un arbre comme une feuille à l'autre.
Apparemment: P>
<root> aaa <bbb/> ccc </root>
4 Réponses :
Vous ne pouvez pas ajouter un "arbre" directement à l'aide de SimplexML, comme vous l'avez vu. Toutefois, vous pouvez utiliser des méthodes DOM pour faire la forte levée pour vous, tout en travaillant sur le même XML sous-jacent.
$xmldict = new SimpleXMLElement('<dictionary><a/><b/><c/></dictionary>'); $kitty = new SimpleXMLElement('<cat><sound>meow</sound><texture>fuzzy</texture></cat>'); // Create new DOMElements from the two SimpleXMLElements $domdict = dom_import_simplexml($xmldict->c); $domcat = dom_import_simplexml($kitty); // Import the <cat> into the dictionary document $domcat = $domdict->ownerDocument->importNode($domcat, TRUE); // Append the <cat> to <c> in the dictionary $domdict->appendChild($domcat); // We can still use SimpleXML! (meow) echo $xmldict->c->cat->sound;
Lorsque je fais cela, les espaces de noms sur le noeud que j'importent sont jetés. Comment puis-je empêcher cela?
très gentil theo heikonnen Légèrement peaufinant pour le faire fonctionner comme je voulais
function addsubtree(&$xml1,&$xml2) {// Create new DOMElements from the two SimpleXMLElements $dom1 = dom_import_simplexml($xml1); $dom2 = dom_import_simplexml($xml2); // Import the into the document $dom2 = $dom1->ownerDocument->importNode($dom2, TRUE); // Append the to $dom1->appendChild($dom2); } $xml1 = new SimpleXMLElement('<xml/>'); $xml2 = new SimpleXMLElement('<sub/>'); $xml2->addChild('test','data'); $temp=$xml1->addChild('sub1'); header('Content-type: text/xml'); header('Pragma: public'); header('Cache-control: private'); header('Expires: -1'); addsubtree($temp,$xml2); // We can still use SimpleXML! (meow) echo $xml1->asXML();
Ceci est une belle solution de commentaires sur manuel PHP Page (Utilisation uniquement SimplexML, pas DOM):
function append_simplexml(&$simplexml_to, &$simplexml_from) { foreach ($simplexml_from->children() as $simplexml_child) { $simplexml_temp = $simplexml_to->addChild($simplexml_child->getName(), (string) $simplexml_child); foreach ($simplexml_child->attributes() as $attr_key => $attr_value) { $simplexml_temp->addAttribute($attr_key, $attr_value); } append_simplexml($simplexml_temp, $simplexml_child); } }
C'était simple serviable. Pour mes données, je devais envelopper le deuxième paramètre de AddChild dans HTMLSpecialchars ()
Vous pouvez utiliser ce cours sur des objets SimplexML acceptant les enfants Ajoutez
<?php class MySimpleXMLElement extends SimpleXMLElement { /** * Add SimpleXMLElement code into a SimpleXMLElement * * @param MySimpleXMLElement $append */ public function appendXML($append) { if ($append) { if (strlen(trim((string)$append)) == 0) { $xml = $this->addChild($append->getName()); } else { $xml = $this->addChild($append->getName(), (string)$append); } foreach ($append->children() as $child) { $xml->appendXML($child); } foreach ($append->attributes() as $n => $v) { $xml->addAttribute($n, $v); } } } }