Foros del Web » Programando para Internet » PHP »

Duda con php, mysql y xml :P

Estas en el tema de Duda con php, mysql y xml :P en el foro de PHP en Foros del Web. Hola a todos. Tengo una duda acerca del manejo de datos en xml (concretamente exportados desde excel). He realizado un script en php el cual ...
  #1 (permalink)  
Antiguo 26/11/2009, 17:08
Avatar de venom_mau  
Fecha de Ingreso: julio-2009
Mensajes: 152
Antigüedad: 14 años, 9 meses
Puntos: 2
Duda con php, mysql y xml :P

Hola a todos.
Tengo una duda acerca del manejo de datos en xml (concretamente exportados desde excel).
He realizado un script en php el cual lee un archivo xml, este último ubicado en la misma carpeta del script. Es bien sabido que la mayoría de los archivos xml se dividen en "etiquetas" cada una de las cuales encierra un dato, por ejemplo
Código:
<info>
      <auto>sedan</auto>
      <motor>4 cilindros</motor>
</info>
Bien, mi script, lee estas etiquetas y las divido para obtener la información que cada una encierra, ya que quiero guardar esos datos como campos en una base de datos de mysql.
El problema al revisar un xml exportado de excel es que no tiene ese formato, sino:
Código:
<root>
  <row auto="sedan" motor="4 cilindros"....../> 
  <row auto="coupe" motor="6 cilindros"....../>
</root>
Ya busqué y nada todos tienen la primera solución, pero la segunda nada.
Para explicarme mejor les pongo mis scripts (espero le sirvan a alguien que tenga un problema parecido):

lee_xml . php:
Código:
<?php

include("parche_dom.php"); //este es un parche que bajé ya que tenía problemas con el dom
$direc_archivo="vintage.xml";


function CargarXML($direc_archivo)
{
 $contenido = "";
  if($da = fopen($direc_archivo,"r"))
     {
      while ($aux= fgets($da,1024))
          {
            $contenido.=$aux;
          }
      fclose($da);
     }
   else
     {
       echo "Error: no se ha podido leer el archivo <strong>$ruta_fichero</strong>";
     }
	 
	 $contenido=ereg_replace("á","a",$contenido);
     $contenido=ereg_replace("é","e",$contenido);
     $contenido=ereg_replace("í","i",$contenido);
     $contenido=ereg_replace("ó","o",$contenido);
     $contenido=ereg_replace("ú","u",$contenido);
     $contenido=ereg_replace("Á","A",$contenido);
     $contenido=ereg_replace("É","E",$contenido);
     $contenido=ereg_replace("Í","I",$contenido);
     $contenido=ereg_replace("Ó","O",$contenido);
     $contenido=ereg_replace("Ú","U",$contenido);
     $contenido=ereg_replace("Ñ","NI",$contenido);
     $contenido=ereg_replace("ñ","ni",$contenido); 

     $tagnames = array ("musclecar", "motor", "anio");

   if (!$xml = domxml_open_mem($contenido))
     {
       echo "Ha ocurrido un error al procesar el documento<strong> \"$direc_archivo\"</strong> a XML <br>";
       exit;
     }
   else
     {
       $raiz = $xml->document_element();
     }
       $tam=sizeof($tagnames);

   for($i=0; $i<$tam; $i++)
     {
       $nodo = $raiz->get_elements_by_tagname($tagnames[$i]);
       $j=0;
       foreach ($nodo as $etiqueta)
          {
            $matriz[$j][$tagnames[$i]]=$etiqueta->get_content();
            $j++;
          }
     } 

	  return $matriz;
   }
 


  $matriz=CargarXML("vintage.xml");

  $num_inv=sizeof($matriz);
  for($i=0;$i<$num_inv;$i++)
      {
        echo '
              <table border=1>
              <tr><td align=center>'.$matriz[$i]["musclecar"].'</td></tr>
              <tr><td>'.$matriz[$i]["motor"].'</td></tr>
              <tr><td align=right >'.$matriz[$i]["anio"].'</td></tr>
              </table><br>
            ';
      } 
	  
echo '<form name=guarda_xml id=guardaxml method=post action=guarda.php>';
  $num_inv2=sizeof($matriz);
  for($j=0;$j<$num_inv2;$j++)
      {
		echo '<input type=hidden name=matriz[] id=matriz[] value='.$matriz[$j]["musclecar"].'>';
		echo '<input type=hidden name=matriz[] id=matriz[] value='.$matriz[$j]["motor"].'>';
		echo '<input type=hidden name=matriz[] id=matriz[] value='.$matriz[$j]["anio"].'>';
      }
echo '<input type=hidden name=indice id=indice value='.$j.'>';
echo '<input type=submit value=Enviar informacion a base de datos>';
echo '</form>';

?>
Donde vintage.xml es mi archivo con el primer formato que les describí:
Código:
<info>
      <auto>sedan</auto>
      <motor>4 cilindros</motor>
</info>
guarda . php

Código:
<?php
$link=mysql_connect("servidor","usuario","contrasenia");
mysql_select_db("mibd",$link);

echo "Arreglos recibidos:&nbsp;";
echo $_POST['indice'];
echo "<br>";
$j= $_POST['indice'];
$ins=0;
Foreach($_POST['matriz'] as $opcion) echo $opcion ."&nbsp;";

Foreach($_POST['matriz'] as $valor){
        $arreglo[]=$valor;
		}

while ($ins<$j)
     {
       $sql="INSERT INTO mitabla(columna1, columna2, columna3) VALUES ('$arreglo[0]', '$arreglo[1]', '$arreglo[2]' )";
       $consul=mysql_query($sql);
       echo "<br> Registro dado de alta";
	   $ins++;
	 }
?>
Algunos echo, los puse para ver si estaba recibiendo la información y cuantos arreglos recibía :P

Espero me puedan ayudar , gracias por leer el tema.
  #2 (permalink)  
Antiguo 26/11/2009, 17:36
 
Fecha de Ingreso: enero-2007
Ubicación: Los Angeles, Chile
Mensajes: 28
Antigüedad: 17 años, 3 meses
Puntos: 2
Respuesta: Duda con php, mysql y xml :P

podrias usar expresiones regulares para recorrer el archivo y sacar los datos

si puedes poner una linea entera en este tipo de formato

Código PHP:
<root>
  <
row auto="sedan" motor="4 cilindros"....../> 
  <
row auto="coupe" motor="6 cilindros"....../>
</
root
te podria ayudar a construir la expresion regular
  #3 (permalink)  
Antiguo 26/11/2009, 17:59
Avatar de venom_mau  
Fecha de Ingreso: julio-2009
Mensajes: 152
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Duda con php, mysql y xml :P

Cita:
Iniciado por alex16x Ver Mensaje
podrias usar expresiones regulares para recorrer el archivo y sacar los datos

si puedes poner una linea entera en este tipo de formato

Código PHP:
<root>
  <
row auto="sedan" motor="4 cilindros"....../> 
  <
row auto="coupe" motor="6 cilindros"....../>
</
root
te podria ayudar a construir la expresion regular
Muchas gracias alex16x !!!

Bue.. al fin que no es mi código, jeje, pongo la línea:
Código:
<root>
 <VTAS TIENDA="101" PROVEEDOR="3558" CATEGORIA="0012" DIVISION="0003" SKU="       63528190" EAN="740617090185" EAN_RELACIONADO="0" ENL_ART="63528190" DES_ART="MEMORIA KINGSTON USB 2 GB DTI2GB" TALLA="Sin Talla" COLOR="Sin Color" MARCA="KINGSTON" ESTILO="DTI2GB" VTA_DIA_Pzas=".00" VTA_DIA_Impte=".00" VTA_MES_Pzas="3.00" VTA_MES_Impte="398.25" FECHA_ALTA="20060903" FECHA_ULT_COMPRA="20090914" COSTO_UNI="115.00" VENTA_UNI="169.00" COD_FAM="00120003003100030001" COLECCION="BÁSICO" PROVEEDOR_NOMBRE="INTELIGENCIA EN PUNTO DE VENTA SA" TEMPORADA="TODO TIEMPO"/>
</root>
Claro que son varias etiquetas de "VTAS" dentro de <root> </root>

Espero me puedas ayudar, ya había escuchado algo de las expresiones regulares, pero la verdad me doy de topes con esto, ahora imagínate si le entro a un nivel superior.... se me quema el cpu :P

Saludos :D
  #4 (permalink)  
Antiguo 26/11/2009, 18:41
 
Fecha de Ingreso: enero-2007
Ubicación: Los Angeles, Chile
Mensajes: 28
Antigüedad: 17 años, 3 meses
Puntos: 2
Respuesta: Duda con php, mysql y xml :P

aqui te dejo la funcion que hice

Código PHP:
function Distribuir_Datos($xml){

    
preg_match_all("/<VTAS TIENDA=\"(.*)\" PROVEEDOR=\"(.*)\" CATEGORIA=\"(.*)\" DIVISION=\"(.*)\" SKU=\"(.*)\" EAN=\"(.*)\" EAN_RELACIONADO=\"(.*)\" ENL_ART=\"(.*)\" DES_ART=\"(.*)\" TALLA=\"(.*)\" COLOR=\"(.*)\" MARCA=\"(.*)\" ESTILO=\"(.*)\" VTA_DIA_Pzas=\"(.*)\" VTA_DIA_Impte=\"(.*)\" VTA_MES_Pzas=\"(.*)\" VTA_MES_Impte=\"(.*)\" FECHA_ALTA=\"(.*)\" FECHA_ULT_COMPRA=\"(.*)\" COSTO_UNI=\"(.*)\" VENTA_UNI=\"(.*)\" COD_FAM=\"(.*)\" COLECCION=\"(.*)\" PROVEEDOR_NOMBRE=\"(.*)\" TEMPORADA=\"(.*)\".*/",$xml,$resultado);
    
    for(
$i=0;$i<count($resultado[0]);$i++){
        
$datos[$i]['TIENDA']  = $resultado[1][$i];
        
$datos[$i]['PROVEEDOR'] = $resultado[2][$i];
        
$datos[$i]['CATEGORIA'] = $resultado[3][$i];
        
$datos[$i]['DIVISION'] = $resultado[4][$i];
        
$datos[$i]['SKU'] = $resultado[5][$i];
        
$datos[$i]['EAN'] = $resultado[6][$i];
        
$datos[$i]['EAN_RELACIONADO'] = $resultado[7][$i];
        
$datos[$i]['ENL_ART'] = $resultado[8][$i];
        
$datos[$i]['DES_ART'] = $resultado[9][$i];
        
$datos[$i]['TALLA'] = $resultado[10][$i];
        
$datos[$i]['COLOR'] = $resultado[11][$i];
        
$datos[$i]['MARCA'] = $resultado[12][$i];
        
$datos[$i]['ESTILO'] = $resultado[13][$i];
        
$datos[$i]['VTA_DIA_Pzas'] = $resultado[14][$i];
        
$datos[$i]['VTA_DIA_Impte'] = $resultado[15][$i];
        
$datos[$i]['VTA_MES_Pzas'] = $resultado[16][$i];
        
$datos[$i]['VTA_MES_Impte'] = $resultado[17][$i];
        
$datos[$i]['FECHA_ALTA'] = $resultado[18][$i];
        
$datos[$i]['FECHA_ULT_COMPRA'] = $resultado[19][$i];
        
$datos[$i]['COSTO_UNI'] = $resultado[20][$i];
        
$datos[$i]['VENTA_UNI'] = $resultado[21][$i];
        
$datos[$i]['COD_FAM'] = $resultado[22][$i];
        
$datos[$i]['COLECCION'] = $resultado[23][$i];
        
$datos[$i]['PROVEEDOR_NOMBRE'] = $resultado[24][$i];
        
$datos[$i]['TEMPORADA'] = $resultado[25][$i];
    }
    return 
$datos;

para llamarla solo escribes lo siguiente

Código PHP:
$arreglo Distribuir_Datos($variable_con_el_contenido_del_archivo_xml); 
dentro de la variable $arreglo quedara almacenados todos los datos de forma individual, si le pasas la funcion print_r() a la variable $arreglo podrias ver que la estructura, es algo asi

Código PHP:
Array
(
    [
0] => Array
        (
            [
TIENDA] => 101
            
[PROVEEDOR] => 3558
            
[CATEGORIA] => 0012
            
[DIVISION] => 0003
            
[SKU] =>        63528190
            
[EAN] => 740617090185
            
[EAN_RELACIONADO] => 0
            
[ENL_ART] => 63528190
            
[DES_ART] => MEMORIA KINGSTON USB 2 GB DTI2GB
            
[TALLA] => Sin Talla
            
[COLOR] => Sin Color
            
[MARCA] => KINGSTON
            
[ESTILO] => DTI2GB
            
[VTA_DIA_Pzas] => .00
            
[VTA_DIA_Impte] => .00
            
[VTA_MES_Pzas] => 3.00
            
[VTA_MES_Impte] => 398.25
            
[FECHA_ALTA] => 20060903
            
[FECHA_ULT_COMPRA] => 20090914
            
[COSTO_UNI] => 115.00
            
[VENTA_UNI] => 169.00
            
[COD_FAM] => 00120003003100030001
            
[COLECCION] => BASICO
            
[PROVEEDOR_NOMBRE] => INTELIGENCIA EN PUNTO DE VENTA SA
            
[TEMPORADA] => TODO TIEMPO
        
)


donde el [0] seria el primer producto y asi sucesivamente si ubiesen mas

Última edición por alex16x; 26/11/2009 a las 19:38
  #5 (permalink)  
Antiguo 27/11/2009, 13:36
Avatar de venom_mau  
Fecha de Ingreso: julio-2009
Mensajes: 152
Antigüedad: 14 años, 9 meses
Puntos: 2
Respuesta: Duda con php, mysql y xml :P

Muchas gracias alex16x

Me ayudaste en serio....

Saludos :)
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 14:56.