Código PHP: importe el archivo xml del servidor web (/ public_html / ctrackxml) en la base de datos mysql

Tengo archivos xml importados en un servidor FTP. Esto se almacena en la ubicación ‘/ public_html / ctrackxml /’ con un nombre de archivo aleatorio y en el siguiente formato:

 -1 SNK261GP 2012/01/20 08:34:45 AM -29.8477 30.9554 Driving 82 
near Outer Ring Road (N2); Umkumbaan; in Durban
1587000

Necesito recorrer todos los archivos en la carpeta e importar cada archivo en la tabla de la base de datos MySQL xmldata que tiene la siguiente estructura:

Tabla MySQL

Necesito que cada etiqueta en el archivo xml se importe en un campo separado en la tabla. por lo que cada archivo xml representa una entrada de tabla.

A partir de la investigación que he hecho, parece que necesito usar la syntax mysql ‘LOAD XML LOCAL INFILE’, pero no puedo hacer que funcione correctamente directamente en mysql.

Si pudieras señalarme en la dirección correcta, lo agradecería mucho.

Actualizar

a continuación se muestra el código que he manejado juntar con la ayuda de otro sitio web. http://www.phpfreaks.com/forums/index.php?topic=244744.0

Probé el script de phpfreaks y funciona al 100%; sin embargo, la estructura xml es bastante diferente. Intenté modificar el código para adaptar mi archivo xml pero tengo algunos problemas para que funcione.

mi código es el siguiente, pero actualmente falla en la statement de foreach:

 <?php echo "starting 

"; //mysql connection $con2 = mysql_connect("localhost","dbuser","dbpassword"); if (!$con2) { die('Could not connect: ' . mysql_error()); } $selectdb = mysql_select_db("dbname", $con2); if (!$selectdb) { die('Database not used: ; ' . mysql_error()); } echo "connected to DB

"; //simplexml load xml file $library = simplexml_load_file('http://www.website/ctrackxml/CTO_20120119140006_0000.xml'); echo "xml loaded

"; //loop through parsed xmlfeed and print output foreach ($message->message as $message) { printf("messageid: %s\n", $messageid->messageid); printf("mobile: %s\n", $mobile->mobile); printf("time: %s\n", $time->time); printf("latitude: %s\n", $latitude->latitude); printf("longitude: %s\n", $longitude->longitude); printf("status: %s\n", $status->status); printf("speed: %s\n", $speed->speed); printf("address: %s\n", $address->address); printf("direction: %s\n", $direction->direction); printf("runningodo: %s\n", $runningodo->runningodo); echo "xml parsed

"; //insert into databse mysql_query("INSERT INTO xml (messageid, mobile, time,latitude,longitude,status,speed,address,direction,odometer) VALUES (\"$messageid->messageid\", \"$mobile->mobile\", \"$time->time\", \"$latitude->latitude\", \"$longitude->longitude\", \"$status->status\", \"$speed->speed\", \"$address->address\", \"$direction->direction\", \"$runningodo->runningodo\")") or die(mysql_error()); echo "inserted into mysql

"; //show updated records printf ("Records inserted: %d\n", mysql_affected_rows()); } //close connection mysql_close($con2); ?>

Gracias como siempre a todos por la ayuda.

 
"; // Read filenames in current directory looking for XML files $file_arr = array(); if ($handle = opendir('.')) { while (false !== ($file = readdir($handle))) { if (($file != ".") && ($file != "..")) { if(substr($file, -4) == ".xml") { array_push($file_arr, $file); } } } closedir($handle); } // Loop through each XML file in the current directory foreach($file_arr as $filename) { //simplexml load xml file $mess = simplexml_load_file($filename); echo "xml loaded

"; $messageid = mysql_real_escape_string($mess->messageid); $mobile = mysql_real_escape_string($mess->mobile); $time = mysql_real_escape_string($mess->time); $latitude = mysql_real_escape_string($mess->latitude); $longitude = mysql_real_escape_string($mess->longitude); $status = mysql_real_escape_string($mess->status); $speed = mysql_real_escape_string($mess->speed); $address = mysql_real_escape_string($mess->address); $direction = mysql_real_escape_string($mess->direction); $runningodo = mysql_real_escape_string($mess->runningodo); echo "xml parsed

"; //insert into databse mysql_query("INSERT INTO xml (messageid, mobile, time, latitude, longitude, status, speed, address, direction, odometer) VALUES ('$messageid', '$mobile', '$time', '$latitude', '$longitude', '$status', '$speed', '$address', '$direction', '$runningodo')") or die(mysql_error()); echo "inserted into mysql

"; //show updated records printf ("Records inserted: %d\n", mysql_affected_rows()); } //close connection mysql_close($con2); ?>

El código anterior debería lograr lo que estás buscando según la especificación. Como se indicó, hay un registro XML por cada archivo XML.

Este código está diseñado para ejecutarse en el mismo directorio que los archivos XML; puede cambiarlo fácilmente editando el comando opendir en el código. Leerá todos los archivos XML en el directorio de trabajo actual y colocará los datos en la Base de datos.

Recientemente trabajé en un proyecto que tiene algunas similitudes con lo que necesita. Como sugirió Charles, utilicé simplexml para el análisis sintáctico. Mi tarea también requería conectarse vía ftp a un servidor, obtener archivos, descomprimirlos en un directorio, etc.

Mi enfoque fue escribir una secuencia de comandos que procesa un archivo, utiliza simplexml para leer el documento, hacer algunas transformaciones simples y escribir los datos en mysql.

Luego creé un contenedor de bash script simple que lee todos los archivos en un directorio y para cada uno, lo pasa como el parámetro a mi script de procesamiento.

Si descubrió que su estructura es lo suficientemente parecida como para permitir el uso de LOAD XML, no necesitará PHP en absoluto … solo el script bash y las llamadas repetidas al cliente de la línea de comando mysql.

La secuencia de comandos php acepta el nombre de archivo como el parámetro de línea de comando. Por supuesto, esto se refiere a la CLI de php. En realidad es una clase, pero es tan simple como esto cargar el archivo:

 if (file_exists($filename)) { $this->xml = simplexml_load_file($filename); 

Desde allí, puedes consultar los elementos muy fácilmente. Este script bash es típico de lo que estoy usando, donde lo pasa el directorio donde están todos sus archivos xml, y simplemente los procesa uno por uno.

 #!/bin/bash if [ $# -ne 1 ] then echo "No directory specified." exit 1 fi DIR="$( cd "$( dirname "$0" )" && pwd )" FILES="$1"/*.xml for f in $FILES do /usr/bin/php -f /path/to/yourscript.php $f done exit 0 

Si los documentos son exactamente como los describes entonces, una vez que hagas la carga que describí arriba (que supone que tienes una clase simple para facilitar tu variable xml, entonces solo necesitas escribir una statement de inserción y llamarla usando la función mysql_query. De hecho, le recomendamos que sintonice el esquema para que los tipos de columnas coincidan con el tipo de datos que obtiene para cada columna en lugar de tener varcars para los números. Esto podría ser tan simple como algo como esto:

 $msg = $this->xml->message; $query = "INSERT INTO YOUR TABLE (messageid, mobile...) VALUES ({$msg->message}, '{$msg->mobile}', ...)"; // assumes you already made db connection previously $result = mysql_query($query); if ($result) { // inserted ok. } else { // something wrong, check mysql_error() for specifics } 

Al navegar por su código, tiene el siguiente aspecto:

 foreach ($message->message as $message) { 

debería ser:

 foreach ($library->message as $message) { 

$library contiene su objeto XML, por lo que debe ser el que está accediendo y no el, hasta el momento, una variable de $message unitializada.

Si $message inicializara, su código actual se borraría con cada iteración del ciclo for porque asigna su elemento hijo a sí mismo.

 foreach ($library->message as $mess) { printf("messageid: %s\n", $mess->messageid); printf("mobile: %s\n", $mess->mobile); printf("time: %s\n", $mess->time); printf("latitude: %s\n", $mess->latitude); printf("longitude: %s\n", $mess->longitude); printf("status: %s\n", $mess->status); printf("speed: %s\n", $mess->speed); printf("address: %s\n", $mess->address); printf("direction: %s\n", $mess->direction); printf("runningodo: %s\n", $mess->runningodo); } 

Use mysql_real_escape_string () en su entrada. http://se2.php.net/manual/en/function.mysql-real-escape-string.php

No resolverá su problema actual, pero en el futuro se necesitarán caracteres de escape.

Encienda display_errors, habilite advertencias.

Pruebe la depuración con un contador en el bucle foreach $ i ++ o repita cada ciclo. descubre qué tan lejos va antes de fallar …