SimpleXML, как предварительно ожидать ребенка в узле?

Когда я звоню

addChild('actor', 'John Doe');

этот ребенок включен последнее. Существует ли способ сделать этого нового ребенка первым ребенком?

10
задан understack 19 January 2010 в 08:13
поделиться

3 ответа

Как оно упоминалось, Simplexml не поддерживает так, чтобы вам придется использовать DOM. Вот что я рекомендую: расширить SimplexMlElement с тем, что вам нужно использовать в ваших программах. Таким образом, вы можете сохранить все манипулирование DOM и другую магию XML за пределами вашей реальной программы. Сохраняя эти два вопроса, вы улучшаете читаемость и ремонтопригодность.

Вот как расширить симплекселэлемент с новым методом PrependChild ():

class my_node extends SimpleXMLElement
{
    public function prependChild($name, $value)
    {
        $dom = dom_import_simplexml($this);

        $new = $dom->insertBefore(
            $dom->ownerDocument->createElement($name, $value),
            $dom->firstChild
        );

        return simplexml_import_dom($new, get_class($this));
    }
}

$actors = simplexml_load_string(
    '<actors>
        <actor>Al Pacino</actor>
        <actor>Zsa Zsa Gabor</actor>
    </actors>',
    'my_node'
);

$actors->addChild('actor', 'John Doe - last');
$actors->prependChild('actor', 'John Doe - first');

die($actors->asXML());
21
ответ дан 3 December 2019 в 15:35
поделиться

Предположим, что вы можете использовать функцию insert_beforex, прежде чем использовать следующую функцию:

функция prependChild(родительская, узел) { parent.insertBefore(node, parent.firstChild); }

Ссылка на источник: XML Matters: За пределами DOM

2
ответ дан 3 December 2019 в 15:35
поделиться

Это не похоже на поддержку Simplexml, делая это, поэтому у вас есть два варианта:

  1. Модуль DOM вместо (или один из других модулей XML, возможно) и использует метод DOMNODE :: INSERTBEFORE , или

  2. Создайте новый симплексМлемент, скопируйте на атрибуты, затем добавьте свой новый узел, Затем добавьте все детей вашего исходного узла после этого, затем замените оригинал новым.

Обновление: После немного больше просматривая документы, я предложил что-то вроде следующего (предполагая, что вы все еще хотите придерживаться симплекселма по большей части, в противном случае просто используйте DOM непосредственно для всего):

$dom_elem = dom_import_simplexml($simple_xml_element);
$dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild);
5
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: