Newsgroup: it.comp.lang.javascript
Titolo: [OT] - lettura dati XML

molto molto OT direi...
allora, ho una stringa XML tipo
msg="<xml>" +
   "<funz>" +
  "F1" +
  "<P1>a</P1>"+
  "<P2>b</P2>"+
 "</funz>" +
 "</xml>"
 xmldoc.loadXML(msg)
poi ciclo tra gli elementi
  for(var i=0;i < root.childNodes.length; i++){
   n = root.childNodes.item(i);
   //n.text = t;
   alert("name: " + n.nodeName + "\ntext: " + n.text +
    "\nxml: " + n.xml + "\nvalue: " + n.nodeValue + "\ntype: " +
n.nodeType);
  }
quando visualizzo il text di <funz> mi viene stampato tutto il testo di
tutti i suoi sottonodi e  cioč "F1ab"
come faccio ad ottenere solamente F1 per il nodo <funz> ?
grazie

 come faccio ad ottenere solamente F1 per il nodo <funz> ?
n.childNodes[0].nodeValue
Ricorda che in un Node, il testo all'interno del tag e' un "text node".
-- 
C'ya,
ZER0
  :. job profile - coder.gfxer.webDesigner
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

ok perfetto.
sono un pirla.... :-))) non avevo afferrato un concetto...
detto questo, io devo chiamare una pagina asp passandogli la stringa, e fin
quì ok.
dalla stringa (xml) devo estrarre i parametri che sono poi i parametri con
cui chiamerò una funzione all'interno della pagina.
un metodo consiste nel fare un ciclo tra i parametri e metterci un bel select
case (o switch) per assegnare i valori che mi servono ad una variabile.
esiste invece un metodo per dire
msg="<xml>" +
   "<funz>" +
  "F1" +
  "<P1>a</P1>"+
  "<P2>b</P2>"+
 "</funz>" +
 "</xml>"
funzione_da_chiamare = ottieni("funz")
variabile_p1=ottieni ("P1")
...
si può?


che intendi con questa frase?

 si può?
Ho afferrato cio' che vuoi fare, ma non esattamente l'ultimo passaggio. 
In ogni caso se il tuo scopo e' quello di eseguire una funzione passata 
come "testo" di un file xml non ci sono problemi. Puoi sempre fare un 
EVAL, costruendoti la chiamata alla funzione.


 che intendi con questa frase?
Mhm, pensavo tu avessi capito nel post precedente :)
In un file XML i node possono essere di diversi tipi (guarda la 
reference - visto che so che ce l'hai - di MSXML alla proprieta' 
"nodeType"). Un nodo del tipo:
<mynode myattr="a value">this is a text</mynode>
Anche potrebbe non sembrare, ha un nodo figlio; che e' appunto "this is 
a text", un nodo di tipo testo.


 --
non ho capito io che intendi... :-)))
cmq, io creo dinamicamente lato client la stringa xml, indicando quale
funzione della pagina asp devo eseguire
ed passando i parametri da passare alla funzione.
quello che mi serve č ottenere il valore contenuto nei vari parametri della
stringa xml ed assegnarli a variabili che passerň come parametri alla
funzione.
per ottenere questo posso ciclare tra i nodi dell'xml e fare uno switch, ma
vorrei evitarlo e sapere se posso ottenere il valore chiamando una funzione
e passandogli il nome del nodo dal quale ottenere il valore stesso


finalmente!
son riuscito a far luce tra i miei pensieri e a togliere i vari errori che
facevo!
questo discorso č ora chiaro (illuminante il fatto che il testo di un nodo č a
sua volta un nodo!!)
se mi spieghi il discorso che hai fatto con EVAL, sono a posto.
intanto grazie


 root=xmldoc.documentElement;
 var m=root.selectNodes("funz")
  var n=m.nextNode();
   alert("name: " + n.nodeName + "\ntext: " + n.text +
    "\nxml: " + n.xml + "\nvalue: " + n.nodeValue + "\ntype: " +
n.nodeType);
cosě mi funziona perfettamente, mentre  se faccio
 var m=root.selectNodes("x")
mi da errore l'alert. non riesco a capire il perchč............

 intanto grazie
Che puoi costruirti una stringa col nome della funzione da eseguire:
eval("myfun('a','b','c',12)");


, 
cre...@tiscalinet.it
 
says...

Scusa, ma "x" starebbe per? Non lo vedo come nodo.
Inoltre, perche' devi scomodare l'xpath con il selectNodes? funz e' il 
primo nodo dopo la root, quindi non hai bisogno di far cose strane. Al 
massimo, usa getElementsByTagName().
In ogni caso, io cambierei tipo di struttura dell'XML in almeno qualcosa 
di simile:
<xml>
	<function name="checkUser">
		<arguments>
			<item name="FirstName" type="string">Ray</item>
			<item name="LastName" type="string">Kinsella</item>
			<item name="Age" type="number">30</item>
			<item name="DateOfBirth" type="date">10/12/1960
</item>
		</arguments>
		<return>
			<item name="isRegisterUser" />
			<item name="level" />
		</return>
	</function>
</xml>
In questo modo e' abbastanza generalizzata, e puo' adattarsi a piu' 
casi.
Ovviamente in questo caso "checkUser" deve essere una funzione 
realizzata ad Hoc per la gestione di input/output di dati XML (visto che 
ritorna piu' di un valore). Se invece vuoi costruire qualcosa in grado 
di "supportare" anche funzioni "old style", basta aggiungere un 
attributo nel tag function del tipo:
<function name="checkUser" xmlcompliant="no">
e fare un wrapper che gestisca la cosa:
var XMLreturnValueForClient=execFunction(xmlNode);
Adesso tocca a te. :)


mi mancano troppe informazioni ....
devo gestire la cosa tramite xmlhttp... ma gli esempi di msdn fan schifo... ho
preso un libro ma non li tratta..
poi ti ci metti pure tu a fare cose che manco immagino :-)...
devo scaricare qualcosa di utile.......