Foros del Web » Programando para Internet » PHP »

Xml iterator

Estas en el tema de Xml iterator en el foro de PHP en Foros del Web. Muy buenas! Primero agradeceros que leais esto: a ver, tengo un objeto xml , cuyos tags están en minúsculas y por una razón que no ...
  #1 (permalink)  
Antiguo 14/06/2013, 03:48
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 9 meses
Puntos: 0
Xml iterator

Muy buenas!
Primero agradeceros que leais esto:

a ver, tengo un objeto xml , cuyos tags están en minúsculas y por una razón que no importa mucho, quiero convertir ese mismo objeto a sí mismo pero con los tags en mayúsculas.

entonces, para ello, supongo que habrá varios métodos, pero yo quiero hacer, por obligación, esto:

1) creo un nuevo objeto XMLElement, y le meto la raíz.
2)voy recorriendo el objeto que ya tengo, y con la info que voy extrayendo de el, voy , mediante ::addchild rellenando el objeto vacío que tengo.

MUY IMPORTANTE ES QUE TODO TIENE QUE SER TIPO OBJETO.

código:
Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <Raiz>
  3.   <User>yo</User>
  4.   <Pass>olist</Pass>
  5.   <nodo>
  6.         <Nodo3>137</Nodo>
  7.         <Nodo4>ty</Nodo4>
  8.         <Nodo5>Plot</Nodo5>
  9.         <Nodo6>yui</Nodo6>
  10.         <Nodo7>contenido</Nodo7>
  11.         <Nodo8>content</Nodo8>
  12.         <Nodo9>
  13.                 <Nodo10>Olias</Nodo10>
  14.                 <Nodo11>1</Nodo11>
  15.                 <Nodo12>Pepe</Nodo12>
  16.         </Nodo9>
  17.     </nodo>
  18. </raiz>

y este es el mío, que cuando funcione reharé con funcion recursiva

Código HTML:
Ver original
  1. <?php
  2.  
  3. $catched = simplexml_load_file("xml.xml"); // takes an XML file and converts it to an simpleXML object
  4.  
  5. $newobject= new simpleXMLElement("<?xml version=\"1.0\" encoding=\"UTF-8\"?><CustomsRequest></CustomsRequest>"); //creates a new object , it needs the root as an enter
  6.  
  7. foreach ($catched->Children() as $child)
  8.         {
  9.         $newobject->addchild(strtoupper($child->getName()),$child);//getName returns a string, so does $child, addchild returns an object.
  10.                 foreach ($child->Children() as $subchild)
  11.                 {
  12.                     $newobject->addchild(strtoupper($subchild->getName()),$subchild);
  13.                             foreach ($catched->Children() as $child)
  14.                             {
  15.                               $newobject->addchild(strtoupper($child->getName()),$child);//getName returns a string, so does $child, addchild returns an object.
  16.                
  17.                             }
  18.                 }
  19.         }
  20.                                
  21.      echo var_dump($newobject)    ;                    
  22. ?>

como veis, tood funciona bien hasta que se encuentra con un nodo hijo que a su vez tiene hijos, aqui, no realiza a vovesión a objeto sino que sale un elemento [o] que supongo que será un array de objetos dode guarda todos los nodos hijos.

lo que quiero es , que cuando haga print_r ($newobject), no me salga eso, sino que me salga el mismo formato que $catched.

he intentado usar XMLIterator pero no he visto forma de hacer esto con esa clase, aunque tampoco soy muy ducho en esto.

si alguien me puediera echar una mano se lo agradecería.
Un Saludo

Última edición por jcd; 14/06/2013 a las 10:53
  #2 (permalink)  
Antiguo 16/06/2013, 04:00
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 14 años, 2 meses
Puntos: 331
Respuesta: Xml iterator

Por qué no cambias el case cuando el xml ya está generado?
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 16/06/2013, 04:34
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 9 meses
Puntos: 0
¿cómo? or favor detalla un poco más
  #4 (permalink)  
Antiguo 16/06/2013, 13:47
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Xml iterator

No seria mas facil si es solo REEEMPLAZAR y siempre van a ser los mismos tags, usar una funcion de reemplazo como str_replace() ? ademas seria mas eficiente

En caso de que sean TODOS los tags, puedes hacerlo mediante expresiones regulares
__________________
Salu2!
  #5 (permalink)  
Antiguo 16/06/2013, 14:29
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Xml iterator

No, str relace no me convece, además, tiene que ser como yo lo planteo
pero gracias por las ideas
  #6 (permalink)  
Antiguo 16/06/2013, 21:05
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Xml iterator

Cita:
Iniciado por jcd Ver Mensaje
No, str relace no me convece,
Por que ? cual es la justificacion ?

Cita:
Iniciado por jcd Ver Mensaje
además, tiene que ser como yo lo
planteo
Ahh esa era
__________________
Salu2!
  #7 (permalink)  
Antiguo 17/06/2013, 09:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Xml iterator

Pues de entrada creo que vas a tener que hacerlo recursivo, de la forma como lo tienes no te va a servir ya que ciclas los hijos dos veces, y tienes que ir ciclando cada nodo de forma recursiva e ir agregándolos a tu objeto vacío.
  #8 (permalink)  
Antiguo 18/06/2013, 11:56
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Xml iterator

Italico, tu idea es buena, pero si, necesitaba y necesito hacerlo como digo, jejeje,esa es mi razón.

recursivo, uhmmm, seguiré mirando a ver, agradecería algún empujoncillo más, ¿qué le paso como parámetro a la función recursiva?, porque si le paso los childs, cuando vuelvo a llamarla no me devuelve nada

vaya jaleos me monto macho, siento traeros por el camino de la amargura jeje
  #9 (permalink)  
Antiguo 18/06/2013, 12:05
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Xml iterator

Lo primero es que si tu XML esta mal formado, o sea... los tags no estan bien cerrados, etc... ningun DOM parser creo te servira....... me toco arreglarlo...supongo tu lo habras emparchado tambien:

Código PHP:
<?xml version="1.0" encoding="UTF-8" ?>
<raiz>
  <User>yo</User>
  <Pass>olist</Pass>
  <nodo>
        <Nodo3>137</Nodo3>
        <Nodo4>ty</Nodo4>
        <Nodo5>Plot</Nodo5>
        <Nodo6>yui</Nodo6>
        <Nodo7>contenido</Nodo7>
        <Nodo8>content</Nodo8>
        <Nodo9>
                <Nodo10>Olias</Nodo10>
                <Nodo11>1</Nodo11>
                <Nodo12>Pepe</Nodo12>
        </Nodo9>
    </nodo>
</raiz>
__________________
Salu2!
  #10 (permalink)  
Antiguo 19/06/2013, 11:32
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Xml iterator

si, no es ese el problema pero al cambiar el nombre de los tags pudiera ser que estuviera mal emparchado.

pero el problema sigo sin resolverlo, a ver si este fin de semana le dedico un rato a hacerlo recursivo
  #11 (permalink)  
Antiguo 21/06/2013, 19:50
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Xml iterator

Esta muy facil...me demore como 2 min en hacer este ejemplito y 3 dias esperando me volviera el internet para postearlo ;)

Código PHP:
<?php
/*
    Pablo Bozzolo (2013)
*/ 
$it simplexml_load_file('xml.xml','SimpleXMLIterator'); 

// Simple, uso un Iterador de iteradores:
// no tiene porque ser especifico de XML porque todos implementan la misma interfaz
foreach($RII = new RecursiveIteratorIterator($it1) as $key => $val)
{
    if (!
$RII->hasChildren())            
        echo 
"[$key] = $val <br/>";           
}

// Otra opcion es esta:
//print_recursivo($catched);


function print_recursivo(SimpleXMLIterator $SXI){
    foreach (
$SXI as $key => $val){                                
        if (
$SXI->hasChildren()){            
            
recursive($val);
        }else
            echo 
"[$key] = $val <br/>";        
    }
}
Ahi tienes DOS (2) formas probadas de hacerlo funcionar
__________________
Salu2!
  #12 (permalink)  
Antiguo 23/06/2013, 04:15
jcd
 
Fecha de Ingreso: febrero-2013
Mensajes: 77
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Xml iterator

Gracias Italico!

Etiquetas: iterator, xml
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 11:10.