Leggere dati da file xml

  • Creatore Discussione Creatore Discussione LaKanka
  • Data di inizio Data di inizio

LaKanka

Utente Attivo
29 Ago 2008
166
0
0
Ciao a tutti, ho un problema con dei file xml mooolto grandi....
Ho utilizzato questo file per importare delle offerte sul mio sito, ma questo xml mi viene rimandato ogni giorno aggiornato...
quindi le offerte nuove le inserisco per la prima volta, quelle modificate le modifico ed il mio problema sono quelle che non ci sono più....

Dovrei fare un controllo tra gli id sull'xml e quelli sul mio DB....

$query="select id from offerte";
$result = mysql_query($query) or die(mysql_error());
while ($offerta= mysql_fetch_object($result)){

qui dovrei scorrere il file xml e controllare se l'id dell'offerta nel database è contenuta nell'xml....
se non è presente nell'xml allora la cancello....
ma non trovo il modo di scorrere il file xml ed estrapolarne solo gli id....

Qualcuno sa come posso fare???

vi posto la composizione del file xml che mi arriva, l'id che mi serve è contenuto nel tag A083:
PHP:
<RECORD>
               <RECORD Type= 'Long Ineger'> 1 </RECORD>
               <A001 Type= 'Date/Time'> 27/06/2007 </A001>
               <A002 Type= 'Date/Time'> 14/07/2009 </A002>
               <A003 Type= 'Date/Time'> 27/07/2009 </A003>
               <A005 Type= 'Text'>
               <![CDATA[ITALIA
               ]]></A005>
               <A006 Type= 'Text'>
               <![CDATA[TOSCANA
               ]]></A006>
               <A007 Type= 'Text'>
               FI
               </A007>
               <A008 Type= 'Text'>
               <![CDATA[FIRENZE
               ]]></A008>
               <A009 Type= 'Text'>
               <![CDATA[SAN QUIRICO DI LEGNAIA
               ]]></A009>
               <A010 Type= 'Text'>
               50142
               </A010>
               <A011 Type= 'Text'>
               VENDITA
               </A011>
               <A012 Type= 'Text'>
               NO
               </A012>
               <A013 Type= 'Text'>
               1960
               </A013>
               <A017 Type= 'Integer'> 4 </A017>
               <A018 Type= 'Double'> 77 </A018>
               <A019 Type= 'Integer'> 1 </A019>
               <A020 Type= 'Text'>
               <![CDATA[
               ]]></A020>
               <A021 Type= 'Integer'> 1 </A021>
               <A022 Type= 'Text'>
               <![CDATA[
               ]]></A022>
               <A023 Type= 'Integer'> 0 </A023>
               <A024 Type= 'Text'>
               <![CDATA[
               ]]></A024>
               <A025 Type= 'Integer'> 1 </A025>
               <A026 Type= 'Text'>
               <![CDATA[
               ]]></A026>
               ....
               [B]<A083 Type= 'Text'>
               00-01-1-0001-376
               </A083>[/B]
               <A084 Type= 'Text'>
               NO
               </A084>
               <A085 Type= 'Text'>
               SI
               </A085>
               <A086 Type= 'Text'>
               SI
               </A086>
               <A087 Type= 'Text'>
               NO
               </A087>
               <A088 Type= 'Text'>
               
               </A088>
               <A089 Type= 'Text'>
               <![CDATA[
               ]]></A089>
               <A090 Type= 'Memo'>
               
               </A090>
          </RECORD>
 
Una domanda, ma se aggiorni il DB (insert di nuove offerte e update di offerte preesistenti) vuol dire che da qualche parte l'XML lo leggi.
Comunque, piuttosto che fare tutti questi controlli non potrebbe essere più semplice fare un drop della/e tabelle e ricrearle con il nuovo XML aggiornato?
 
La struttura dell'XML da te postata non è molto chiara, ma dal discorso che fai mi sembra di capire che esso sia composto da più elementi di nome RECORD (tu ne hi postato solo uno giusto?) che quindi saranno contenuti in un elemento contenitore (tipo RECORDS). Inoltre nell'elemento RECORD è cuntenuto un elemento con lo stesso nome.
Comunque come codice di partenza puoi provare a fare così:

PHP:
<?php
  $objDOM = new DOMDocument();
  $objDOM->load("record.xml"); // nome del file .XML

  $rec = $objDOM->getElementsByTagName("RECORD");

  foreach ($rec as $value) {
$id=$value->getElementsByTagName("A083")->item(0)->nodeValue;
      echo "A083: $id <br>";
  }
?>

ed adattarlo alle tue esigenze.
 
le offerte nuove le inserisco per la prima volta, quelle modificate le modifico ed il mio problema sono quelle che non ci sono più....
Se gl'inserimenti venissero fatti anche da sito (indipendentemente dal file xml) la cancellazione dei record della tabella prodotti (e non il drop che corrisponde alla cancellazione della tabella dal db) non sarebbe praticabile. Dicendo che vuoi cancellare quelli che non ci sono più nell'xml deduco che non sia questo il caso.

Puoi raccogliere (prendendo spunto dal ciclo mostrto da satifal) gl'id in una stringa separate da virgola. Questo lo puoi fare mentre fai inserimenti e modifiche.

PHP:
$elenco_id="";
// ... dentro al ciclo di lettura dell'xml, dopo aver trovato l'id
if ($elenco_id!="") $elenco_id.=",";
$elenco_id.="'".$id."'";
// ... inserimento o modifica del record su db

All'uscita dal ciclo cancelli tutti i record del db che non hanno gl'id che hai collezionato in $elenco_id (suppongo che il campo corrispondente si chiami 'codice' e la tabella si chiami 'prodotti'):
mysql_query("delete from prodotti where codice not in ($elenco_id)");

L'aggiornamento così è finito.
 
Ultima modifica:
Ho provato il codice succerito da Satifal ma come out appare:
"Warning: DOMDocument::load() [function.DOMDocument-load]: Input is not proper UTF-8, indicate encoding ! Bytes: 0xC0 0x0D 0x0A 0x20 in /file.MDB.XML"

file.MDB.XML è il file xml che utilizzo...
L'xml è composto da più elementi <RECORD>...

Forse il problema è che non ho la classe DOM??
Il php che utilizzo è il 5.2.6....
 
Credo dipenda dal contenuto del file XML. Puoi provare ad allegarlo magari comprimendolo così gli do un'occhiata.
 
Non riesco ad inviartelo, mi da questo errore:
file.mdb.xml file non valido
 
Ecco.. scusa ma ero di fretta e stavo cercando di inviartelo decompresso... sorry...
 

Allegati

Eccomi qui. Allora, ho scaricato il file e l'ho dato in pasto al codice di prova e non ho avuto problemi a farglielo leggere. L'unico problema è dovuto al doppio element RECORD infatti nell'XML vi è una serie di element contenitori RECORD ciascuno dei quali contiene a sua volta un altro element RECORD che contiene il numero del record. A causa di ciò, nel foreach l'attributo A083 è presente una vola si ed una volta no e ciò genera un warning.
Se non è possibile modificare l'XML allora bisogna modificare il codice affinchè legga solo i RECORD che contengono l'attributo A083.
 
Ultima modifica:
Il file l'ho dovuto ridurre ad un decimo altrimenti non mi inviava neppure lo zip...
Comunque la procedura che uso per inserire o aggiornare i dati è:
Di $salta ne ho tolti una cifra perchè superavo i caratteri
PHP:
<?php include "init.php";
$indice = 500;
$indice2 = 2800;
    $contatore = 0;
    $quanti = 15000;
	$oggi= date("Y-m-d"); 
    $apri_xml = fopen("zip/area4.MDB.XML", "r");
    while(!feof($apri_xml))
    {
        $buffer = ltrim(Chop(fgets($apri_xml, $indice)));
        if (($buffer == "<RECORD>") && ($contatore < $quanti))
        {	$inserisci=1; $contatore++;
//$salta sono righe con tag che non mi interessano
            $salta = ltrim(Chop(fgets($apri_xml, $indice)));
// la data la utilizzo per capire se ci sono state modifiche dall'ultimo aggiornamento sul mio sito
			$data = ltrim(Chop(fgets($apri_xml, $indice)));
			$data = ereg_replace("<A001 Type= 'Date/Time'>", "", $data);
			$data = ereg_replace("</A001>", "", $data);
			$data = ltrim($data);
			$g=substr($data, 0, 2);
			$m=substr($data, 3, 2);
			$a=substr($data, 6, 4);
			$data= $a.'-'.$m.'-'.$g;
           
			$data2 = ltrim(Chop(fgets($apri_xml, $indice)));
			$data2 = ereg_replace("<A002 Type= 'Date/Time'>", "", $data2);
			$data2 = ereg_replace("</A002>", "", $data2);
			$data2 = ltrim($data2);
			$g=substr($data2, 0, 2);
			$m=substr($data2, 3, 2);
			$a=substr($data2, 6, 4);
			$data2= $a.'-'.$m.'-'.$g;
           
			$data3 = ltrim(Chop(fgets($apri_xml, $indice)));
			$data3 = ereg_replace("<A003 Type= 'Date/Time'>", "", $data3);
			$data3 = ereg_replace("</A003>", "", $data3);
            
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$tipo = ltrim(Chop(fgets($apri_xml, $indice)));
			$tipo=substr($tipo, 9);
			if ($tipo!='offerta') $inserisci=0;
//se la tipologia non è quella che mi interessa metto inserisci=0 ed alla fine controllo di non inserirlo nel DB
           
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$nazione = ltrim(Chop(fgets($apri_xml, $indice)));
			$nazione = substr($nazione, 9);
			if ($nazione!='ITALIA') $inserisci=0;
//se la nazione non è quella che mi interessa metto inserisci=0 ed alla fine controllo di non inserirlo nel DB
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$provincia = ltrim(Chop(fgets($apri_xml, $indice)));
			$query="select * from province where sigla = '$provincia'";
			$result = mysql_query($query) or die(mysql_error());
			$prov = mysql_fetch_object($result);
			$provincia=$prov->nome;
           
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$comune = ltrim(Chop(fgets($apri_xml, $indice)));
			$comune = substr($comune, 9);
			$comune=strtolower($comune);
			$query="select * from comuni where codice_provincia = '$prov->codice'";
			$result = mysql_query($query) or die(mysql_error());
			while($comune2 = mysql_fetch_object($result)) {
			$comune2_nome= strtolower($comune2->nome);
			
			if ($comune==$comune2_nome) $comune= $comune2->nome;
			}
           
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$zona = ltrim(Chop(fgets($apri_xml, $indice)));
			$zona = substr($zona, 9);
           
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$cap = ltrim(Chop(fgets($apri_xml, $indice)));
           		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$contratto = ltrim(Chop(fgets($apri_xml, $indice)));
			$contratto = strtolower($contratto);
			$contratto = ucfirst($contratto);
           		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$prezzo = ltrim(Chop(fgets($apri_xml, $indice)));
			$prezzo = ereg_replace("<A014 Type= 'Double'>", "", $prezzo);
			$prezzo = ereg_replace("</A014>", "", $prezzo);
			$prezzo = ereg_replace(" ", "", $prezzo);
          		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$tipologia = ltrim(Chop(fgets($apri_xml, $indice)));
			$tipologia = substr($tipologia, 9);
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$superficie = ltrim(Chop(fgets($apri_xml, $indice)));
			$superficie = ereg_replace("<A018 Type= 'Double'>", "", $superficie);
			$superficie = ereg_replace("</A018>", "", $superficie);
			$superficie = ereg_replace(" ", "", $superficie);
          		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$descrizione = ltrim(Chop(fgets($apri_xml, $indice2)));
			$descrizione2 = substr($descrizione, 0, 9);
			if($descrizione2!='<![CDATA[')
			$descrizione = ltrim(Chop(fgets($apri_xml, $indice2)));
			$descrizione = substr($descrizione, 9);
          		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$nome_agenzia = ltrim(Chop(fgets($apri_xml, $indice)));
			$nome_agenzia = substr($nome_agenzia, 9);
         		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$indirizzo = ltrim(Chop(fgets($apri_xml, $indice)));
			$indirizzo = substr($indirizzo, 9);
          		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$comune_agenzia = ltrim(Chop(fgets($apri_xml, $indice)));
			$comune_agenzia = substr($comune_agenzia, 9);
         		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$provincia_agenzia = ltrim(Chop(fgets($apri_xml, $indice)));
			$query="select * from province where sigla = '$provincia_agenzia'";
			$result = mysql_query($query) or die(mysql_error());
			$prov = mysql_fetch_object($result);
			$provincia_agenzia=$prov->nome;
          		$comune_agenzia=strtolower($comune_agenzia);
				$query="select * from comuni where codice_provincia = '$prov->codice'";
				$result = mysql_query($query) or die(mysql_error());
				while($comune2 = mysql_fetch_object($result)) {
				$comune2_nome= strtolower($comune2->nome);
				if ($comune_agenzia==$comune2_nome) $comune_agenzia= $comune2->nome;
				}
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$cap_agenzia = ltrim(Chop(fgets($apri_xml, $indice)));
            
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$tel = ltrim(Chop(fgets($apri_xml, $indice)));
          
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$fax = ltrim(Chop(fgets($apri_xml, $indice)));
          
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$sito = ltrim(Chop(fgets($apri_xml, $indice)));
			$sito = substr($sito, 4);
          		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$email = ltrim(Chop(fgets($apri_xml, $indice)));
         		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$rif = ltrim(Chop(fgets($apri_xml, $indice)));
          		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$id_agenzia = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$riservato = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$prima_img = ltrim(Chop(fgets($apri_xml, $indice)));
          		$path=substr($prima_img, 0, -5);
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$n_img = ltrim(Chop(fgets($apri_xml, $indice)));
			$n_img = ereg_replace("<A080 Type= 'Integer'>", "", $n_img);
			$n_img = ereg_replace("</A080>", "", $n_img);
			$n_img = ereg_replace(" ", "", $n_img);
			if($n_img>5) $n_img = 5;
           		$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$id = ltrim(Chop(fgets($apri_xml, $indice)));
			$query="select * from immobili where id_x= {$id}";
			$result = mysql_query($query) or die(mysql_error());  
			$immobile = mysql_fetch_object($result);
			if(($immobile)&&($immobile->modifica==$data2)) $inserisci=0;
			
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			$salta = ltrim(Chop(fgets($apri_xml, $indice)));
			if($inserisci==1) { echo 'inserito<br>'; 
			$a=0;
			$query="select * from registrazioni where (id_x != 'NULL')&&(id_x != '0')";
			$result = mysql_query($query) or die(mysql_error());  
			while ($agente = mysql_fetch_object($result)){
			if($id_agenzia==$agente->id_x) 
//il registrato è già presente nel DB, non è nuovo
$a=1; }
			if ($a==0) {
//se il registrato non esiste nel DB, la inserisco
			$query = "INSERT INTO registrazioni (registrato,nome,indirizzo,cap,provincia,comune,tel,fax,email,sito,date,id_immobilia2000) VALUES ( 'agente',"
.sql_string(trim($nome_agenzia)).","
.sql_string(trim($indirizzo)).","
.sql_string(trim($cap_agenzia)).","
.sql_string(trim($provincia_agenzia)).","
.sql_string(trim($comune_agenzia)).","
.sql_string(trim($tel)).","
.sql_string(trim($fax)).","
.sql_string(trim($email)).","
.sql_string(trim($sito)).","
.sql_string(trim($oggi)).","
.sql_string(trim($id_agenzia))." )";
			$row_set = mysql_query($query, $conn) or die("Errore nella query di inserimento: " . mysql_error());
			$cid = mysql_insert_id($conn); }
			else {
			$query="select * from registrazioni where id_x = '$id_agenzia'";
			$result = mysql_query($query) or die(mysql_error());  
			$agente = mysql_fetch_object($result);
			$cid=$agente->id;
			}
		$i=0;
			$query="select * from immobili where (id_x != 'NULL')&&(id_immobilia2000 != '0')";
			$result = mysql_query($query) or die(mysql_error());  
			while ($immobile = mysql_fetch_object($result)){
			if($id==$immobile->id_x) 
//l'offerta è già presente nel DB, non è nuova, forse da aggiornare
$i=1; }
			if ($i==0) {	
/l'offerta è nuova, la inserisco nel DB
		$query = "INSERT INTO immobili (provincia,comune,zona,descrizione,prezzo,superficie,tipologia,cessione,contratto,id_registrato,registrato,pubblicato,date,modifica,n_foto,id_immobilia2000) VALUES ( "
		.sql_string(trim($provincia)).","
		.sql_string(trim($comune)).","
		.sql_string(trim($zona)).","
		.sql_string(trim($descrizione)).","
		.sql_numeric(trim($prezzo)).","
		.sql_numeric(trim($superficie)).","
		.sql_string(trim($tipologia)).","
		.sql_string(trim($cessione)).","
		.sql_string(trim($contratto)).","
		.sql_string(trim($cid)).", 'agente', 1, "
		.sql_string(trim($data)).","
		.sql_string(trim($data2)).","
		.sql_numeric(trim($n_img)).","
		.sql_string(trim($id))." )";
		$row_set = mysql_query($query, $conn) or die("Errore nella query di inserimento: " . mysql_error()); 
		$id_immobile = mysql_insert_id($conn);
//inserisco anche le foto
		for ( $k = 1; $k <= $n_img; $k++)
{ $path_ok= $path.$k.'.jpg';
  $query = "INSERT INTO `photo` VALUES (NULL, '{$path_ok}', {$id_immobile})";
		$row_set = mysql_query($query, $conn);
}
		} else {
//se l'offerta non è nuova la aggiorno se la data di ultima modifica "data2" è maggiore della data dell'ultimo aggiornamento
		$query="select * from immobili where id_x = '$id'";
			$result = mysql_query($query) or die(mysql_error());  
			$immobile = mysql_fetch_object($result);
			$data_m=$immobile->modifica;
			$data_m= convertiData($data_m); 
			if($data2>$data_m){
			$query = "UPDATE `immobili` SET `provincia` = '{$provincia}',`comune` = '{$comune}',`zona` = '{$zona}',`descrizione` = '{$descrizione}',`prezzo` = '{$prezzo}',`superficie` = '{$superficie}',`tipologia` = '{$tipologia}',`cessione` = '{$cessione}',`contratto` = '{$contratto}',`id_registrato` = '{$cid}',`registrato` = 'agente',`pubblicato` = 1 ,`date` = '$data',`modifica` = '$data2',`n_foto` = '{$n_img}' WHERE `id_x` = '$id'";
    $row_set = mysql_query($query, $conn) or die("Errore nella query di aggiornamento: " . mysql_error());
	$query="select * from photo where id_immobile = '{$immobile->id}'";
			$result = mysql_query($query) or die(mysql_error());  
			while($photo = mysql_fetch_object($result)) {
			$query2= "DELETE FROM photo where id={$photo->id}";
	$delete2= mysql_query($query2, $conn) or die("Errore nella query: $query " . mysql_error());;
	}
	$k=1;
	while($k<=$n_img) { 
//	for ( $k = 1; $k <= $n_img; $k++)
//{
 $path_ok= $path.$k.'.jpg';
  $query = "INSERT INTO `photo` VALUES (NULL, '{$path_ok}', {$immobile->id})";
		$row_set = mysql_query($query, $conn);
		$k++;
}
	
		}
			}
					
			} else echo 'saltato<br>';
        }
    }
	echo $contatore;
    fclose($apri_xml);

è un pò brigoso come codice, lo so ma è anche l'unico che ha funzionato perfettamente tra tutti quelli che ho trovato in rete....
 
A me questo con il tuo file funziona:

PHP:
<?php
  $objDOM = new DOMDocument();
  $objDOM->load("area4.mdb.xml");

  $rec = $objDOM->getElementsByTagName("RECORD");

  foreach ($rec as $value) {
	  $ids = $value->getElementsByTagName("A083");
	  if ($ids->item(0) != NULL) {
	  	$id = $ids->item(0)->nodeValue;
	  	echo "A083: $id <br/>";
	  }
  }
?>

Con la modifica che ho apportato si evita il warning relativo ai RECORD element annidati.
Fammi sapere.
 
Ultima modifica:
Niente da fare...
Warning: DOMDocument::load() [function.DOMDocument-load]: Input is not proper UTF-8, indicate encoding ! Bytes: 0xC0 0x0D 0x0A 0x20

Il file xml mi arriva zippato nel mio ftp ed una volta decompresso l'archivio ho 2 file:
-indice.MDB
-indice.MDB.XML

Ho provato ad aprire il file xml ma è 97,3 MB e mi si impalla il pc se provo ad aprirlo....

Quello che ti ho inviato è sempre la stessa struttura dell'xml su cui devo lavorare, ma semplicemente in formato moooolto ridotto....

Può essere che mi manchi la classe per utilizzare i DOM?
Come lo scopro? devo chiedere al provider?
 
Come prima cosa potresti fare una prova con un file ridotto (tipo quello che hai mandato a me) e vedere se continua a darti errore.
Per quanto riguarda il parsing dell'XML ci sone varie librerie esterne, ma nel mio esempio mi sono preoccupato di non utilizzarle. Infatti le funzioni da me utilizzate dovrebbero essere API native di PHP 5 (dai un'occhiata QUI).

In alternativa (magari è più efficiente per file molto grandi) puoi utilizzare XML Parser QUI e le librerie QUI

Comunque l'errore che ti viene restituito sembra dovuto al contenuto del file XML. Infatti il messaggio di errore riguarda la codifica UTF-8. Probabilmente nel file che ricevi ci sono caratteri speciali oppure "sporchi".
 
Il metodo costruttore di DOMDocument() permette di passare due parametri in input che rappresentano la codifica da utilizzare. Trovi maggiori info QUI. Negli esempi vengono utilizzate codifiche differenti come:

PHP:
$dom = new DOMDocument('1.0', 'iso-8859-1');
$dom = new DOMDocument('1.0', 'UTF-8');

Apri il foile XML e controlla all'inizio la codifica utilizzata. Se utilizzi la stessa codifica nel DOM e continua a darti errore allora probabilmente ci sono dei caratteri non consentiti nel file XML.
 
ora mi fai venire il dubbio di non averlo corrotto decomprimendolo....
Il file che ti ho inviato funziona benissimo anche da me....
ora provo a decomprimero sul mio pc ed utilizzare quello....
ti saprò dire... vista la dimensione ci metterò un pò...
 
Si, c'è qualcosa che non va nel file xml alla line 180279...
ma non riesco ad aprirlo sul mio pc... mi impalla tutto...
 
Effettivamente 97,3 MB sono molti. Secondo me dovresti lavorare su file più piccoli, magari facendoteli mandare spezzettati se possibile.
 
Ho risolto salvando gli id in un array $id[] ed alla fine faccio una chiamata al DB dove per ogni oggetto confronto l'id con $id[$i]...
Ho dovuto aumentare il max_execution_time ma almeno funziona...
e come si dice... i problemi non vengono mai da soli ora ho un problema di caratteri che non mi aveva mai dato prima di cambiare server e DB...
Posterò una nuova discussione per questo...:dipser:
Anche perchè tutto quello che ho trovato in rete non mi aiuta....

Grazie mille per l'aiuto!!!
 
Scusa, ma in questo caso io ti consiglierei di fare una pre-elaborazione in locale. Mi spiego: fai uno script che da xml te lo trasforma in un formato più condensato (l'xml è abbastanza prolisso, poi ho capito che parecchi dati li salti quindi alla fine di tutti quei MB te ne servono molti meno). Potresti ad esempio avere un csv.
A quel punto ne fai upload sul server e da lì un secondo script on-line effettua le operazioni che desideri sugli unici dati che ti interessano.
Il problema dei caratteri lo risolveresti off-line.
 
Ne terrò conto se mi ricapita il problema, ma per ora ho risolto...
Grazie comunque:p
 

Discussioni simili