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);
}
}
}
}