Io preferisco usare la lib DOMDocument ..
Cmq e' una tua scelta l'importante e' leggere corettamente l'xml
quello che posso consigliarti e' di implementare una corretta gestione degli errori.
Un buon modo di farla e' creare una classe importer che lanci le relative eccezioni in caso di errore.
Lancia il parse completo in un unico cron, se le dimensioni dei files non sono troppo grandi non ci metti molto.
quindi crei la classe con i metodi che lancino eccezzioni in caso di errore.
nello script cron istanzi la classe e la lanci dentro i relativi try catch .
facci esempio
Codice PHP:
classe importer
attributo privato $xml // contiene l'xml parsato oppure false
/*
Cerca, scarica e parsa il file xml e lo stipa in $this->xml
Lancia eccezione in caso di errore
*/
costruttore (url file)
/*
Ritorna il set di nodi di nome $loadName
Lancia eccezione in caso di errore
*/
metolo loadDataSet( $nodeName ){}
/*
Scansione e conversione di un singolo nodo
ritorna array( "field"=>"value" ) dei valori letti
lancia eccezione in caso di errore
*/
metodo nodeToData( $row )
/*
Utilizza i metodi sopracitati e gestisce eventuali eccezioni
Ritorna array( "row" => array( "field"=>"value" ) )
lancia eccezione in caso di errore
*/
metodo getData( $nodeName )
/*
- controlla che esista il documento xml parsato nell'attributo della classe "xml" altrimenti => eccezione
- [try] lancia this->loadDataSet($bodeName) [/try][catch]gestisce eccezione[/catch]
- istanzia variabile $out = array() ;
-
[try] ciclo che scorre tutti i nodi
Per ogni nodo :
- [try] $data = this->getData[/try][catch]$data = false Oppure messaggio dell'eccezione vedi te come gestire [/catch]
- esegui il push dei dati nella strutura dati $out[] = $data
[/try]
- retiruisci $out
*/
QUIndi nello script principale in cron avrai una cosa del tipo
Codice PHP:
try{
$importer = new Importer( "http://www.percorsoxml.xml" ) ;
} catch(Exception $e){ /* GESTIONE ECCEZIONE */ }
try{
$data = $importer->getData( "record" ) ;
// Conversione in sql
$q = "insert into table "
$f = "" ;
$v = "" ;
foreach( $data as $d )
{
if( $d && is_array($d) )
{
foreach( $d as $field=>$value )
{
//concatena
$f = $field." , " ;
$v = "'".$v."' , " ;
}
}
}
if( $f && $v )
{
$f = substr( $f,0,strrpos($f,"") ) ;
$v = substr( $v,0,strrpos($v,"") ) ;
$q .= "($f) values($v)";
// ETC ETC...
}
else
{ /* ERRORE */ }
} catch(Exception $e){ /* GESTIONE ECCEZIONE */ }
Nel caso il metodo di conversione array->sql puoi farlo anche piu' raffinato oppure generare direttamente la stringa di insert nella funziona getData, dipende da te. CMq devi gestire bene le eccezioni e vedrai che anche in caso di 1 errore il tuo script funziona comunque semplicemente tiene traccia degli errori in un log o dove ti pare.
Gud Lac