Newsgroup: it.comp.lang.javascript
Titolo: Lettura file

Scusate ma é da poco che mi cimento con questo linguaggio.
Ho fatto un piccolo script in java che dovrebbe caricare un file.
Leggendo qua e la in internet, sono riuscito a capire che molto
dipende dal browser che si utilizza.
Dovrei leggere un file XML e poi darlo in pasto allo script.
Ci sono riuscito, ma il problema che mi si presenta ora è questo.
Ho trovao la routine per caricare il file che è la seguente.
          function loadXMLDoc(dname){
              var xml;
              if (window.ActiveXObject){
                  xml=new ActiveXObject("Microsoft.XMLDOM");
              }
              else if (document.implementation &&
document.implementation.createDocument){
xml=document.implementation.createDocument("","",null);
              }
              else{
                  show = ('Your browser cannot handle this script');
              }
              xml.async=false;
              xml.load(dname);
              return(xml);
          }
FIREFOX legge bene i file grandi (aspettando che prima finisca?) per
poi tornare indietro all'istruzione che ha chiamato questa funzione.
IE invece no e quando torna indietro non ha nulla.
Ho trovato che la funzione object.readystate == 4 significa
"caricamento terminato", ma non riesco ad inserirla nel codice.
Potreste darmi una mano?
Grazie
Sergio

 Potreste darmi una mano?
Spero di esserti stato d'aiuto.
-- 
~ Il computer č una macchina progettata per velocizzare e
automatizzare
gli errori.

Scusa se rispondo solo ora, ma impegni mi hanno tenuto fuori dal
lavoro.
Non devo leggere da remoto, ma da file sul computer.
Mi sembra di aver capito che questa funzione legge un file remoto

 Non devo leggere da remoto, ma da file sul computer.
Allora ti rigiro la domanda: il codice che deve recuperare tale file,
che suppongo stia in una pagina HTML da quello che mi dici, dove sta?
Per semplificare, qual'è l'URL che andrà scritto nel browser?
In base a quello ci possono essere restrizioni di sicurezza.
Premesso questo, il fatto che IE nel tuo script originale si comporti
diversamente, potrebbe essere dato dal fatto che il file non passa le
validazioni. Verifica l'oggetto "parseError" (solo su IE):
	xml.async = false;
        xml.load(dname);
	if ( xml.parseError != 0 ){
		alert( xml.parseError.reason );
	}
	alert( xml.xml );
Alternativamente puoi passare alla modalità asincrona (che su file di
grosse dimensioni, come hai detto di avere, è decisamente indicata).
-- 
~ Plagiarism is copying from one source;
research is copying from two or more
(Wilson Mizner)

 grosse dimensioni, come hai detto di avere, � decisamente indicata).
Basta inserire
xml.async = true
xml.load(dname)
o altri codici?


 o altri codici?
Ti cambia tutto l'approccio.
Essendo asincrona, il codice non è più eseguito in modo seriale, ma si
ha una gestione ad eventi. In IE utilizzi l'onreadystatechange, mentre
in Firefox l'evento onload.
Nel primo caso devi anche verificare il readyState. Una bozza potrebbe
essere la seguente:
	function loaded(){
		// fai qualcosa con il documento caricato
		alert(this);
	}
	var doc = null;
 
	if ( document.implementation &&
document.implementation.createDocument ){
		doc = document.implementation.createDocument("","",null);		
		doc.onload = loaded;
	}else if ( window.ActiveXObject ){
		doc = new ActiveXObject("Microsoft.XMLDOM");
		doc.onreadystatechange = function(){
			if ( doc.readyState == 4 )
				loaded.call(doc);
		}
	}
 
	if ( doc != null ){
		doc.async = true;
		doc.load("mydata.xml");
	}
Molto bozza. Se t'interessa evitare che IE per Mac vada in errore, c'è
da usare la compilazione condizionale su "window.ActiveXObject", ma se
non t'interessa puoi anche farne a meno (se ho capito bene, non va sul
web).
-- 
~ "Lo  dice il  buon senso, ma il buon senso non è uno  standard".
(Jeffrey Zeldman)

 per forza di cose un indirizzo che verrà visualizzato.
Si, in effetti ho scritto questo codice e volevo vedere se funzionava
con entrambi i browser in modo da capire dove eventualmente sbagliavo.
L'applicativo per visualizzare utiliza il componente microsoft
shdocvw.dll che é un browser tipo IE e non ho la possibilità di far
caricare Firefox.
Il problema é stato appunto il fatto che Firefox, se voglio far
visualizzare più eventi, li visualizza tutti, mentre IE, come il
programma che sto facendo, no.
Tieni presente che all'interno del file ci sono anche i dati delle
stazioni che hanno registrato questo evento e che quindi il file é
molto lungo.
Sono riuscito al massimo a far "digerire" ad IE solo 14 eventi
(comprese le stazioni) ma solamente con uno in più non carica.
L'approccio che ho tentato io é un po' diverso.
In pratica faccio di questo:
          var xmlDoc=loadXMLDoc('event.xml');
// elaborazione di xml
          function loadXMLDoc(dname){
              var xml;
              if (window.ActiveXObject){
                  xml=new ActiveXObject("Microsoft.XMLDOM");
              }
              else if (document.implementation &&
document.implementation.createDocument){
 
xml=document.implementation.createDocument("","",null);
              }
              else{
                  show = ('Your browser cannot handle this script');
              }
	      xml.async=false;
	      xml.load(dname);
//	      alert('Caricamento eseguito. Il file contiene
'+xml.getElementsByTagName('event').length+' eventi');
	      return(xml);
          }
Sergio

 L'approccio che ho tentato io é un po' diverso.
Un po' diverso da cosa? Mi sfugge il soggetto. Comunque tu prova
a verificare innanzitutto se vi sono errori di parsing. Poi dato
che usi solo l'engine di IE, prova anche questo codice:
	function loadXMLDocument(src){
		var el = document.createElement("xml"), doc = null;
		el.async = false;
		el.src = src;
		document.body.appendChild( el );
		doc = el.XMLDocument;
		document.body.removeChild( el );
		return doc;
	}
	window.onload = function(){
		alert( loadXMLDocument("mydata.xml").xml );
	}
Oppure, prova a sostituire nel tuo:
	xml = new ActiveXObject("Microsoft.XMLDOM");
con:
	xml = new ActiveXObject("Msxml2.DOMDocument.4.0");
Ovviamente, rimangono i suggerimenti dell'altra volta, dei quali
aspetto ancora i risultati.
-- 
~ "Il semble que la perfection soit atteinte non quand il n'ya plus
rien à ajouter, mais quand il n'ya plus rien à retrancher"
(A. de Saint-Exupéry)


Provo a sostituire il secondo. Ho una mezza idea e vorrei che lo
script possa essere compatibile con altri browser.
Grazie ancora per la pazienza


 Grazie ancora per la pazienza
De nada, figurati. L'importante è che si arrivi a una soluzione.
-- 
~ "Un uomo è più 'grande' di un altro solo se sale sulle sue spalle."
(Bertold Brecht)

Scusami, forse approfitto troppo della tua esperienza.
Puoi vedere, se ti invio il file, (compreso l'XML) dove é l'errore?

 Puoi vedere, se ti invio il file, (compreso l'XML) dove é l'errore?
Prima, vorrei almeno sapere se hai provato le varie opzioni che ti ho
dato, e quali sono i rispettivi risultati.
Se c'è un errore, interrogando il parseError dovresti sapere qual'è.
-- 
~ "Accadono cose che sono come domande.
Passa un minuto, oppure anni e poi la vita risponde." (A. Baricco)


Scusami, ma non so proprio come si fa ad interrogare il parseError


Ovvero (riprendendo il pezzo del tuo codice originario):
	xml.async = false;
        xml.load(dname);
	if ( xml.parseError != 0 ){
		alert( xml.parseError.reason );
	}
	alert( xml.xml );
Rileggiti il thread dall'inizio, evidentemente ti sono sfuggite delle
cose.
Prova i suggerimenti che ti ho dato, e scrivi per ognuno qual'è stato
il risultato ottenuto. Se non mi fornisci questi feedback è difficile
poterti aiutare.
-- 
~ "Affronta gli ostacoli e fa qualcosa per superarli.
Scoprirai che non hanno neanche la metà della forza che pensavi
avessero." (Norman Vincent Peale)


Ormai lo faccio domani, poi ti faccio sapere

 wrote:

(Ho il figlio con la febbre)!

 >         alert( xml.xml );
Ho provato con il codice xml.parseError, ma IE mi dice "Carattere non
valido nel contenuto del testo"

 valido nel contenuto del testo"
Ecco, hai risolto la magagna. Il file XML su IE non viene caricato
perché c'è un carattere non valido nel testo e quindi il parser si
blocca. Per capire dov'è e qual'è questo carattere, un modo rapido
è caricare il file XML direttamente su IE. Ovvero, apri il browser
e scrivi nella barra di indirizzi il percorso del file:
	file:///c:/myapp/file.xml
IE proverà a fare il parsing, andrà in errore, e ti mostrerà dov'è
il problema.
-- 
~ Non ci sono certezze, solo ragionevoli probabilità.
(W. Howe)


Sei grande!!!!
Ho messo nell'istruzione alert (ho provato a naso, caso, fai un po tu)
l'istruzione  xml.parseError.line e mi diceva la linea del carattere
non riconosciuto.
Fatte le modifiche (ce ne erano circa una decina) ha funzionato!!!!
INCREDIBBLE!!!!!
Ora devo fare un'altra cosa.
Ho inserito un pulsante nella googlemap per cancellare delle
informazioni, ma non funziona a dovere.
Posso riromperti eventualmente??
Sergio

 wrote:

Sei grande!!!!


 wrote:

Sei grande!!!!


 Posso riromperti eventualmente??
Questo è un NG pubblico, non si tratta di "rompere" a me; tu poni le
tue domande e dubbi a tutti noi, e tra i partecipanti sicuramente ci
sarà chi potrà aiutarti. Non solo io. :)
-- 
~ "Viviamo dei vuoti lasciati da qualcun'altro."