Foros del Web » Programando para Internet » PHP »

Ayuda cómo leer un xml con simpleXML

Estas en el tema de Ayuda cómo leer un xml con simpleXML en el foro de PHP en Foros del Web. Buenas, Tengo muchos problemas con simpleXML no me llevo bien con él y él tampoco se lleva bien conmigo xD Mira que me gustan los ...
  #1 (permalink)  
Antiguo 26/12/2009, 18:15
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Ayuda cómo leer un xml con simpleXML

Buenas,

Tengo muchos problemas con simpleXML no me llevo bien con él y él tampoco se lleva bien conmigo xD

Mira que me gustan los ficheros XML pero no he conseguido dominar la técnica para leer y acceder a cualquier campo que quiera. Si sois tan amables de ponerme un ejemplo en base a este fichero XML os lo agradecería.

Tengo que decir que pasar un XML a un array lo conseguí pero claro no es lo mismo... que acceder directamente con simpleXML, y leyendo el manual de phpnet no lo he conseguido
http://php.net/manual/en/book.simplexml.php

Código XML
Código xml:
Ver original
  1. <ROOT GMTNow="26.12.2009 21:10:58">
  2. <EVENTS>
  3.     <E DBID="1789167" N="Titulo1" D="26/12/2009 20:05:00" StdEventDate="2009-12-26T20:05:00" StdEventDate_UTC="2009-12-26T20:05:00" SID="7" RID="9" LID="1353">
  4.         <G DBID="16347728" EID="1789167" N="titulo1.1" GT="7701">
  5.             <R DBID="58871633" N="titulo1.1.1" O="aaa"/>
  6.             <R DBID="58871634" N="titulo1.1.2" O="bbb"/>
  7.         </G>
  8.         <G DBID="16347729" EID="1789167" N="titulo1.2" GT="7353">
  9.             <R DBID="58871635" N="titulo1.2.1" O="aaa"/>
  10.             <R DBID="58871636" N="titulo1.2.2" O="bbb"/>
  11.         </G>
  12.     </E>
  13.     <E DBID="1774810" N="titulo2" D="26/12/2009 21:30:00" StdEventDate="2009-12-26T21:30:00" StdEventDate_UTC="2009-12-26T21:30:00" SID="11" RID="9" LID="211">
  14.         <G DBID="16296973" EID="1774810" N="titulo2.1" GT="262">
  15.             <R DBID="58710872" N="titulo2.1.1" O="aaa"/>
  16.             <R DBID="58710873" N="titulo2.1.2" O="bbb"/>
  17.         </G>
  18.             <G DBID="16339245" EID="1774810" N="titulo2.2" GT="104">
  19.             <R DBID="58847315" N="titulo2.2.1" O="aaa"/>
  20.             <R DBID="58847316" N="titulo2.2.2" O="bbb"/>
  21.         </G>
  22.             <G DBID="16345937" EID="1774810" N="titulo2.3" GT="3887">
  23.             <R DBID="58866743" N="titulo2.3.1" O="aaa"/>
  24.             <R DBID="58866744" N="titulo2.3.2" O="bbb"/>
  25.         </G>
  26.     </E>
  27.     <E DBID="1786215" N="titulo3" D="27/12/2009 19:30:00" StdEventDate="2009-12-27T19:30:00" StdEventDate_UTC="2009-12-27T19:30:00" SID="7" RID="28" LID="854">
  28.         <G DBID="16295540" EID="1786215" N="titulo3.1" GT="66">
  29.             <R DBID="58707046" N="titulo3.1.1" O="aaa"/>
  30.             <R DBID="58707047" N="titulo3.1.2" O="bbb"/>
  31.         </G>
  32.         <G DBID="16295549" EID="1786215" N="titulo3.2" GT="7970">
  33.             <R DBID="58707064" N="titulo3.2.1" O="aaa"/>
  34.             <R DBID="58707065" N="titulo3.2.2" O="bbb"/>
  35.         </G>
  36.         <G DBID="16295550" EID="1786215" N="titulo3.3" GT="2225">
  37.             <R DBID="58707066" N="titulo3.3.1" O="aaa"/>
  38.             <R DBID="58707067" N="titulo3.3.2" O="bbb"/>
  39.             <R DBID="58707068" N="titulo3.3.3" O="ccc"/>
  40.             <R DBID="58707069" N="titulo3.3.4" O="ddd"/>
  41.             <R DBID="58707070" N="titulo3.3.5" O="eee"/>
  42.             <R DBID="58707071" N="titulo3.3.6" O="fff"/>
  43.             <R DBID="58707072" N="titulo3.3.7" O="ggg"/>
  44.             <R DBID="58707073" N="titulo3.3.8" O="hhh"/>
  45.             <R DBID="58707074" N="titulo3.3.9" O="iii"/>
  46.             <R DBID="58707075" N="titulo3.3.10" O="jjj"/>
  47.             <R DBID="58707076" N="titulo3.3.11" O="kkk"/>
  48.             <R DBID="58707077" N="titulo3.3.12" O="lll"/>
  49.         </G>
  50.         <G DBID="16329206" EID="1786215" N="titulo3.4" GT="7698">
  51.             <R DBID="58820167" N="titulo3.4.1" O="aaa"/>
  52.             <R DBID="58820168" N="titulo3.4.2" O="bbb"/>
  53.         </G>
  54.         <G DBID="16329207" EID="1786215" N="titulo3.5" GT="6710">
  55.             <R DBID="58820169" N="titulo3.5.1" O="aaa"/>
  56.             <R DBID="58820170" N="titulo3.5.2" O="bbb"/>
  57.         </G>
  58.     </E>
  59. </EVENTS>
  60. </ROOT>

SCRIPT

Código PHP:
Ver original
  1. <?php
  2. if (file_exists('data_forosdelweb.xml')){
  3.     $xml = simplexml_load_file('data_forosdelweb.xml');
  4.     echo '<pre>';
  5.     //print_r($xml);
  6.     echo '</pre>';
  7.    
  8.     foreach ($xml->EVENTS as $evento) {
  9.         echo '<pre>';
  10.         //print_r($evento);
  11.         echo '</pre>';
  12.         echo $evento[0]->DBID, '<br />';
  13.     }
  14.    
  15. } else {
  16.     exit('Failed to open data_forosdelweb.xml.');
  17. }
  18. ?>

El script anterior no me muestra nada por pantalla.
Si descomento la linea //print_r($xml); muestra la siguiente información

Código:
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [GMTNow] => 26.12.2009 21:10:58
        )

    [EVENTS] => SimpleXMLElement Object
        (
            [E] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [DBID] => 1789167
                                    [N] => Titulo1
                                    [D] => 26/12/2009 20:05:00
                                    [StdEventDate] => 2009-12-26T20:05:00
                                    [StdEventDate_UTC] => 2009-12-26T20:05:00
                                    [SID] => 7
                                    [RID] => 9
                                    [LID] => 1353
                                )

                            [G] => Array
                                (
                                    [0] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [DBID] => 16347728
                                                    [EID] => 1789167
                                                    [N] => titulo1.1
                                                    [GT] => 7701
                                                )

                                            [R] => Array
                                                (
                                                    [0] => SimpleXMLElement Object
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [DBID] => 58871633
                                                                    [N] => titulo1.1.1
                                                                    [O] => aaa
                                                                )

                                                        )

                                                    [1] => SimpleXMLElement Object
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [DBID] => 58871634
                                                                    [N] => titulo1.1.2
                                                                    [O] => bbb
                                                                )

                                                        )

                                                )

                                        )

                                    [1] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [DBID] => 16347729
                                                    [EID] => 1789167
                                                    [N] => titulo1.2
                                                    [GT] => 7353
                                                )

                                            [R] => Array
                                                (
                                                    [0] => SimpleXMLElement Object
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [DBID] => 58871635
                                                                    [N] => titulo1.2.1
                                                                    [O] => aaa
                                                                )

                                                        )

                                                    [1] => SimpleXMLElement Object
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [DBID] => 58871636
                                                                    [N] => titulo1.2.2
                                                                    [O] => bbb
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

NOTA: He cortado parte de la salida porque excede el numero máximo de caracteres permitidos en el post.                    

)
Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 26/12/2009, 18:48
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: Ayuda cómo leer un xml con simpleXML

Todo es cosa de paciencia y usar la herramienta correcta

Código PHP:
<?php
$dom 
= new DOMDocument();

$dom->load('algo.xml');

$root=$dom->getElementsByTagName('ROOT')->item(0);

#con esto ves el 1er atributo de todos
echo $root->getAttribute('GMTNow');

echo 
"<br />";

$tagE $dom->getElementsByTagName('E');
$tagG $dom->getElementsByTagName('G');
$tagR $dom->getElementsByTagName('R');

foreach(
$tagE as $e){

            echo 
$e->getAttribute('DBID')."<br />";
            echo 
$e->getAttribute('N')."<br />";  
            echo 
$e->getAttribute('D')."<br />";
            echo 
$e->getAttribute('StdEventDate')."<br />";
            echo 
$e->getAttribute('StdEventDate_UTC')."<br />";
            echo 
$e->getAttribute('SID')."<br />";
            echo 
$e->getAttribute('RID')."<br />";
            echo 
$e->getAttribute('LID')."<br />";
            
    foreach(
$tagG as $g){
        
            echo 
$g->getAttribute('DBID')."<br />";
            echo 
$g->getAttribute('EID')."<br />";
            echo 
$g->getAttribute('N')."<br />";  
            echo 
$g->getAttribute('GT')."<br />";
        
        foreach(
$tagR as $r){
            echo 
$r->getAttribute('DBID')."<br />";
            echo 
$r->getAttribute('N')."<br />";
            echo 
$r->getAttribute('O')."<br />";    
        }
    }
}

?>
__________________
HV Studio
Diseño y desarrollo web
  #3 (permalink)  
Antiguo 27/12/2009, 04:09
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Ayuda cómo leer un xml con simpleXML

Cita:
Iniciado por jackson666 Ver Mensaje
Todo es cosa de paciencia y usar la herramienta correcta

Código PHP:
<?php
$dom 
= new DOMDocument();

$dom->load('algo.xml');

$root=$dom->getElementsByTagName('ROOT')->item(0);

#con esto ves el 1er atributo de todos
echo $root->getAttribute('GMTNow');

echo 
"<br />";

$tagE $dom->getElementsByTagName('E');
$tagG $dom->getElementsByTagName('G');
$tagR $dom->getElementsByTagName('R');

foreach(
$tagE as $e){

            echo 
$e->getAttribute('DBID')."<br />";
            echo 
$e->getAttribute('N')."<br />";  
            echo 
$e->getAttribute('D')."<br />";
            echo 
$e->getAttribute('StdEventDate')."<br />";
            echo 
$e->getAttribute('StdEventDate_UTC')."<br />";
            echo 
$e->getAttribute('SID')."<br />";
            echo 
$e->getAttribute('RID')."<br />";
            echo 
$e->getAttribute('LID')."<br />";
            
    foreach(
$tagG as $g){
        
            echo 
$g->getAttribute('DBID')."<br />";
            echo 
$g->getAttribute('EID')."<br />";
            echo 
$g->getAttribute('N')."<br />";  
            echo 
$g->getAttribute('GT')."<br />";
        
        foreach(
$tagR as $r){
            echo 
$r->getAttribute('DBID')."<br />";
            echo 
$r->getAttribute('N')."<br />";
            echo 
$r->getAttribute('O')."<br />";    
        }
    }
}

?>
Muchísimas gracias jackson666! ahora me queda muchísimo más claro como acceder a las posiciones que quiera!

Por cierto, sabes porque aparece este mensaje al analizar los datos desde una URL HTTPS

Warning: DOMDocument::load() [function.DOMDocument-load]: SSL: fatal protocol error in C:\AppServ\www\00-laboratorio_test\secciones\xml\ejemplo2.php on line 6

La linea 6 coincide con el load a una pagina HTTPS

Y al final del archivo aparece que ha superado el máximo de ejecución. Lo tenía puesto a 30 seg. Lo he ampliado a 120 seg. pero parece que no es suficiente... es normal ampliarlo tanto?¿

Fatal error: Maximum execution time of 120 seconds exceeded in C:\AppServ\www\00-laboratorio_test\secciones\xml\ejemplo2.php on line 37

Los valores de mi configuracion PHP.INI

max_execution_time = 120 ; Maximum execution timeof each script, in seconds
max_input_time = 120 ; Maximum amount of time each script may spend parsing request data
memory_limit = 35M ; Maximum amount of memory a script may consume (8MB)

Muchas gracias de antemano!
  #4 (permalink)  
Antiguo 27/12/2009, 08:08
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: Ayuda cómo leer un xml con simpleXML

La verdad ni idea... Yo me asegure de que andara a nivel local, pero bajo HTTP, no con el protocolo que vos manejas...

Y lo del tiempo maximo tampoco! Googleate a ver que encontras!

Suerte
__________________
HV Studio
Diseño y desarrollo web
  #5 (permalink)  
Antiguo 27/12/2009, 09:48
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Ayuda cómo leer un xml con simpleXML

Cita:
Iniciado por jackson666 Ver Mensaje
La verdad ni idea... Yo me asegure de que andara a nivel local, pero bajo HTTP, no con el protocolo que vos manejas...

Y lo del tiempo maximo tampoco! Googleate a ver que encontras!

Suerte
Hola jackson666 estaba mirando la salida que produce el script que me mostraste y hay algo que no cuadra...

Los elementos se repiten muchas veces, es como si se iterasen más veces de las que tocan. Puedes ejecutarlo en local y verás que por ej. el elemento con nombre "titulo2.2.1" aparece impreso 30 veces! en lugar de solo 1.

Puede ser debido a estas declaraciones?
$tagE = $dom->getElementsByTagName('E');
$tagG = $dom->getElementsByTagName('G');
$tagR = $dom->getElementsByTagName('R');

Muchas gracias de antemano!
  #6 (permalink)  
Antiguo 27/12/2009, 10:14
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: Ayuda cómo leer un xml con simpleXML

Código PHP:
<?php 
$dom 
= new DOMDocument(); 

$dom->load('algo.xml'); 

$root=$dom->getElementsByTagName('ROOT')->item(0); 

#con esto ves el 1er atributo de todos 
echo $root->getAttribute('GMTNow'); 

echo 
"<br />"

$tagE $dom->getElementsByTagName('E'); 
$tagG $dom->getElementsByTagName('G'); 
$tagR $dom->getElementsByTagName('R'); 

$contador=0;

foreach(
$tagE as $e){ 
    echo 
"<b>Tag E</b><br />";
    echo 
$e->getAttribute('DBID')."<br />"
    echo 
$e->getAttribute('N')."<br />";   
    echo 
$e->getAttribute('D')."<br />"
    echo 
$e->getAttribute('StdEventDate')."<br />"
    echo 
$e->getAttribute('StdEventDate_UTC')."<br />"
    echo 
$e->getAttribute('SID')."<br />"
    echo 
$e->getAttribute('RID')."<br />"
    echo 
$e->getAttribute('LID')."<br /><br />";
    
$contador++; 
}

echo 
"<h2>El TagE se repitio: ".$contador." veces</h2>";

$contador=0;

foreach(
$tagG as $g){ 
    echo 
"<b>Tag G</b><br />";         
    echo 
$g->getAttribute('DBID')."<br />"
    echo 
$g->getAttribute('EID')."<br />"
    echo 
$g->getAttribute('N')."<br />";   
    echo 
$g->getAttribute('GT')."<br /><br />"
    
$contador++;
}

echo 
"<h2>El TagG se repitio: ".$contador." veces</h2>";
$contador=0;

foreach(
$tagR as $r){ 
    echo 
"<b>Tag R</b><br />";
    echo 
$r->getAttribute('DBID')."<br />"
    echo 
$r->getAttribute('N')."<br />"
    echo 
$r->getAttribute('O')."<br /><br />";
    
$contador++;     
}
echo 
"<h2>El TagR se repitio: ".$contador." veces</h2>";
?>
El problema es que no se porque se me ocurrio anidar los foreach

NOTA: a tu XML le falta el tag principal -> <?xml version='1.0' encoding='iso-8859-1' ?>
__________________
HV Studio
Diseño y desarrollo web
  #7 (permalink)  
Antiguo 27/12/2009, 14:18
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Ayuda cómo leer un xml con simpleXML

Hola jackson666, perdona que te moleste de nuevo...

De la última forma que indicas no consigo mostrar solo los elementos y subelementos que tengan como nombre "titulo1.2"

Por ej. si solo quiero buscar todos los elementos que tenga titulo1 y subelementos titulo1.1, titulo1.2, titulo1.1.1, titulo1.1.2, titulo1.1.3, etc... como lo harías?

No se si me he explicado con claridad.

En tu script muestras todos los elementos de cada tag E,G y R

Pero para cada tag E contiene unos tags G y dentro de los tags G estan los tags R. Cómo haces para moverte y printar solo, todos los tags y atributos de un titulo concreto. Por ejemplo solo los que pertenezcan al tag G con nombre titulo1.2

Lo intenté con haciéndolo así pero solo me muestra el titulo 1.2, si quiero que me muestre todos sus subelementos? 1.2.1, 1.2.2 etc... como lo haces?

Código PHP:
Ver original
  1. foreach($tagG as $g){
  2.     if ($g->getAttribute('N')=='titulo1.2'){
  3.         echo $g->getAttribute('DBID')."<br />";
  4.         echo $g->getAttribute('EID')."<br />";
  5.         echo $g->getAttribute('N')."<br />";  
  6.         echo $g->getAttribute('GT')."<br /><br />";
  7.     }
  8.     $contador++;
  9.    
  10. }

Este es el fragmento...
Código:
                                    [1] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [DBID] => 16347729
                                                    [EID] => 1789167
                                                    [N] => titulo1.2
                                                    [GT] => 7353
                                                )

                                            [R] => Array
                                                (
                                                    [0] => SimpleXMLElement Object
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [DBID] => 58871635
                                                                    [N] => titulo1.2.1
                                                                    [O] => aaa
                                                                )

                                                        )

                                                    [1] => SimpleXMLElement Object
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [DBID] => 58871636
                                                                    [N] => titulo1.2.2
                                                                    [O] => bbb
                                                                )

                                                        )

                                                )
Muchas gracias de antemano!

Última edición por neodani; 27/12/2009 a las 14:24
  #8 (permalink)  
Antiguo 28/12/2009, 13:42
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Ayuda cómo leer un xml con simpleXML

Cita:
Iniciado por neodani Ver Mensaje
Lo intenté con haciéndolo así pero solo me muestra el titulo 1.2, si quiero que me muestre todos sus subelementos? 1.2.1, 1.2.2 etc... como lo haces?
Con esto me refería a mostrar la información de la siguiente manera

Titulo1
titulo1.1
titulo1.1.1
titulo1.1.2
titulo1.2
titulo1.2.1
titulo1.2.2

Titulo2
titulo2.1
titulo2.1.1
titulo2.1.2
titulo2.2
titulo2.2.1
titulo2.2.2
titulo2.3
titulo2.3.1
titulo2.3.2

Titulo3
...

¿Sabéis cómo?

Muchas gracias de antemano!
  #9 (permalink)  
Antiguo 28/12/2009, 14:38
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: Ayuda cómo leer un xml con simpleXML

Si, se como, pero me parece que te las podrias rebuscar un poco tambien, o sea... Un rato de paciencia y sale esto che

Código PHP:
$dom = new DOMDocument(); 

$dom->load('algo.xml'); 

$root=$dom->getElementsByTagName('ROOT')->item(0); 

$tagR $dom->getElementsByTagName('R'); 

$titulos "";

foreach(
$tagR as $r){ 

    
$titulos .= $r->getAttribute('N')."-"

}

$titulos explode('-',$titulos);

$t1;
$t2;
$t3;

foreach (
$titulos as $t){
    
    if(
$t[6] == 1){

        
$t1 .= $t."<br />";

    }else if(
$t[6] == 2){

        
$t2 .= $t."<br />";

    }else if(
$t[6] == 3){

        
$t3 .= $t."<br />";
    }
}

echo 
"<h2>Titulo 1</h2>";

echo 
$t1;

echo 
"<h2>Titulo 2</h2>";

echo 
$t2;

echo 
"<h2>Titulo 3</h2>";

echo 
$t3
Ademas no se para que los queres ordenados si ya esta ordenados en el xml!
__________________
HV Studio
Diseño y desarrollo web
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 21:35.