Foros del Web » Programando para Internet » PHP »

SimpleXML: "fusionar elementos"

Estas en el tema de SimpleXML: "fusionar elementos" en el foro de PHP en Foros del Web. Tengo un XML tal que así: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código XML: Ver original <?xml version = "1.0" encoding = "utf-8" ?> <pedidos >     <pedido ...
  #1 (permalink)  
Antiguo 02/04/2013, 04:10
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
SimpleXML: "fusionar elementos"

Tengo un XML tal que así:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <pedidos>
  3.    <pedido>
  4.       <id>123456789</id>
  5.       <articulo>100</articulo>
  6.    </pedido>
  7.    <pedido>
  8.       <id>987654321</id>
  9.       <articulo>400</articulo>
  10.    </pedido>
  11.    <pedido>
  12.       <id>123456789</id>
  13.       <articulo>200</articulo>
  14.    </pedido>
  15. </pedidos>

Lo que quisiera, es que si el id de un pedido coincide con el de otro que de alguna forma se fusionaran y queda algo así:
Código XML:
Ver original
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <pedidos>
  3.    <pedido>
  4.       <id>123456789</id>
  5.       <articulo>100</articulo>
  6.       <articulo>200</articulo>
  7.    </pedido>
  8.    <pedido>
  9.       <id>987654321</id>
  10.       <articulo>400</articulo>
  11.    </pedido>
  12. </pedidos>

Es decir se añade los artículos en un mismo pedido y se elimina el otro. Se puede hacer algo así? le tengo dado mil vueltas y nada.

Bueno no tiene por qué ser la corrección en el XML, si se hace en el objeto resultante también me valdría!

Uso simple XML y no paso de:
$pedidos = new SimpleXMLElement($this->url_xml);
y recorrerlo con un foreach.

Pero veo que simpleXML tiene muchas opciones y no se si habrá alguna que haga esto.
Veo que para añadir elementos puedo usar SimpleXMLElement::addAttribute o addChild pero para eliminar no veo ninguna forma.
  #2 (permalink)  
Antiguo 02/04/2013, 06:23
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 13 años, 5 meses
Puntos: 181
Respuesta: SimpleXML: "fusionar elementos"

Bueno, no soy muy experto en xml pero yo creo que una solución mas óptima seria esta:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="utf-8" ?>
  2.     <pedidos>
  3.        <pedido>
  4.           <id npedido="123456789" />
  5.           <articulo>100</articulo>
  6.        </pedido>
  7.        <pedido>
  8.           <id npedido="987654321" />
  9.           <articulo>400</articulo>
  10.        </pedido>
  11.        <pedido>
  12.           <id npedido="123456789"></id>
  13.           <articulo>200</articulo>
  14.        </pedido>
  15.     </pedidos>

Revisa por favor si lo coloque bien, no suelo usar mucho xml.

De esa manera si se va a leer el xml se deberian buscar los pedidos que tengan como atributo de npedido el que necesitas. Lo que tu planteas como solución rompe con la forma correcta en como se debe crear un xml y seguro un validador te colocaria error. Creo que por ahi tengo un ejemplo viejisimo de algo parecido, de pronto si mas tarde lo encuentro lo coloco.
__________________
Blog de humor http://elcuasatar.net63.net/
  #3 (permalink)  
Antiguo 02/04/2013, 12:30
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 5 meses
Puntos: 793
Respuesta: SimpleXML: "fusionar elementos"

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
  1. <?php
  2.  
  3. $sxe = new SimpleXMLElement('test.xml', null, true);
  4.  
  5. $tmp = array();
  6.  
  7. $source = '<pedidos>';
  8.  
  9. foreach ($sxe->pedido as $p) {
  10.     $tmp[(int)$p->id][] = (int) $p->articulo;
  11. }
  12.  
  13. $source = '<pedidos>';
  14.  
  15. foreach ($tmp as $id => $articulo) {
  16.     $source .= "<pedido><id>$id</id>";
  17.     foreach ($articulo as $a) {
  18.         $source .= "<articulo>$a</articulo>";
  19.     }
  20.     $source .= '</pedido>';
  21. }
  22.  
  23. $source .= '</pedidos>';
  24.  
  25. $doc = new DomDocument('1.0', 'utf8');
  26. $doc->preserveWhiteSpace = false;
  27. $doc->formatOutput = true;
  28. $doc->loadXML($source);
  29. $res = $doc->saveXML($doc);
  30.  
  31. $handle = fopen('final.xml', 'w+');
  32. fwrite($handle, $res);
  33. fclose($handle);

Resultado:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <pedidos>
  3.   <pedido>
  4.     <id>123456789</id>
  5.     <articulo>100</articulo>
  6.     <articulo>200</articulo>
  7.   </pedido>
  8.   <pedido>
  9.     <id>987654321</id>
  10.     <articulo>400</articulo>
  11.   </pedido>
  12. </pedidos>
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Etiquetas: fusionar, simplexml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:50.