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

StackOverflow https://stackoverflow.com/questions/1824568

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top