Leer XMLs complejos usando DOMDocument ?? (solved)

Iniciado por Diabliyo, 28 Diciembre 2012, 19:14 PM

0 Miembros y 1 Visitante están viendo este tema.

Diabliyo

Buen dia.

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

<?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 (php) [Seleccionar]

<?php
$xml
= new DomDocument();
$xml->load("archivo.xml);
$k$xml->getElementsByTagName( "persona" );

foreach( 
$k as $v )
{
$auto$v->getElementsByTagName("auto")->item(0)->nodeValue;
$compu$v->getElementsByTagName("computadora")->item(0)->nodeValue;
$cel$v->getElementsByTagName("celular")->item(0)->nodeValue;

echo '<br>Auto: '. 
$auto. '<br>Computadora: '. $compu. '<br>Celular: '. $cel. '<br>';
}
?>


Resultado:
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 !

#!drvy

#1
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 (php) [Seleccionar]
<?php
$xml
= new DomDocument();

// Si no pones esto, por cada espacio blanco, salto de linea u otras parecidas
// te saldra un warning.
$xml->preserveWhiteSpace FALSE;

$xml->load('archivo.xml');

$k$xml->getElementsByTagName"persona" );

// Esto obtendra los atributos de cada item los devolvera en forma de array.
function obtenerAtributos($node){
   
$array NULL;
   foreach(
$node->attributes as $attrName=>$attrNode){
      
$array[$attrName] = $node->getAttribute($attrName);
   }
   return 
$array;
}


foreach( 
$k as $v ){
   
// Obtenemos los atributos de la persona.
   
$datos['persona'] = obtenerAtributos($v);

   
// Comprobamos si tiene hijos.
   
if($v->hasChildNodes()){
      
// Declaramos.
      
$childs $v->childNodes;
      
// Por cada hijo.
      
foreach($childs as $i){
         
// Guardamos su nombre en array y sus atributos.
        
$datos[$i->tagName] = obtenerAtributos($i);
        
// El valor del campo.
        
$datos[$i->tagName]['valor'] = $i->nodeValue;
      }
   }

   
//$auto= $v->getElementsByTagName("auto")->item(0)->nodeValue;
   //$compu= $v->getElementsByTagName("computadora")->item(0)->nodeValue;
   //$cel= $v->getElementsByTagName("celular")->item(0)->nodeValue;
   //echo '<br>Auto: '. $auto. '<br>Computadora: '. $compu. '<br>Celular: '. $cel. '<br>';

   
echo '<pre>'// Para que este mas ordenado.
   
print_r($datos); // Muestro el array.
   
echo '<hr />'// Nueva linea - Nueva persona.
}
?>


El resultado de esto.. suponiendo que el XML es el mismo que el que has puesto seria:
Código (plain) [Seleccionar]
Array
(
   [persona] => Array
       (
           [nombre] => pedro
           [edad] => 32
           [fechaNacimiento] => 19800101T10:20:00
       )

   [auto] => Array
       (
           [color] => negra
           [marca] => ford
           [tipo] => con caja
           [valor] => Camioneta
       )

   [computadora] => Array
       (
           [color] => gris
           [marca] => hp
           [modelo] => pcg
           [procesador] => corei5
           [valor] => Portatil
       )

   [celular] => Array
       (
           [color] => negro
           [modelo] => abc
           [marca] => abc
           [redtelefonica] => blabla
           [valor] => Si
       )

)
----------------------------------------------
Array
(
   [persona] => Array
       (
           [nombre] => luis
           [edad] => 22
           [fechaNacimiento] => 19901210T20:08:00
       )

   [auto] => Array
       (
           [color] => negra
           [marca] => ford
           [tipo] => smart
           [valor] => Automovil
       )

   [computadora] => Array
       (
           [color] => verde
           [marca] => contpaq
           [modelo] => pavilion
           [procesador] => corei5
           [valor] => Desktop
       )

   [celular] => Array
       (
           [color] => negro
           [modelo] => abc
           [marca] => abc
           [redtelefonica] => blabla
           [valor] => Si
       )
)



Saludos

Diabliyo

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