elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Leer XMLs complejos usando DOMDocument ?? (solved)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Leer XMLs complejos usando DOMDocument ?? (solved)  (Leído 4,262 veces)
Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Leer XMLs complejos usando DOMDocument ?? (solved)
« en: 28 Diciembre 2012, 19:14 pm »

Buen dia.

Tengo un XML complejo que no logro leer :(, le dejo el XML:

Código:
<?xml version="1.0" encoding="UTF-8"?>
<lista>
<persona nombre="pedro" edad="32" fechaNacimiento="19800101T10:20:00">
          <auto color="negra" marca="ford" tipo="con caja">Camioneta</auto>
          <computadora color="gris" marca="hp" modelo="pcg" procesador="corei5">Portatil</computadora>
          <celular color="negro" modelo="abc" marca="abc" redtelefonica="blabla">Si</celular>
</persona>

<persona nombre="luis" edad="22" fechaNacimiento="19901210T20:08:00">
          <auto color="negra" marca="ford" tipo="smart">Automovil</auto>
          <computadora color="verde" marca="contpaq" modelo="pavilion" procesador="corei5">Desktop</computadora>
          <celular color="negro" modelo="abc" marca="abc" redtelefonica="blabla">Si</celular>
</persona>
</lista>

Necesito leer los argumento de las etiquetas persona, y sobre las etiquetas internas leer tanto los argumentos como el contenido.

Mi codigo:

Código
  1. <?php
  2. $xml= new DomDocument();
  3. $xml->load("archivo.xml);
  4. $k= $xml->getElementsByTagName( "persona" );
  5.  
  6. foreach( $k as $v )
  7. {
  8. $auto= $v->getElementsByTagName("auto")->item(0)->nodeValue;
  9. $compu= $v->getElementsByTagName("computadora")->item(0)->nodeValue;
  10. $cel= $v->getElementsByTagName("celular")->item(0)->nodeValue;
  11.  
  12. echo '<br>Auto: '. $auto. '<br>Computadora: '. $compu. '<br>Celular: '. $cel. '<br>';
  13. }
  14. ?>

Resultado:
Código:
Auto: Camioneta
Computadora: Portatil
Celular: Si

Auto: Automovil
Computadora: Desktop
Celular: Si

Pero aun no se como obtener los argumentos de las etiquetas :(, que básicamente esta la información importante, que son los detalles de cada cosa.

Saludos !


« Última modificación: 29 Diciembre 2012, 01:05 am por Diabliyo » En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: Leer XMLs complejos usando DOMDocument ??
« Respuesta #1 en: 28 Diciembre 2012, 20:26 pm »

Buenas,

No deberías usar etiquetas especificas para parsear el xml. Me refiero.. obtienes elementos específicos con getElementByTagName que si en un futuro cambian de nombre tendrías que modificar el código entero xD.

Los atributos se obtienen con $nodo->getAttribute('nombre'); Tendrias que obtener los nombres de todos los atributos de cada $nodo y luego obtener su valor mediante esa función.

Te he modificado un poco el code espero no te moleste  :P

Código
  1. <?php
  2. $xml= new DomDocument();
  3.  
  4. // Si no pones esto, por cada espacio blanco, salto de linea u otras parecidas
  5. // te saldra un warning.
  6. $xml->preserveWhiteSpace = FALSE;
  7.  
  8. $xml->load('archivo.xml');
  9.  
  10. $k= $xml->getElementsByTagName( "persona" );
  11.  
  12. // Esto obtendra los atributos de cada item los devolvera en forma de array.
  13. function obtenerAtributos($node){
  14.   $array = NULL;
  15.   foreach($node->attributes as $attrName=>$attrNode){
  16.      $array[$attrName] = $node->getAttribute($attrName);
  17.   }
  18.   return $array;
  19. }
  20.  
  21.  
  22. foreach( $k as $v ){
  23.   // Obtenemos los atributos de la persona.
  24.   $datos['persona'] = obtenerAtributos($v);
  25.  
  26.   // Comprobamos si tiene hijos.
  27.   if($v->hasChildNodes()){
  28.      // Declaramos.
  29.      $childs = $v->childNodes;
  30.      // Por cada hijo.
  31.      foreach($childs as $i){
  32.         // Guardamos su nombre en array y sus atributos.
  33.        $datos[$i->tagName] = obtenerAtributos($i);
  34.        // El valor del campo.
  35.        $datos[$i->tagName]['valor'] = $i->nodeValue;
  36.      }
  37.   }
  38.  
  39.   //$auto= $v->getElementsByTagName("auto")->item(0)->nodeValue;
  40.   //$compu= $v->getElementsByTagName("computadora")->item(0)->nodeValue;
  41.   //$cel= $v->getElementsByTagName("celular")->item(0)->nodeValue;
  42.   //echo '<br>Auto: '. $auto. '<br>Computadora: '. $compu. '<br>Celular: '. $cel. '<br>';
  43.  
  44.   echo '<pre>'; // Para que este mas ordenado.
  45.   print_r($datos); // Muestro el array.
  46.   echo '<hr />'; // Nueva linea - Nueva persona.
  47. }
  48. ?>

El resultado de esto.. suponiendo que el XML es el mismo que el que has puesto seria:
Código
  1. Array
  2. (
  3.    [persona] => Array
  4.        (
  5.            [nombre] => pedro
  6.            [edad] => 32
  7.            [fechaNacimiento] => 19800101T10:20:00
  8.        )
  9.  
  10.    [auto] => Array
  11.        (
  12.            [color] => negra
  13.            [marca] => ford
  14.            [tipo] => con caja
  15.            [valor] => Camioneta
  16.        )
  17.  
  18.    [computadora] => Array
  19.        (
  20.            [color] => gris
  21.            [marca] => hp
  22.            [modelo] => pcg
  23.            [procesador] => corei5
  24.            [valor] => Portatil
  25.        )
  26.  
  27.    [celular] => Array
  28.        (
  29.            [color] => negro
  30.            [modelo] => abc
  31.            [marca] => abc
  32.            [redtelefonica] => blabla
  33.            [valor] => Si
  34.        )
  35.  
  36. )
  37. ----------------------------------------------
  38. Array
  39. (
  40.    [persona] => Array
  41.        (
  42.            [nombre] => luis
  43.            [edad] => 22
  44.            [fechaNacimiento] => 19901210T20:08:00
  45.        )
  46.  
  47.    [auto] => Array
  48.        (
  49.            [color] => negra
  50.            [marca] => ford
  51.            [tipo] => smart
  52.            [valor] => Automovil
  53.        )
  54.  
  55.    [computadora] => Array
  56.        (
  57.            [color] => verde
  58.            [marca] => contpaq
  59.            [modelo] => pavilion
  60.            [procesador] => corei5
  61.            [valor] => Desktop
  62.        )
  63.  
  64.    [celular] => Array
  65.        (
  66.            [color] => negro
  67.            [modelo] => abc
  68.            [marca] => abc
  69.            [redtelefonica] => blabla
  70.            [valor] => Si
  71.        )
  72. )


Saludos


« Última modificación: 28 Diciembre 2012, 20:36 pm por drvy | BSM » En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: Leer XMLs complejos usando DOMDocument ??
« Respuesta #2 en: 29 Diciembre 2012, 01:04 am »

Gracias men, me salvaste la vida :D
No tengo experiencia con los XMLs pero con tu codigo pude tener un buen acercamiento !
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Tutoriales de Dispositivos logicos programables complejos
Electrónica
Serg 1 2,083 Último mensaje 12 Enero 2005, 11:45 am
por BADBYTE-K
Tutorial - VBScript Avanzado(Creacion Comandos Complejos para Cmd)
Scripting
EddyW 5 31,683 Último mensaje 27 Abril 2009, 08:14 am
por EddyW
VB6 - LEER email con pop3 usando ssl
Programación Visual Basic
ProgramadorVB 0 1,600 Último mensaje 5 Julio 2010, 13:52 pm
por ProgramadorVB
DOMDocument & XPath
PHP
Og. 0 1,448 Último mensaje 31 Marzo 2012, 11:05 am
por Og.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines