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

Когда я звоню

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

этот ребенок добавляется последним. Есть ли способ сделать этого нового ребенка первым ребенком?

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

Вот как расширить SimpleXMLElement с помощью нового метода 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()); 

Это не похоже на то, что SimpleXML поддерживает это, поэтому у вас есть два варианта:

  1. Вместо этого используйте модуль DOM (или, возможно, один из других модулей XML), и используйте метод DOMNode :: insertBefore или

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

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

 $dom_elem = dom_import_simplexml($simple_xml_element); $dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild); 

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

function prependChild (parent, node) {parent.insertBefore (node, parent.firstChild); }

Исходная ссылка: XML-вопросы: за пределами DOM