Добавление блока 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. Демо-версия . Р>