Добавление блока 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 в качестве значения тега.
2 ответа
Два решения. Сначала вы делаете это с помощью 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. Демо онлайн.