Question

J'ai cet objet SimpleXMLElement avec une configuration XML semblable à celle-ci ...

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

$sx = new SimpleXMLElement( $xml );

Maintenant, j'ai une classe nommée Book qui contient des informations. à propos de chaque livre. La même classe peut également cracher l'information de livre. au format XML comme le ci-dessus (le bloc imbriqué) .. exemple,

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

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

Maintenant, j'essaie de trouver un moyen d'utiliser ce bloc XML généré et de l'ajouter en tant qu'enfant de sorte qu'il ressemble maintenant à ... 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>

D'après la documentation que j'ai lue sur SimpleXMLElement, addChild () ne le fera pas pour vous car il ne prend pas en charge les données XML en tant que valeur de balise.

Était-ce utile?

La solution

Deux solutions. Tout d'abord, vous le faites à l'aide de libxml / DOMDocument / SimpleXML: vous devez importer votre objet $ sx dans DOM , créez un DOMDocumentFragment et utilisez 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 démonstration en ligne .

Vous pouvez également étendre à partir de SimpleXMLElement et ajouter une méthode fournissant cela. L'utilisation de cet objet spécialisé vous permettrait alors 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 intègre déjà cette fonctionnalité, telle que SimpleDOM . Vous récupérez SimpleDOM et vous utilisez insertXML (), qui fonctionne comme la méthode addXMLChild () décrivaient.

include 'SimpleDOM.php';

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

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

Autres conseils

Regardez 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. démonstration en ligne .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top