Pregunta

Tengo este objeto SimpleXMLElement con una configuración XML similar a la siguiente ...

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

$sx = new SimpleXMLElement( $xml );

Ahora tengo una clase llamada Libro que contiene información. sobre cada libro La misma clase también puede escupir la información del libro. en formato XML similar al anterior (el bloque anidado) ... ejemplo,

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

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

Ahora estoy tratando de encontrar una manera en la que pueda usar este bloque XML generado y agregarlo como hijo de modo que ahora se vea como ... por ejemplo ...

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

De la documentación que he leído en SimpleXMLElement, addChild () no lo hará por usted, ya que no admite datos XML como valor de etiqueta.

¿Fue útil?

Solución

Dos soluciones. Primero, lo hace con la ayuda de libxml / DOMDocument / SimpleXML: debe importar su objeto $ sx a DOM , cree un DOMDocumentFragment y use 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.

Consulte la demostración en línea .

También puede ampliar desde SimpleXMLElement y agregar un método que proporcione esto. El uso de este objeto especializado le permitiría crear lo siguiente fácilmente:

$sx = new MySimpleXMLElement($xml);

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

Otra solución es usar una biblioteca XML que ya tenga esta característica incorporada como SimpleDOM . Usted toma SimpleDOM y usa insertXML (), que funciona como el método addXMLChild () estaban describiendo.

include 'SimpleDOM.php';

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

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

Otros consejos

Echa un vistazo a mi código:

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

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

echo $doc->saveXML();

Esto modifica el documento XML agregando un fragmento XML. Demostración en línea .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top