Se me fue el tiempo jugando con clases y di mil vueltas, por lo menos te da una idea, aunque debería hacerse en un solo bucle y solo con las clases DOM:
Código PHP:
Ver original<?php
$sxe = new SimpleXMLElement('test.xml', null, true);
$source = '<pedidos>';
foreach ($sxe->pedido as $p) {
$tmp[(int)$p->id][] = (int) $p->articulo;
}
$source = '<pedidos>';
foreach ($tmp as $id => $articulo) {
$source .= "<pedido><id>$id</id>";
foreach ($articulo as $a) {
$source .= "<articulo>$a</articulo>";
}
$source .= '</pedido>';
}
$source .= '</pedidos>';
$doc = new DomDocument('1.0', 'utf8');
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$doc->loadXML($source);
$res = $doc->saveXML($doc);
$handle = fopen('final.xml', 'w+');
Resultado:
Código XML:
Ver original<?xml version="1.0" encoding="UTF-8"?>
<pedidos>
<pedido>
<id>123456789</id>
<articulo>100</articulo>
<articulo>200</articulo>
</pedido>
<pedido>
<id>987654321</id>
<articulo>400</articulo>
</pedido>
</pedidos>