Добавление блока XML как дочернего элемента объекта SimpleXMLElement

У меня есть этот объект SimpleXMLElement с настройкой XML, подобной следующей …

$xml = <<<EOX <books> <book> <name>ABCD</name> </book> </books> EOX; $sx = new SimpleXMLElement( $xml ); 

Теперь у меня есть класс с именем Book, который содержит информацию. о каждой книге. Тот же класс также может выплюнуть информацию о книге. в формате XML, аналогичном приведенному выше (вложенный блок). Например,

 $book = new Book( 'EFGH' ); $book->genXML(); ... will generate <book> <name>EFGH</name> </book> 

Теперь я пытаюсь выяснить способ, с помощью которого я могу использовать этот сгенерированный блок XML и добавить его как дочернее, так что теперь это выглядит … например ..

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

Из документации, которую я прочитал в SimpleXMLElement, addChild () не сделает это для вас, поскольку она не поддерживает данные XML как значение тега.

Два решения. Сначала вы делаете это с помощью libxml / DOMDocument / SimpleXML: вам нужно импортировать объект $sx в DOM , создать DOMDocumentFragment и использовать 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. 

См. Онлайн-демонстрацию .

Вы также можете перейти от SimpleXMLElement и добавить метод, который предоставляет это. Используя этот специализированный объект, вы можете легко создать следующее:

 $sx = new MySimpleXMLElement($xml); $sx->addXML($book->genXML()); 

Другое решение – использовать библиотеку XML, которая уже имеет эту встроенную функцию, например SimpleDOM . Вы захватываете SimpleDOM, и вы используете insertXML (), который работает как метод addXMLChild (), который вы описывали.

 include 'SimpleDOM.php'; $books = simpledom_load_string( '<books> <book> <name>ABCD</name> </book> </books>' ); $books->insertXML( '<book> <name>EFGH</name> </book>' ); 

Посмотрите мой код:

 $doc = new DOMDocument(); $doc->loadXML("<root/>"); $fragment = $doc->createDocumentFragment(); $fragment->appendXML("<foo>text</foo><bar>text2</bar>"); $doc->documentElement->appendChild($fragment); echo $doc->saveXML(); 

Это изменяет XML-документ, добавляя фрагмент XML. Демо-версия .