Newsgroup: it.comp.www.php
Titolo: xml_mammamia_xml

salve a tutti,
sono alle prese con un "sovradimensionato" file .xml che attualmente sta 
funzionando da... database :-/
si tratta di un file nientepopo'dimenoche di 14Mb, enorme direi.
dunque, devo trovare un modo per trasformare questa robaccia in un 
formato che, alla fine del giro, sia "mysql-compliant" e che diventi 
quindi un db mysql.
vorrei farlo con php, ma con xml non so da dove partire e non ho alcun 
tipo di esperienza (zeromeno) con l'XML.
ho provato alcuni script in giro ma, come ho detto, ho un buio totale 
per questo genere di file e quello che ottengo e' un output (video o 
file) del tutto sformattato e inutilizzabile
:(
la struttura del file .xml e' qualcosa di simile:
- <articoli>
   - <articolo>
     <id>1</id>
     <data>200303271526</data>
     <titolo>Come diavolo faccio?</titolo>
     <testo>(centinaia di caratteri in questo campo!)</testo>
   - </articolo>
......qua circa 900 altri articoli lunghi! (son 14mb!)
- </articoli>
l'ideale, naturalmente, sarebbe far scrivere i dati in una tb mysql, per 
poi elaborarla anche in un secondo momento.
oppure anche un DUMP, o anche un csv (sic!), o insomma qualcosa ....
:-/
aiut! :(
-- 
spintop
[ spintop _ chez _ virgilio _ point _ it ]

 - </articolo>
Per iniziare tieni conto che mediamente nelle implementazioni di DOM la
memoria richiesta per elaborare/caricare un file XML e' pari a 10 volte
la dimensione del file stesso.
Per questo IMHO la soluzione migliore potrebbe essere l'utilizzo di SAX.
Una leggera modifica al codice d'esempio della funzione xml_set_object:
<pre>
<?php 
class xml  { 
	var $parser; 
	var $tag = '';
	var $record = array ();
 
	function xml() 
	{ 
		$this->parser = xml_parser_create(); 
 
		// la prossima riga solleva il warning:
		// Call-time pass-by-reference has been deprecated  
		xml_set_object ($this->parser, &$this); 
		xml_parser_set_option ($this->parser, XML_OPTION_CASE_FOLDING, false);
		xml_parser_set_option ($this->parser, XML_OPTION_SKIP_WHITE, true);
		xml_set_element_handler($this->parser, "tag_open", "tag_close"); 
		xml_set_character_data_handler($this->parser, "cdata"); 
	} 
 
	function parse($data) 
	{ 
	   xml_parse($this->parser, $data); 
	} 
 
	function tag_open($parser, $tag, $attributes) 
	{ 
	   $this->tag  = $tag;
	} 
 
	function cdata($parser, $cdata) 
	{ 
		if (isset ($this->record[$this->tag])) {
			$this->record[$this->tag] .= $cdata;	
		} else {
	   		$this->record[$this->tag] = $cdata;
		}
	} 
 
	function tag_close($parser, $tag) 
	{ 
		if ($tag == 'articolo') {
			// esegui SQL Insert
			print_r ($this->record);
		}
	} 
 
} // end of class xml 
$file = 'articoli.xml';
$xml_parser = new xml(); 
$xml_parser->parse(file_get_contents ($file)); 
?>
</pre>
-- 
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.


:Provate a guardare gli ingredienti del famoso Labello che si usa per
:le labbra screpolate: Butirrospermum Parkii (sperma di maiale).

 ...il sistema pulito con PHP, comunque, e' quello descritto da Setec.
tanto per sfizio, ti dico cosa ho dovuto fare: nulla che abbia a che 
fare con la logica :(
ho notato che questo file .xml non ha solo quei "campi", ma anche altri.
beh non che la cosa faccia differenza.
il problema nasce dal fatto che alcuni records HANNO specificati quei 
campi..... altri NO.
dunque una struttura irregolare! :(
l'unica cosa che ho potuto fare e' un find & replace da gEdit, usando 
qualche regex di tanto in tanto quando possibile.
non ti dico l'ammattimento, mannaggia!!
:((((
