Newsgroup: it.comp.lang.javascript
Titolo: caricare una risposa XMLHTTP

ciao a tutti sto cercando di stampare a video un singolo nodo di una
risposta xmlhttp
ma va in errore:
function getXMLHttp() {
var xmlhttp = null;
if (window.ActiveXObject) {
  if (navigator.userAgent.toLowerCase().indexOf("msie 5") != -1) {
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
}
if (!xmlhttp && typeof(XMLHttpRequest) != 'undefined') {
  xmlhttp = new XMLHttpRequest()
}
return xmlhttp
}
objHTTP = getXMLHttp();
objHTTP.open("post", "
http://demo.xxx.com/XML
", true);
objHTTP.onreadystatechange = function() {elaboraRisposta()}
objHTTP.send(miei_dati)
function elaboraRisposta() {
if (objHTTP.readyState == 4) {
  objHTTP.loadXml(objHTTP.responseText);
  var test = (objHTTP.childNodes('RoutingId').firstChild.text);
  document.write(test);
 
 
}
}
</script>
sto impazzendo...

   objHTTP.loadXml(objHTTP.responseText);
Non hai bisogno di questo. Se la risposta è un XML valido, allora hai la
proprietà responseXML che ti fornisce l'oggetto in questione:
/* ti restituisce il tagname dell'elemento root del document */
alert( objHTTP.responseXML.documentElement.tagName );
Anche il codice che hai scritto dopo non è del tutto corretto, proprio a
livello di logica. In primis objHTTP è un oggetto XmlHttpRequest, quindi non
ha "childNodes". Ti conviene leggerti un attimo la reference delle API XML in
merito, in modo da evitare errori come questi.
-- 
- Voi chi dovreste essere? Una specie di cosmonauti?
- No disinfestatori, hanno visto uno scarafaggio al 12°
- Deve essere grosso questo scarafaggio
- Enorme, stacca le teste a morsi!

perdonami ma devo capire....
ho fatto così...
function getXmlHttpRequest(){
        if ( window.XMLHttpRequest ){
                return new XMLHttpRequest();
        }else if (window.ActiveXObject) {
                /*@cc_on
                        @if (@_win32)
                                return new
ActiveXObject("Microsoft.XMLHTTP");
                        @end
                @*/
                return null;
        }else{
                return null;
        }
}
objHTTP = getXmlHttpRequest();
objHTTP.open("post", "
http://demo.mio_sito.com/XML
", true);
objHTTP.send(searchRequestHead + searchRequestTail)
document.write ( objHTTP.responseText );
errore riportato da firefox = Errore: uncaught exception: Permesso
negato al metodo di chiamata XMLHttpRequest.open

 negato al metodo di chiamata XMLHttpRequest.open
L'unica che mi viene in mente è una violazione della Same Origin Policy,
quella che ti vincola ad effettuare richieste solo verso pagine
appartenenti allo stesso dominio cui appartiene la pagina che fa la
richiesta.
http://demo.mio_sito.com/
 non è l'url del sito dove risiede la pagina dalla
quale fai partire la richiesta, no?
-- 
Nando [?]
Apostolo della Prova

si hai ragione era link errato ma ho dovuto rimodificare inq uesto modo
per avere un funzionamento corretto con IE:
function getXMLHttp() {
var xmlhttp = null;
if (window.ActiveXObject) {
  if (navigator.userAgent.toLowerCase().indexOf("msie 5") != -1) {
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
}
if (!xmlhttp && typeof(XMLHttpRequest) != 'undefined') {
  xmlhttp = new XMLHttpRequest()
}
return xmlhttp
}
objHTTP = getXMLHttp();
objHTTP.open("post", "
http://demo.miosito.com/XML
", true);
objHTTP.onreadystatechange = function() {elaboraRisposta()}
objHTTP.send(searchRequestHead + searchRequestTail)
function elaboraRisposta() {
if (objHTTP.readyState == 4) {
alert( objHTTP.responseXml.documentElement.RoutingId );
}
}
adesso però l'alert mi compare ( con IE, Con Mozilla va in errore)  ma
mi risponde "undefined"
ho controllato.. sembra che il server xml sia off al momento.

 ho controllato.. sembra che il server xml sia off al momento.
Ecco, appunto. Innanzitutto, non puoi limitarti a controllare il valore di
readyState: il fatto che assuma valore 4 vuol dire che il ciclo
richietsa/risposta è completato ma NON ti dice niente riguardo al fatto che
sia stato completato con successo o meno; per questo c'è la proprietà
status: se status==200, allora il server ha risposto correttamente,
altrimenti vuol dire che c'è stato qualche errore nella comunicazione.
Poi, hai frainteso quello che ti ha scritto ZER0: con
objHTTP.responseXml.documentElement.tagName
che va scritto proprio così, ottieni il nome dell'elemento radice del tuo
documento xml: non puoi mica sostituire il nome del tag a tagName, che è
una proprietà di documentElement!
Mi spiego. Mettiamo che il tuo xml sia:
<routingId>
  <pippo>ehila</pippo>
  <pluto>bubu</pluto>
</routingId>
l'istruzione alert(objHTTP.responseXML.documentElement.tagName) ti fa
comparire l'alert con dentro scritto "routingId"; se vuoi accedere
all'elemento routingId, basta objHTTP.responseXML.documentElement.
Se vuoi accedere ai nodi figli di routingId, usi childNodes, che è una
collezione, quindi:
objHTTP.responseXML.documentElement.childNodes[0] è l'elemento pippo
objHTTP.responseXML.documentElement.childNodes[1] è l'elemento pluto
A pippo puoi accedere anche così, se vuoi, in quanto è il primo figlio di
routingId:
objHTTP.responseXML.documentElement.firstChild
e a pluto, che è l'ultimo figlio:
objHTTP.responseXML.documentElement.lastChild
Poi:
objHTTP.responseXML.documentElement.firstChild.firstChild.nodeValue
è il valore del primo nodo figlio di pippo: essendo un nodo di testo, il
valore non è altro che il testo contenuto, quindi "ehila".
Infine, javascript è case-sensitive: responseXml è *diverso* da
responseXML.
Quindi, riassumendo tutto, immaginando che tu voglia mostrare un alert con
dentro il testo contenuto nel primo elemento del tuo documento xml
(l'elemento pippo, per intenderci), supponendo chiaramente che tale
elemento contenga SOLO del testo, abbiamo:
function elaboraRisposta() {
 if (objHTTP.readyState == 4) {
  if (objHTTP.status == 200) {
   alert(
objHTTP.responseXML.documentElement.firstChild.firstChild.nodeValue );
  }
  else {
   alert("Problemi con il server");


il server è down e non posso testare..
grazie comunque della spiegazione... ora mi inizia ad essere chiaro.

ok...
objHTTP = getXMLHttp();
objHTTP.open("post", "
http://demo.mio_sito.com/XML
", true);
objHTTP.onreadystatechange = function() {elaboraRisposta()}
objHTTP.send(searchRequestHead + searchRequestTail)
function elaboraRisposta() {
if (objHTTP.readyState == 4) {
	(objHTTP.responseXml.documentElement.tagName);
  alert(objHTTP.responseXML.documentElement.childNodes[0])
l'alert in questo caso mi appare come [object]
se invece richiedo la root  con :
alert(objHTTP.responseXml.documentElement.tagName)
mia visualizza il nome del tag corretto  "commandlist"

aggiungo...
che ho provato anche così...
objHTTP = getXMLHttp();
objHTTP.open("post", "
http://demo.travelfusion.com/XML
", true);
objHTTP.onreadystatechange = function() {elaboraRisposta()}
objHTTP.send(searchRequestHead + searchRequestTail)
function elaboraRisposta() {
if (objHTTP.readyState == 4) {
	(objHTTP.responseXml.documentElement.tagName)
  alert(objHTTP.responseXml.documentElement.childNodes[1]);
 l'aler si presenta come null
la struttura della risposta è di questo tipo:
<commandlist> // root
     <StartRouting millis="77"> // [0]
	<LoginId>AOOINO1T48H6P4WZ</LoginId> //[1]
sbaglio ad interpretare la struttura ?

 sbaglio ad interpretare la struttura ?
Sì. Dato un elemento del documento XML, la sua proprietà childNodes è la
collezione dei *figli* di quell'elemento, cioè degli elementi che sono
direttamente inseriti nel primo... nel tuo esempio di sopra, StartRouting è
figlio di commandlist ma LoginId *non è* figlio di commandlist, bensì è
figlio di StartRouting. Un esempio:
<root>
  <child0>
    <grandchild0 />
    <grandchild1>
      <greatgrandchild0 />
      <greatgrandchild1 />
    </grandchild1>
  </child0>
</root>
In questo esempio, posto
root=objHTTP.responseXML.documentElement
abbiamo che:
- root.childNodes è costituito da un unico elemento, che si riferisce al
tag child0
- root.childNodes[0].childNodes è costituito da 2 elementi, riferiti ai tag
grandchild0 e grandchild1
- posto grandchild1=root.childNodes[0].childNodes[1], abbiamo che
grandchild1.childNodes è costituito da due elementi, riferiti ai tag
greatgrandchild0 e greatgrandchild1
Spero di essere stato chiaro :)
Ti ricordo l'esistenza del metodo getElementsByTagName, che può essere
applicato a un elemento: tale metodo restituisce tutti i tag innestati che
hanno il nome specificato; con "tutti i tag innestati" intendo quelli
inseriti nell'elemento *a qualunque livello*, quindi figli, nipoti,
pronipoti etc... quindi, dato ad esempio l'albero xml:
<document>
 <head>
  <title>Prova</title>
 </head>
 <body>
  <h1>Prova</h1>
  <h2>Uno</h2>
  <p>bla bla</p>
  <p>bla bla</p>
  <div>
   <h2>due</h2>
   <p>bla bla</p>
   <div>
    <p>bla bla</p>
   </div>
  </div>
 </body>
</document>
e posto root=objHTTP.responseXML.documentElement, abbiamo che:
pElements=root.getElementsByTagName("p")
è un array contenente i riferimenti a *tutti* i tag "p" presenti nel
documento, a qualunque livello di profondità, e quindi, nel nostro esempio,
un array di 4 elementi.


:) be... sono un tipo "duro" di testa.... ma poi ,se capito, vado
tranquillo...
<root>
  <child0>
    <grandchild0 />
    <grandchild1>
      <greatgrandchild0 />
      <greatgrandchild1 />
    </grandchild1>
  </child0>
</root>
Ho provato.. ma sbaglio ancora qualcosa...
alert(objHTTP.responseXml.documentElement.tagName) = questo stampa
"root"
  alert(objHTTP.responseXml.getElementsByTagName("grandchild0")); =
stampa [object]
ad ognimodo perdonami ma voglio capire bene:
you wrote:
rootobjHTTP.responseXML.documentElement
' rootobjHTTP
è il nome che dell'oggetto o un nome/variabile che tu assegni alla
root ??
esempio nel mio cao dovrebbe essere:
objHTTP.responseXML.documentElement
or
rootobjHTTP.responseXML.documentElement
andiamo avanti...
you wrote:
- root.childNodes è costituito da un unico elemento, che si riferisce
al
tag child0
bene, quindi  nel mio caso :
alert(objHTTP.responseXml.root.childNodes)
oppure mi viene in mente questa possibilità:
//creo uan variabile con la root principale
var root = (objHTTP.responseXml.documentElement.tagName);
//stampo il nodo i funzione della root
 alert(objHTTP.responseXml.documentElement.root.childNodes[0]) );
p.s. perdonami per il disturbo...

 p.s. perdonami per il disturbo...
Figurati... però credo che tu debba capire i fondamenti non solo di
javascript, ma della programmazione in generale e della programmazione ad
oggetti in particolare. Prima di provare ad utilizzare XmlHttpRequest,
impara i fondamenti (ma proprio i fondamenti) di javascript, altrimenti non
capirai mai niente.


sei gentile... ma sono più confuso di prima...
Faccio una domanda diretta spero di avere una risposta diretta:
Ho questa struttura e devo leggere il tag RoutingId
come faccio ?
<CommandList>
	<CheckRouting>
		<XmlLoginId>1D1GK4FEF8M9RZQ9</XmlLoginId>
		<LoginId>1D1GK4FEF8M9RZQ9</LoginId>
		<RoutingId>NPAPI62BXIY6L8DO</RoutingId>
	</CheckRouting>
</CommandList>
Ciao...

 </CommandList>
Se nel documento esiste un solo tag che si chiama "RoutingId" (com'è
nell'esempio) allora basta fare:
var root = objHTTP.responseXML.documentElement;
var routingIdElement = root.getElementsByTagName("RoutingId")[0];
per referenziare il tag; se poi vuoi leggere il testo contenuto nel tag
(ipotizzando che vi sia solo testo nel tag) allora:
var root = objHTTP.responseXML.documentElement;
var routingIdElement = root.getElementsByTagName("RoutingId")[0];
var text=routingIdElement.firstChild.nodeValue;
Per intenderci, dopo queste 3 istruzioni in text ci sarà
"NPAPI62BXIY6L8DO".
PS: ovviamente le 3 istruzioni di sopra si possono condensare in una sola,
che però è meno leggibile:
var text =
objHTTP.responseXML.documentElement.getElementsByTagName("RoutingId")[0].firstChild.nodeValue;
PPS: per accedere ai contenuti dei tag XmlLoginId e LoginId, ovviamente, si
fa la stessa identica cosa (nelle medesime ipotesi), laddove basta
sostituire il corretto nome del tag nell'istruzione getElementsByTagName
("XmlLoginId" oppure "LoginId" al posto di "RoutingId").
Ciao.


 greatgrandchild0 e greatgrandchild1
C'è un piccolo errore... affinché tutto quanto scritto sia vero e
funzionante in tutti i browser, occorrerebbe che il documento XML fosse
scritto senza lasciare spazi o altri caratteri di tabulazione (come i
line-feed) tra i diversi tag, cioè:
<root><child0><grandchild0 /><grandchild1><greatgrandchild0 /><greatgra...
e così via.


ok...
come stampo a video un alert ad esempio:
var root  objHTTP.responseXML.documentElement;
var routingIdElement  root.getElementsByTagName("RoutingId")[0];
var textroutingIdElement.firstChild.nodeValue;
alert (textroutingIdElement.firstChild.nodeValue)
?????

magari potevi scrivere meglio...
ho passato notti insonni :=)
var root = objHTTP.responseXML.documentElement;
var routingIdElement = root.getElementsByTagName("RoutingId")[0];
var testrout = routingIdElement.firstChild.nodeValue;
alert(testrout)

 ho passato notti insonni :=)
La veglia tempra.
Per il resto... è passato troppo tempo, ho dimenticato di cosa si parlava
:)
Hai risolto, comunque?


parzialmente si...

 parzialmente si...
Beh, se hai altre difficoltà... esprimiti pure :)


bhe mi piacerebbe capire una cosa... tra le tante :)
'carico i dati
var root = objHTTP.responseXML.;
alert (root)
mettiamo che volessi impaginare i dati anzichè con javascript con asp
in questo momento (alert (root)) i dati (xml) sono memorizzati nella
variabile (root)
è possibile farli impaginare ad asp o è necessario usare sempre js?
Ciao.

 è possibile farli impaginare ad asp o è necessario usare sempre js?
Ehm... temo che tu stia facendo un po' di confusione... ASP è una
tecnologia usata lato server, noi stavamo parlando del client (ovvero, del
browser): si tratta di due cose distinte e separate. Se utilizzi uno script
javascript lato client per prelevare, tramite XmlHttpRequest, il contenuto
di un file XML, i dati ottenuti puoi utilizzarli solo sul client, il server
non può operare su essi. In generale, una volta che il server ha inviato la
pagina al client, ha finito il suo compito e sulla pagina stessa non può
fare più niente; le variabili definite nel codice javascript sul client
*sono sul client e non possono essere viste dal server*.
Per fare ciò che vuoi, la richiesta XmlHttp deve essere fatta *lato
server*: si può fare con metodi del tutto analoghi a quelli che si usano
lato client.


facciamo finta che non ho detto nulla...
io ho un problema....
devo ottenere dal server xml dei dati che mi permettono di finalizzare
uan richiesta
ad esempio:
prima mi devo loggare:
'///////////////////////////////////////////////
var theUserName = "xxxxx";
	var thePassword = "yyyyyyy";
				var login_ok =  "<CommandList>"+
											"\n	<Login>"+
											"\n		<Username>"+theUserName+"</Username>"+
											"\n		<Password>"+thePassword+"</Password>"+
											"\n	</Login>"+
											"\n</CommandList>";
 function send_ok() {
var xmlhttp = null;
if (window.ActiveXObject) {
  if (navigator.userAgent.toLowerCase().indexOf("msie 5") != -1) {
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
}
if (!xmlhttp && typeof(XMLHttpRequest) != 'undefined') {
  xmlhttp = new XMLHttpRequest()
}
return xmlhttp
}
objHTTP = send_ok();
objHTTP.open("post", "
http://demo.miosito.com/XML
", true);
objHTTP.onreadystatechange = function() {elaboraRisposta()}
objHTTP.send(login_ok)
function elaboraRisposta() {
if (objHTTP.readyState == 4) {
var root = objHTTP.responseXML.documentElement;
var loginIdElement = root.getElementsByTagName("LoginId")[0];
var LoginId = loginIdElement.firstChild.nodeValue;
alert(LoginId)
}
}
'/////////////////////
e questo funzia...
 ottenuto il login devo fare uan richiesta al server xml con il LoginId
e dei parametri che ho passato in precedenza...
var loginok =
"\n\t\t<XmlLoginId>"+LoginId+"</XmlLoginId>\n\t\t<LoginId>"+LoginId+"</LoginId>";
	var searchRequestHead =
							"<CommandList>"+
							"\n\t<StartRouting>"+loginok+
							"\n\t\t<Mode>plane</Mode>"+
							"\n\t\t<Origin>"+
							"\n\t\t\t<Descriptor>FCO</Descriptor>"+
							"\n\t\t\t<Type>airportcode</Type>"+
							"\n\t\t\t<ResolutionTypeList>"+
							"\n\t\t\t\t<ResolutionType>citycode</ResolutionType>"+
							"\n\t\t\t\t<ResolutionType>airportcode</ResolutionType>"+
							"\n\t\t\t</ResolutionTypeList>"+
							"\n\t\t\t<Radius>180000</Radius>"+
							"\n\t\t</Origin>"+
							"\n\t\t<Destination>"+
							"\n\t\t\t<Descriptor>CDG</Descriptor>"+
							"\n\t\t\t<Type>airportcode</Type>"+
							"\n\t\t\t<Radius>180000</Radius>"+
							"\n\t\t</Destination>"+
							"\n\t\t<OutwardDates>"+
							"\n\t\t\t<DateOfSearch>27/02/2006-10:00</DateOfSearch>"+
							"\n\t\t\t<DepartDateFilter>"+
							"\n\t\t\t\t<DiscardBefore>25/02/2006-10:00</DiscardBefore>"+
							"\n\t\t\t\t<DiscardAfter>29/02/2006-10:00</DiscardAfter>"+
							"\n\t\t\t</DepartDateFilter>"+
							"\n\t\t\t<ArriveDateFilter>"+
							"\n\t\t\t\t<DiscardBefore>25/02/2006-10:00</DiscardBefore>"+
							"\n\t\t\t\t<DiscardAfter>29/02/2006-10:00</DiscardAfter>"+
							"\n\t\t\t</ArriveDateFilter>"+
							"\n\t\t</OutwardDates>"+
							"\n\t\t";
	var searchRequestTail = "<MaxChanges>1</MaxChanges>"+
							"\n\t\t<MaxHops>2</MaxHops>"+
							"\n\t\t<SupplierList>"+
							"\n\t\t\t<Supplier>easyjet</Supplier>"+
							"\n\t\t</SupplierList>"+
							"\n\t\t<RealOperatorFilter>"+
							"\n\t\t\t<Type>select</Type>"+
							"\n\t\t\t<AllowPartial>false</AllowPartial>"+
							"\n\t\t\t<OperatorList>"+
							"\n\t\t\t\t<Operator>FR</Operator>"+
							"\n\t\t\t\t<Operator>U2</Operator>"+
							"\n\t\t\t</OperatorList>"+
							"\n\t\t</RealOperatorFilter>"+
							"\n\t\t<VendingOperatorFilter>"+
							"\n\t\t\t<Type>select</Type>"+
							"\n\t\t\t<AllowPartial>false</AllowPartial>"+
							"\n\t\t\t<OperatorList>"+
							"\n\t\t\t\t<Operator>FR</Operator>"+
							"\n\t\t\t\t<Operator>U2</Operator>"+
							"\n\t\t\t</OperatorList>"+
							"\n\t\t</VendingOperatorFilter>"+
							"\n\t\t<Timeout>40</Timeout>"+
							"\n\t\t<TravelClass>Economy With Restrictions</TravelClass>"+
							"\n\t\t<TravellerList>"+
							"\n\t\t\t<Traveller>"+
							"\n\t\t\t\t<Age>30</Age>"+
							"\n\t\t\t</Traveller>"+
							"\n\t\t</TravellerList>"+
							"\n\t\t<IncrementalResults>true</IncrementalResults>"+
							"\n\t</StartRouting>"+
							"\n</CommandList>";
function getXMLHttp() {
var xmlhttp = null;
if (window.ActiveXObject) {
  if (navigator.userAgent.toLowerCase().indexOf("msie 5") != -1) {
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
}
if (!xmlhttp && typeof(XMLHttpRequest) != 'undefined') {
  xmlhttp = new XMLHttpRequest()
}
return xmlhttp
}
objHTTP = getXMLHttp();
objHTTP.open("post", "
http://demo.tmiosito.com/XML
", true);
objHTTP.onreadystatechange = function() {elaboraRisposta()}
objHTTP.send(searchRequestHead + searchRequestTail)
function elaboraRisposta() {
if (objHTTP.readyState == 4) {
var root = objHTTP.responseXML.documentElement;
var routingIdElement = root.getElementsByTagName("RoutingId")[0];
var testrout = routingIdElement.firstChild.nodeValue;
alert(testrout)
}
}
</script>
// ma qui mi va in errore tutta la procedura....
stranamente non posso interpretare l'errore perchè con Mozilla
risponde:
Errore: uncaught exception: Permesso negato al metodo di chiamata
XMLHttpRequest.open
e qui io entro in crisi...
p.s.
Io lavoro con asp ma stranamente ho provato a fare delle richieste ma
il server risponde che non ha ottenuto i risultati.
a questo punto sono passato a js...
ciao.