11
votes

SimplexML: Ajouter un arbre à un autre

J'ai deux arbres XML et aimerais ajouter un arbre comme une feuille à l'autre.

Apparemment: P>

<root>
  aaa
  <bbb/>
  ccc
</root>


0 commentaires

4 Réponses :


30
votes

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;


1 commentaires

Lorsque je fais cela, les espaces de noms sur le noeud que j'importent sont jetés. Comment puis-je empêcher cela?



0
votes

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


0 commentaires

8
votes

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


1 commentaires

C'était simple serviable. Pour mes données, je devais envelopper le deuxième paramètre de AddChild dans HTMLSpecialchars ()



12
votes

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


0 commentaires