Adicionando um bloco de XML como filho de um objeto SimpleXMLElement
Pergunta
Eu tenho esse objeto SimpleXMLElement com uma configuração XML semelhante ao seguinte ...
$xml = <<<EOX
<books>
<book>
<name>ABCD</name>
</book>
</books>
EOX;
$sx = new SimpleXMLElement( $xml );
Agora eu tenho uma classe chamada Livro que contém informações. sobre cada livro. A mesma classe também pode cuspir para fora a informação livro. em formato XML semelhante ao acima (o bloco aninhado) .. exemplo,
$book = new Book( 'EFGH' );
$book->genXML();
... will generate
<book>
<name>EFGH</name>
</book>
Agora eu estou tentando descobrir uma maneira pela qual eu posso usar este bloco XML gerado e anexar como uma criança de modo que agora parece que ... por exemplo ..
// 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 que documentação que já li sobre SimpleXMLElement, addChild () não vai conseguir este feito para você como ele não dados XML de apoio como o valor tag.
Solução
Duas soluções. Primeiro, você fazê-lo com a ajuda da libxml / DOMDocument / SimpleXML: você tem que importar o objeto $sx
para DOM , criar um DOMDocumentFragment
e uso 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.
Veja a Demonstração Online .
Você também pode se estender de SimpleXMLElement e adicione um método que está fornecendo isso. Usando este objeto especializada em seguida, lhe permitiria criar a seguinte facilmente:
$sx = new MySimpleXMLElement($xml);
$sx->addXML($book->genXML());
Outra solução é usar uma biblioteca XML que já tenha esse recurso built-in como SimpleDOM . Você agarra SimpleDOM e você usar InsertXML (), que funciona como o método addXMLChild () você estavam descrevendo.
include 'SimpleDOM.php';
$books = simpledom_load_string(
'<books>
<book>
<name>ABCD</name>
</book>
</books>'
);
$books->insertXML(
'<book>
<name>EFGH</name>
</book>'
);
Outras dicas
Tenha uma olhada no meu 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();
Isso modifica o documento XML, adicionando um fragmento XML. Demonstração Online .