Ответ Салате мне помог, но так как я использовал метод addChild в SimpleXMLElement, я искал решение, чтобы сделать вставку потомков в качестве первого потомка более прозрачной. Решение состоит в том, чтобы взять эту функциональность на основе DOM и скрыть ее в подклассе SimpleXMLElement:
class SimpleXMLElementEx extends SimpleXMLElement
{
public function insertChildFirst($name, $value, $namespace)
{
// Convert ourselves to DOM.
$targetDom = dom_import_simplexml($this);
// Check for children
$hasChildren = $targetDom->hasChildNodes();
// Create the new childnode.
$newNode = $this->addChild($name, $value, $namespace);
// Put in the first position.
if ($hasChildren)
{
$newNodeDom = $targetDom->ownerDocument->importNode(dom_import_simplexml($newNode), true);
$targetDom->insertBefore($newNodeDom, $targetDom->firstChild);
}
// Return the new node.
return $newNode;
}
}
В конце концов, SimpleXML позволяет указать, какой класс элементов использовать:
$xml = simplexml_load_file($inputFile, 'SimpleXMLElementEx');
Теперь вы можете вызывать insertChildFirst для любого элемента, чтобы вставить новый дочерний элемент в качестве первого дочернего элемента. Метод возвращает новый элемент как элемент SimpleXML, поэтому его использование аналогично addChild. Конечно, было бы легко создать метод insertChild, который позволяет указывать точный элемент для вставки элемента раньше, но, поскольку мне это сейчас не нужно, я решил этого не делать.