Есть ли способ добавить PHP SimpleXMLElement в другой SimpleXMLElement? - PullRequest
2 голосов
/ 21 июля 2009

Метод "addChild" в SimpleXMLElement выглядит так, как будто он должен быть правильным выбором, но, очевидно, он принимает только строки, представляющие тэг нового дочернего элемента.

Существует нотация Object-Ish для ссылки на узлы дерева и их установки, например, $ simpleXMLNode-> child = value, но это работает только для простых текстовых / числовых значений. Если я попробую следующее:

$s = new SimpleXMLElement('<root/>');
$t = new SimpleXMLElement('<child/>');
$s->a = $t;
echo $s->asXML()

Я получаю:

<?xml version="1.0"?>
<root><a></a></root>

когда я надеялся на:

<?xml version="1.0"?>
<root><a><child/></a></root>

Я думал о преобразовании $ t в строку и последующем ее добавлении (после удаления объявления XML):

$s->a = substr($t->asXML(),22)

Но это дает:

<?xml version="1.0"?>
<root><a>&lt;child/&gt;</a></root>

Опять не то, на что я надеялся.

Есть ли типичный способ для выполнения такого рода вещей с SimpleXML?

Ответы [ 2 ]

7 голосов
/ 21 июля 2009

Эй, неизвестно. Для этого вам необходимо использовать интерфейс DOMElement для ваших объектов SimpleXML.

<?php

$s = new SimpleXMLElement('<root/>');
$t = new DOMElement('child');

$dom = dom_import_simplexml($s);
$dom->appendChild($t);

echo $s->asXML();
// <root><child/></root>

Если вам нужны более конкретные детали, дайте мне знать. В документации и комментариях есть несколько примеров для метода dom_import_simplexml (): http://php.net/dom_import_simplexml

1 голос
/ 11 августа 2009

Я не уверен, поможет ли это, но вы также можете расширить SimpleXML, чтобы работать так, как вы ожидаете. Вот проект, над которым я работал для класса bLibrary Xml . Вы можете настроить его так, чтобы SimpleXml работал так, как вы ожидаете.

...