У меня есть этот объект 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. Демо-версия .