Newsgroup: it.comp.lang.javascript
Titolo: Lettura di un valore da un XML..

Ciao a tutti i frequentatori di it.comp.lang.javascript!
Sicuramente scrivo una banalità, ma la mia poca esperienza non mi fa capire
cosa utilizzare in maniera corretta.
Leggendo varia documentazione su google, sono riuscito a fare uno straccio
di script che devo usare in una applicazione che funziona solo su IE, che mi
legge un file XML e volendo me lo sbatte a video con l'alert che ho
commentato:
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--
function visualizzaxml() {
  var xmldoc=new ActiveXObject("MSXML2.DOMDocument.3.0");
  xmldoc.async = false;
  xmldoc.load("
http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml
");
  if (xmldoc.parseError.errorCode != 0) {
   var myErr = xmldoc.parseError;
   alert("Errore: " + myErr.reason);
} else {
  // alert(xmldoc.documentElement.xml);
}
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<A HREF="javascript:visualizzaxml()">Visualizzalo!</A>
</BODY>
</HTML>
Ora al posto dell'alert, vorrei fare che se "Cube time" (uno dei tag
dell'xml che carico) è uguale ad una certa data che io gli vorrei passare
attraverso una var E "Cube currency" (un altro dei tag dell'xml che carico)
è uguale ad una certa valuta, vorrei "tirare fuori" il relativo rate.
E' fattibile o fantascienza?
--
E.mail: drpopper (at) 
despammed.com
 - Remove .invalid to contact me
Registered Linux User Number 350547 - 
http://snurl.com/DrPopperSMS
Google è tuo amico, GoogleGroups ancor di più.
Impara a pescare invece di pretendere il pesce servito tra le mani.

 DP> E' fattibile o fantascienza?
Aggiungo, visto che sono ancora a sbatterci la testa.. Visto che il file XML
di storico è "gigantesco"
http://www.ecb.int/stats/eurofxref/eurofxref-hist.xml
 sarebbe utile poter
leggere il file fin tanto che non trova "Cube time" uguale ad una certa data
che io gli passo E "Cube currency" uguale ad una certa valuta che gli passo
sempre io (penso di passare questi valori leggendoli da una FORM e
associarli ad una variabile, cmq per adesso li associerei fissi ad una VAR),
e vorrei "tirare fuori" il relativo rate.
Anche qui fantascienza??


 Anche qui fantascienza??
In Javascript, si. Devi lavorare server side in tal caso, e gestire il file
XML come un normale file di testo, altrimenti per usare le DOM API devi
parserizzarlo tutto.
-- 
ZER0
~ The Tangent Universe collapsed 5969 days, 6 hours, 54 minutes and 33 seconds ago.
on air ~ "Gianluca Grignani - Che ne sarà di noi"

 E' fattibile o fantascienza?
Fattibile e' fattibile, bisogna solo che tu chiarisca un'attimo cos'e'
"Cube time", "Cube currency" ed il rate. Se scrivi uno stralcio di codice
XML, meglio (ovviamente non tutto il file: solo la dichiarazione di tali
tag).
-- 
ZER0
~ The Tangent Universe collapsed 5969 days, 6 hours, 52 minutes and 30 seconds ago.


Ciao ZER0,
hai scritto il 04/03 alle ore 13:34:
 Z> Fattibile e' fattibile, bisogna solo che tu chiarisca un'attimo cos'e'
 Z> "Cube time", "Cube currency" ed il rate. Se scrivi uno stralcio di
 Z> codice XML, meglio (ovviamente non tutto il file: solo la dichiarazione
di
 Z> tali tag).
Quei 2 valori, sono 2 meta tag dell'xml rilasciato dal fondo monetario
europeo.
Se vuoi vederlo č questo:
http://www.ecb.int/stats/eurofxref/eurofxref-hist.xml
Io da questo dovrei "loopare" fin tanto che non trovo la data che a me
interessa e poi la valuta. Di questo AND tirare vuori il valore rate
relativo alla stessa..
Se vedi nell'xml ho:
<Cube time="2005-03-03">
  <Cube currency="USD" rate="1.3144" />
.....
Quindi dovrei cercare prima per la data Cube time "2005-03-03" e poi per la
Cube currency "USD"... Trovate queste, tirar fuori 1.3144 che č il relativo
rate..
Pensavo, ma forse sbaglio, che con qualche metodo potevo tirare fuori il
valore di "rate"..
--
E.mail: drpopper (at) 
despammed.com
 - Remove .invalid to contact me
Registered Linux User Number 350547 - 
http://snurl.com/DrPopperSMS
Google č tuo amico, GoogleGroups ancor di piů.


rate..
Cosi' come'e' scritto il tag e' <Cube>, time e currency sono
attributi. Devi cercare tutti i Cube, selezioni solo quelli con il
time voluto, poi ricerchi tra i children quello con currency
desiderato.
Non mi sembra un XML dei migliori :-)
'bye

Ciao Agostino,
hai scritto il 04/03 alle ore 14:40:
 ADM> Cosi' come'e' scritto il tag e' <Cube>, time e currency sono
 ADM> attributi. Devi cercare tutti i Cube, selezioni solo quelli con il
 ADM> time voluto, poi ricerchi tra i children quello con currency
 ADM> desiderato.
Ehm.. Seminewbie come sono, mi stai parlando arabo.. ;) Un po' piů per il
popolo ? :D
 ADM> Non mi sembra un XML dei migliori :-)
Purtroppo non l'ho fatto io, ed č l'unico che rilascia l'ECB per poter avere
le quotazioni anche indietro nel tempo.


Google con quanto mi hai scritto, mi ha fatto trovare questo:
http://www.sitepoint.com/article/server-side-xml-javascript
Puň essere una strada percorribile??


 valore di "rate"..
Qui c'e' il codice che ti ho postato prima per caricare il documento XML in
modo crossbrowser, con la relativa funzione per recuperare il "rate":
	var nsresolver=function(p){
		if (p=="gesmes")
			return "
http://www.gesmes.org/xml/2002-08-01
";
		return "
http://www.ecb.int/vocabulary/2002-08-01/eurofxref
"
	}
 
	function getRate(xmldoc,sTime,sCurrency){
		var
xpath="//dmyNS:Cube[@time='"+sTime+"']/dmyNS:Cube[@currency='"+sCurrency+"']",
			nd=null;
		if (typeof xmldoc.selectSingleNode!="undefined"){
			nd=xmldoc.selectSingleNode(xpath.replace(/\/dmyNS:/g,"/"));
		}else if (window.XPathEvaluator){
			var pXPE = new XPathEvaluator(),
				nd=pXPE.evaluate(xpath, xmldoc, nsresolver,
XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
		}
 
		return nd!=null?nd.getAttribute("rate"):"";
	}
 
	function getXmlDocument(sFile){
		var doc=null;
		if (document.implementation && document.implementation.createDocument) {
			doc=document.implementation.createDocument("", "", null);
		}else if (window.ActiveXObject){
			doc=new ActiveXObject("Microsoft.XMLDOM");
		}
 
		if (doc!=null && typeof sFile!="undefined"){
			doc.async=false;
			doc.load(sFile);
		}
		return doc;
	}
L'unico problema e' che sia su IE che su Gecko, non puoi caricare documenti
esterni al tuo sito web (Same Origin Policy).
Quindi se devi fare quest'operazione per un sito web, rinuncia subito; ed
utilizza una tecnologia server side (ASP, PHP, JSP, CGI in generis).
Se invece e' per una tua web application, o e' un sito che fai girare in
locale (e quindi basta regolare la sicurezza del tuo browser) non ci son
problemi.
Il codice per recuperare il rate, che poi andrai a scrivere sara' qualcosa
tipo:
	var xmldoc=getXmlDocument("dati.xml");
	if (xmldoc!=null)
		alert(getRate(xmldoc,"2003-03-03","USD"))
-- 
ZER0
~ The Tangent Universe collapsed 5969 days, 9 hours, 43 minutes and 57 seconds ago.
on air ~ "Maki Kimura - Beyond The Bounds"

popolo ? :D
Qualcosa del genere se non vuoi usare XPath come nel messaggio di
Zero:
function mgetAttribute(node, name){
// serve perche' IE funziona male :-)
 var i;
 for(i=0;i<node.attributes.length;i++){
	if(node.attributes[i].name==name){
		return node.attributes[i].value;
	}
 }
 return null;
}
var xmldoc=getXmlDocument("tuodocumento.xml"); // usi la funzione di
// Zero per caricare il documento
 var Cubes=xmldoc.getElementsByTagName("Cube"); //tag Cube
 var i;
 alert("tag Cube trovati: "+Cubes.length);
 var Cube;
 var found=false;
 var mtime=null;
 for(i=0;i<Cubes.length;i++){
	Cube=Cubes[i];
	mtime=mgetAttribute(Cube, "time"); // leggi time
//	se IE funzionasse come Mozilla useresti hasAttribute
//	e poi getAttribute
	if(mtime!=null){ // se presente
		if(mtime.indexOf("2005-03-03")>-1){
			// ed e' la tua data l'hai trovato
			found=true;
			i=Cubes.length;
		}
	} 
 }
 if(found){
	found=false;
	var cnode;
	var rate="";
	var currency=null;
	alert("Cube per data trovato, nr. children:
"+Cube.childNodes.length);
	for(i=0;i<Cube.childNodes.length;i++){ 
// 		tutti i figli del trovato
		cnode=Cube.childNodes[i];
		if(cnode.nodeName=="Cube"){
// 			se sono "Cube"
			currency=mgetAttribute(cnode,"currency");
//			leggi currency
			if(currency!=null){
//			se trovata
				if(currency.indexOf("USD")>-1){
//				ed e' USD
					found=true;
					i=Cube.childNodes.length;
				}			
			}
		}
	}
	if(found){
//		trovato per data e currency
		rate=mgetAttribute(cnode,"rate");
//		leggi il rate
		if(rate==null){
			rate="non trovato";
		}
		alert("Trovato USD, rate: "+rate);
	} else {
		alert('USD non trovato');
	}
 } else {
	alert("data non trovata");
 }
'bye

Ciao ZER0, e Agostino...
Vi ringrazio per il vostro aiuto.. Sono riuscito a far qualcosa di decente
anche grazie a voi.. Spero a buon rendere..
--
E.mail: drpopper (at) 
despammed.com
 - Remove .invalid to contact me
Registered Linux User Number 350547 - 
http://snurl.com/DrPopperSMS
Google è tuo amico, GoogleGroups ancor di più.
