Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/11/2009, 17:08
Avatar de venom_mau
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.