Domanda

Ho questo oggetto SimpleXMLElement con una configurazione XML simile alla seguente ...

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

$sx = new SimpleXMLElement( $xml );

Ora ho una classe chiamata Book che contiene informazioni. su ogni libro. La stessa classe può anche sputare le informazioni del libro. in formato XML simile al precedente (il blocco nidificato) .. esempio,

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

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

Ora sto cercando di capire un modo in cui posso usare questo blocco XML generato e aggiungerlo come figlio di così che ora sembra ... ad esempio ..

// 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>

Da quale documentazione ho letto su SimpleXMLElement, addChild () non lo farà per te poiché non supporta i dati XML come valore di tag.

È stato utile?

Soluzione

Due soluzioni. Innanzitutto, lo fai con l'aiuto di libxml / DOMDocument / SimpleXML: devi importare il tuo oggetto $ sx in DOM , crea un DOMDocumentFragment e usa 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.

Guarda la Demo online .

Puoi anche estendere da SimpleXMLElement e aggiungere un metodo che lo sta fornendo. L'utilizzo di questo oggetto specializzato ti consentirebbe quindi di creare facilmente quanto segue:

$sx = new MySimpleXMLElement($xml);

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

Un'altra soluzione è quella di utilizzare una libreria XML che ha già questa funzione integrata come SimpleDOM . Prendi SimpleDOM e usi insertXML (), che funziona come il metodo addXMLChild () stavano descrivendo.

include 'SimpleDOM.php';

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

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

Altri suggerimenti

Dai un'occhiata al mio codice:

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

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

echo $doc->saveXML();

Questo modifica il documento XML aggiungendo un frammento XML. Demo online .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top