[ Foro de PHP ]

Comprobar Archivos XML

16-Jan-2023 11:39
Juan Carlos Mairata Barcel
2 Respuestas

Estoy haciendo una pequeña aplicación que lo que debe de hacer es recoger de una ubicación los diferentes archivos XML, comprobar si están bien formados, en caso de que alguno de ellos no lo este lo grabe en un log y pase al siguiente archivo XML y finalmente que capturemos unos datos de estos archivos XML y los guardemos en una BBDD.

El problema es que me he atascado y no consigo averiguar como realizar la comprobación de los XML y que luego genere el log.

Les paso el codigo que tengo escrito.

<?php
// Obrim tots els xml i ho guardam en un json
$fitxers = glob("../archivos/*.xml", GLOB_ERR);
$resultat = array();
$a_id = array();

if (is_array($fitxers))
{
foreach($fitxers as $f)
{
$f2 = "";
$ip = explode(".",$f);
echo $f;
echo implode($ip);
$fitxer_ok = FALSE;
// comparar fitxers de wlan (1) o directip (2)
if (substr($ip[2], -3) == "1" && file_exists("../archivos/1.1.1.".$ip[5].".xml"))
{
$fmod = filemtime($f);
$fmod2 = filemtime("../archivos/1.1.1.".$ip[5].".xml");
$f2 = "../archivos/1.1.1.".$ip[5].".xml";
if ($fmod > $fmod2)
$fitxer_ok = TRUE;
}
elseif (substr($ip[2], -3) == "1" && file_exists("../archivos/2.2.2.".$ip[5].".xml"))
{
$fmod = filemtime($f);
$fmod2 = filemtime("../archivos/2.2.2.".$ip[5].".xml");
$f2 = "../archivos/2.2.2.".$ip[5].".xml";

if ($fmod > $fmod2)
$fitxer_ok = TRUE;
}
else
{
$fitxer_ok = TRUE;
}
if ($fitxer_ok && filesize($f) !=0 ) {
$xml = simplexml_load_file($f);
$d = $xml->coordinates[0]->count()-1;

$temp = array (
"id" => (string)$xml->attributes(),
"lat" => (string)$xml->coordinates[0]->coordinate[$d]->latitude,
"lon" => (string)$xml->coordinates[0]->coordinate[$d]->longitude,
"time" => (string)$xml->coordinates[0]->coordinate[$d]->time,
"alt" => (string)$xml->coordinates[0]->coordinate[$d]->altitude,
"ip"=> (string)substr($ip[2], -3),
);

$resultat[] = $temp;
$a_id[] = (string)$xml->attributes();

if (file_exists($f2)) $xml2 = simplexml_load_file($f2);
if (filesize($f) !=0 && filesize($f2) !=0 && (string)$xml->attributes() != (string)$xml2->attributes())
error_log("DISCREPANCIA, el id en les ips ".$f." i ".$f2." té dos ids: ".(string)$xml->attributes()." i ".(string)$xml2->attributes());
}

// Cream un fitxer LOG
$logFile = fopen("logbus.txt", 'a') or die("Error Creant el LOG");
fwrite($logFile, "\n".date("d/m/Y H:i:s")." Fitxer"." ".implode($fitxers)) or die("Error en el fitxer");
fclose($logFile);
}
}

$fp = fopen('as.json', 'w');

fwrite($fp, json_encode($resultat));

fclose($fp);

?>

¿ Alguien tiene alguna idea o se le ocurre alguna cosa para poder resolverlo ?
Gracias.


15-Mar-2023 00:21
Invitado (Alejandro Andrade)

Para comprobar si los archivos XML están bien formados, puedes utilizar la función 'simplexml_load_file()' que ya estás usando para leer los archivos. Si el archivo está mal formado, esta función devolverá 'false'. Por lo tanto, puedes comprobar si la carga del archivo devuelve 'false' y, en ese caso, escribir un mensaje en el archivo de registro.

Para guardar los mensajes de registro, ya estás utilizando la función 'error_log()', pero parece que la estás usando de manera incorrecta. En lugar de pasar el mensaje como un parámetro, deberías concatenarlo con los otros elementos que deseas registrar, utilizando el operador .. Además, parece que estás comprobando la existencia del segundo archivo XML después de cargar el primer archivo, por lo que si el segundo archivo no existe, la comprobación no se realizará. Por lo tanto, deberías mover la comprobación antes de cargar el archivo.


17-Mar-2023 12:08
Luis Bentancur



prueba con esto
// Obrim tots els xml i ho guardam en un json
$fitxers = glob("../archivos/*.xml", GLOB_ERR);
$resultat = array();
$a_id = array();

if (is_array($fitxers)) {
   foreach($fitxers as $f) {
       $f2 = "";
       $ip = explode(".",$f);
       echo $f;
       echo implode($ip);
       $fitxer_ok = FALSE;
       // comparar fitxers de wlan (1) o directip (2)
       if (substr($ip[2], -3) == "1" && file_exists("../archivos/1.1.1.".$ip[5].".xml")) {
           $fmod = filemtime($f);
           $fmod2 = filemtime("../archivos/1.1.1.".$ip[5].".xml");
           $f2 = "../archivos/1.1.1.".$ip[5].".xml";
           if ($fmod > $fmod2) {
               $fitxer_ok = TRUE;
           }
       } elseif (substr($ip[2], -3) == "1" && file_exists("../archivos/2.2.2.".$ip[5].".xml")) {
           $fmod = filemtime($f);
           $fmod2 = filemtime("../archivos/2.2.2.".$ip[5].".xml");
           $f2 = "../archivos/2.2.2.".$ip[5].".xml";
           if ($fmod > $fmod2) {
               $fitxer_ok = TRUE;
           }
       } else {
           $fitxer_ok = TRUE;
       }
       if ($fitxer_ok && filesize($f) !=0 ) {
           $xml = simplexml_load_file($f);
           if ($xml !== FALSE) {
               $d = $xml->coordinates[0]->count()-1;

               $temp = array (
                   "id" => (string)$xml->attributes(),
                   "lat" => (string)$xml->coordinates[0]->coordinate[$d]->latitude,
                   "lon" => (string)$xml->coordinates[0]->coordinate[$d]->longitude,
                   "time" => (string)$xml->coordinates[0]->coordinate[$d]->time,
                   "alt" => (string)$xml->coordinates[0]->coordinate[$d]->altitude,
                   "ip"=> (string)substr($ip[2], -3),
               );

               $resultat[] = $temp;
               $a_id[] = (string)$xml->attributes();

               if (file_exists($f2)) {
                   $xml2 = simplexml_load_file($f2);
                   if ($xml2 !== FALSE && filesize($f) !=0 && filesize($f2) !=0 && (string)$xml->attributes() != (string)$xml2->attributes()) {
                       error_log("DISCREPANCIA, el id en les ips ".$f." i ".$f2." té dos ids: ".(string)$xml->attributes()." i ".(string)$xml2->attributes());
                   }
               }
           } else {
               error_log("El archivo ".$f." no es un XML bien formado");
           }
       }

       // Cream un fitxer LOG
       $logFile = fopen("logbus.txt", 'a') or die("Error Creant el LOG");
       fwrite($logFile, "\n".date("d/m/Y H:i:s")." Fitxer"." ".implode($fitxers)) or die("Error en el fitxer");
       fclose($logFile);
   }
}

$fp = fopen('as.json', 'w');
fwrite($fp, json_encode($resultat));
fclose($fp);






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)