Newsgroup: it.comp.lang.javascript
Titolo: lettura XML

sto cercando di leggere questa struttura XML in un javascript:
<output>
    <position/>
    <content>
        <![CDATA[.....]]>
    <content>
</output>
voglio semplicemente accedere al nodo CDATA. Io ho fatto cosě, ma funziona 
con IE e non con Firefox:
        var contentEl = responseXML.getElementsByTagName("content")[0];
        var contentCDATA = contentEl.firstChild.data;
        alert(contentCDATA);
        el.outerHTML = contentCDATA;
forse sto usando qualche cosa di non standard? 


http://csvtosql.sf.net

 ha scritto nel messaggio 
news:dile25$v9s$2...@newsreader.mailgate.org...

eheh si. lo avrai visto da responseXML.
Sto provando a creare dei componenti JSF che abbiano abilita' di tipo ajax.
Al momento sto facendo un commandLink che cliccato può aggiornare un 
componente qualsiasi (c'è un attributo nel tag che si riferisce all'id del 
compoennte da aggiornare). 

 
forse la so!
vedi se applica questo hint che ottenni su questo NG da zer0 (il secondo 
nel thread)
http://snipurl.com/igrq
Se poi ho capito bene puoi fare riferimento a questo
http://developer.mozilla.org/en/docs/Whitespace_in_the_DOM
Se hai installato il tool per l'analisi del DOM su FF scopri presto che 
hai degli elementi di tipo #text che sono in realtà gli a-capo del 
sorgente html.
Se non ci ho preso, bhé, sorry.

 compoennte da aggiornare).
ti do una brutta notizia, responseXML su firefox da sempre null.
io come soluzione ho buttato tutto negli header ma lo usi come una mappa e
non come xml, a me andava bene anche così ...
se qulcuno ha idee ...


 ti do una brutta notizia, responseXML su firefox da sempre null.
:-O non spargiamo frasi false e tendenzione ... responseXML funziona
perfettamente su firefox. 
Forse intendevi dire "Ajax ha qualche problema strano di compatibilità o
altro e assurdamente responseXML non funziona sull'xml restituito"?
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is done
 don't sit down, it's time to dig another one"
									    P.F.

 se qulcuno ha idee ...
perche' dici cio'? L'oggetto c'e', poi non so se ha qualche problema. 

 altro e assurdamente responseXML non funziona sull'xml restituito"?
intendevo dire che assurdamente responseXML su firefox è sempre vuoto. :)
in compenso almeno responseText funziona.



Grazie erano gli a capo!
Ora perň non riesco a ottenere un qualcosa che vada sia su IE che su 
firefox.
"outerHTML" ho scoperto esiste solo su IE.
Quindi come diavolo faccio a sostituire l'elemento html che ha quell' id, 
con il contenuto CDATA del documento XML che vi ho mostrato? 

 in compenso almeno responseText funziona.
Sì, ma ci fai le pippe con responseText...
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 sottintendendo "usando le function fornite con Ajax "?
mmmmmmmmm
mmmm
che versione di firefox usi ?


 che versione di firefox usi ?
Un po' tutte (e non farmi venire un colpo)! 
www.primestore.it
 per favore metti semplicemente un prodotto nel
carrello...
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 "outerHTML" ho scoperto esiste solo su IE.
Qualcosa del genere potrebbe andare bene:
var textNode = document.createTextNode(data);
el.parentNode.replaceChild(textNode, el);
Gaetano

 stai usando ajax ?
No, tecnicamente sta usando XmlHttpRequest.
Se proprio uno vuole usare il termine "ajax", allora "ajax" non si "usa".
AJAX è un acronimo per definire un certo tipo di approccio allo sviluppo di
applicazioni web based, ovvero l'uso congiunto di strumenti quali
Javascript, XHTML, CSS, DOM e XmlHttpRequest.
Acronimo, tra l'altro, che qua non è che si digerisca un granché bene. E'
stato semplicemente dato un nuovo nome all'acqua calda. Una questione
prettamente di marketing, niente di più. E' da anni che si sviluppa in quel
modo.
E quindi, posso capire l'uso di tale termini in ambiti - appunto - di
marketing, nel caso in cui si debba scrivere un curriculum vitae, se si
deve snocciolare features di applicativo ad un cliente, etc; ma in 
un NG "tecnico" rimane un po' sullo stomaco.
Per concludere, autocito un mio vecchio post:
[cite]
L'uso di XmlHttpRequest in Javascript. Ajax sta per "Asynchronous
Javascript and XML", nome tra l'altro "falso" o "fuorviante" (uno dei punti
forti di JS/XmlHttpRequest è che può essere sincrono invece di asincrono).
Ho trovato questo link che te lo spiega meglio di quanto potrei fare io:
http://en.wikipedia.org/wiki/AJAX
Inutile dire che mi trovo perfettamente d'accordo con questo paragrafo:
"It has been pointed out by some people that the AJAX technologies did not
have a common name before, and they therefore welcomed a unifying term for
the process. This, however, is not entirely true, since various developers
have been calling the concept XMLHTTP for *years*. It is also reported that
the Google engineers who have created the most prominent applications using
this technique consider their technologies as *'Javascript'*".
[/cite]
-- 
~ Non ci sono certezze, solo ragionevoli probabilità. (W. Howe)

 ti do una brutta notizia, responseXML su firefox da sempre null.
Forse su una qualche versione beta vetusta e/o buggata.
Direi che dalla 1.0 almeno non ci dovrebbero essere problemi di sorta.
-- 
~ Se il destino è contro di noi, peggio per lui!

 altro e assurdamente responseXML non funziona sull'xml restituito"?
Anche tu, però, hai qualche problema nell'inquadrare "ajax", eh. :)
E' una terminologia. Non è il nome di una libreria o altro. Il termine
"AJAX" ha la stessa natura che aveva il termine "DHTML" un tempo.


 Sì, ma ci fai le pippe con responseText...
Mica vero. Puoi usarlo tranquillamente al posto di responseXML, il
vantaggio sta che in responseXML hai già un XmlDocument; mentre se devi
passare da responseText devi crearti un XmlDocument impostando responseText
come "sorgente".
-- 
~ Non sono disordinato. Sono solo un massimizzatore di entropia.

 "AJAX" ha la stessa natura che aveva il termine "DHTML" un tempo.
Eh, partivo dal presupposto "è vero che responseXML non va", da cui
deducevo (dato che non è vero) che non va usando ajax...poi ok, è solo una
terminologia, ma la gente cerca in rete "ajax" e prende uno di quei bei
pacchettini già fatti...
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 con il contenuto CDATA del documento XML che vi ho mostrato?
usando il metodo replaceChild come ti ha mostrato Gaetano; tranne per
quanto riguarda la creazione dell'elemento, visto che nel tuo caso non si
tratta di un textNode (altrimenti outerHTML non l'avresti potuto usare
nemmeno su IE).
Puoi optare per una cosa del genere:
	if (el.outerHTML){
		el.outerHTML=contentCDATA;
	}else if ( document.createRange ){
		var rng = document.createRange();
 
		if (rng.selectNode && rng.createContextualFragment){
			rng.selectNode(el);
			var df = rng.createContextualFragment(contentCDATA);
			el.parentNode.replaceChild(df, el);
		}
	}
Scritto rapidissimamente perché sono di corsa, spero funzioni. In caso,
fammi sapere.
-- 
~ Se potete leggere questo, la mia donna è caduta.
(Letta sul retro di una maglietta di un motociclista)

 il tuo Firefox non funziona vuol dire che hai grosse crisi :)
"Per fortuna c'è Quelo..." (cit)
-- 
~ You don't have to be crazy to be a webmaster. But it helps.


Ho cambiato un po' tattica. Ora dentro <content> non ci sta piu' CDATA ma 
del xhtml, e pensavo cosě di poter lavorare meglio lato client.
Cosě ora il mio codice e' diventato:
        var el = document.getElementById(id);
        var contentEl = responseXML.getElementsByTagName("content")[0];
        var p = el.parentNode;
        var newNode;
        if(contentEl.childNodes.length  == 0) {
           //se il nodo xml content non ha figli allora scrivi un div vuoto
            newNode = document.createElement("div");
            newNode.setAttribute("id", id);
        } else {
            //se invece ha figli scrivi l' xhtml al posto del nodo el
            newNode = contentEl.firstChild;
        }
        p.replaceChild(newNode, el);
Non si rimpiazza bene. Chiaramente l'xhtml puň avere un solo nodo figlio di 
content (per ora).
Forse replaceChild non funziona con nodi che contengono nodi? 

 Forse replaceChild non funziona con nodi che contengono nodi?
Non è quello. Puoi benissimo sostituire un intero documento con i relativi
nodi figli. E' che non funziona su nodi di natura diversa: Puoi sostituire
un nodo xml con un altro nodo xml, un nodo (x)html con un altro nodo
(x)html, ma non un nodo xml con uno (x)html (o viceversa).
-- 
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth."
on air ~ "Unknown Artist - Everything burns"

 Forse replaceChild non funziona con nodi che contengono nodi?
Non è quello. Puoi benissimo sostituire un intero documento con i relativi



Il tuo codice lo provo ora, visto che torno sui miei passi grazie alla tua 
bacchettata ;).
Comunque comincio a non capire: io pensavo che siccome responseXML e' un 
documento xml e dalla servlet ho risposto con un content-type="text/xml" il 
suo contenuto fosse trattato come xml appunto, cosa gli importa se ci sono 
elementi come <table> presenti dentro, a lui basta che sia un documento xml 
ben formato, o no?
Evidentemente no, ma non capisco!

 il tuo Firefox non funziona vuol dire che hai grosse crisi :)
fico. allora chiedo scusa su sta cosa mi sono sbagliato io. :)



Ora l'ho provato e va in parte.
Il mio documento html di prova ha un div a cui voglio sostituire grazie al 
tuo codice un table contenuto nel CDATA del xml restituito.
Dopo il div c'č anche un <a href="#">dsfds</a> e un <b>sdfsdf</b>
L'opreazione va a buon fine, ma cancella tutto quello che segue il vecchio 
div.

 div.
Guarda, come ti avevo detto il codice č stato scritto di corsa, quindi puň
anche darsi che vi siano errori. Ma l'ho provato adesso su un semplice
codice di prova, e mi funziona:
<script type="text/javascript">
window.onload=function(){
	var el = document.getElementById("placeholder"),
		contentCDATA = "<table border='1'><tr><td>a</td><td>b</td></tr></table>";
 
	if (el.outerHTML){
		el.outerHTML=contentCDATA;
	}else if ( document.createRange ){
		var rng = document.createRange();
 
		if (rng.selectNode && rng.createContextualFragment){
			rng.selectNode(el);
			var df = rng.createContextualFragment(contentCDATA);
 
			el.parentNode.replaceChild(df, el);
		}
	}
 
}
</script>
<div id="placeholder">
	ksafj ldjlasjd sakdjas
	<br />
	ldjas dlaslň kdaňkdňa
</div>
<a href="#">ds lkajsalj</a> <b>dsaj lskaj</b>
Se ho ben capito la tua situazione č tipo questa, ma a dopo la sostituzione
i tag che seguono il div non vengono cancellati. 
Prova anche tu questo codice, e dimmi se hai il risultato corretto oppure
no. Eventualmente, cerca di capire quali differenze vi sono con il tuo
codice di markup.
-- 
~ "L'arte non riproduce cio' che e' visibile,ma rende visibile cio' che
non sempre lo e'" (Paul Klee)

 ben formato, o no?
Certamente, il problema è quando tu pretendi che un oggetto nodo xml che
punta al tuo "<table>" (che è un tuo tag custom xml) venga usato come se
fosse un oggetto nodo HTML di un tag (html) "<table>".
-- 
~ "Nei film americani, qualsiasi problema che venga considerato
sufficientemente catastrofico, puo' essere risolto facendo esplodere uno
o piu' ordigni nucleari" (ZER0 & Cosimo)

 pacchettini già fatti...
Così come un tempo prendeva le librerie per la gestione del DHTML; ma non
si è mai identificato il DHTML in un entità singola, per intenderci. Dire
"Ajax ha qualche problema" non ha senso, ed è fuorviante.
Come ben sai, sono per evitare l'uso di tali termini anche perché se da un
lato aiutano la "divulgazione" (marketing) dall'altro creano unicamente
confusione. Senza dimenticare che sempre della scoperta dell'acqua calda si
tratta.
E per far capire, almeno a chi si sta avvicinando a javascript adesso
grazie alla parolina "ajax", quanto questa sia una barzelletta, bisogna
evitare di confondergli anche più le idee. E rafforzare il concetto che
"ajax" sia un'entità ben definita non è la mossa corretta. :)
Come ho detto, se vogliono inventarsi nomi fighi perché fa cool, mi può
anche andar bene fintanto che la cosa rimane per mere questione di
marketing.. negli ambienti *tecnici*, preferisco chiamare le loro cose con
il loro nome.
-- 
~ Ci siamo fatti una scopata cosi' eccezionale che anche i vicini hanno
fumato una sigaretta.

 il loro nome.
E come lo chiameresti? xmlHttp[Request]?



-- 
~ "FINARMENTE LI SFRATTATI AVRANNO UN TETTO SULLA TESTA!
...però tirato ammodino, un tegolo pe' vorta.." (Il vernacoliere)


Azz, prova con un
<div id="placeholder"/>
<b>sdfs</b>
Invece con un <div id="..">sdfds</div> funziona.
Non e' che sia colpa della selezione? Mi servirebbe qualcosa che funzioni 
con qualsiasi tag.
Oppure mi viene un dubblio: il fatto che <div id="placeholder"/> sia un 
qualche cosa da non scrivere. 

 qualche cosa da non scrivere.
Esattamente. Va bene in XML, ma non in HTML o XHTML.
-- 
~ La realtà è un'illusione causata dall'assenza di alcool.


Grazie mille per tutto.
Comunque allora emergono alcune mie lacune. Allora neanche <input .../> si 
deve usare?
Se XHTML segue la sintassi XML perche' non dovrebbe essere permesso <div/>?
Non riesco a fissare la cosa. 

 perche' non dovrebbe essere permesso <div/>?
Perché il div nell'HTML non è un tag senza chiusura. E quindi, in XHTML non
è permessa una cosa del genere, perché devi rispettare sia le regole XML
che HTML.
-- 
~ L'intelligenza artificiale non può battere la stupidità naturale.
(Lemma di Sullivan)

 sequenza "ecco il testo" :-/
Si, ma - correggimi se sbaglio - anche qui che c'entra il browser? Se ho
ben capito, questo processo nasce prima di inviare i dati al client, ovvero
è l'output di Tidy.
Da quanto ho capito stiamo parlando di due cose del tutto diverse. Posso
anche capire le tue perplessità in merito a queste problematiche, ma si
tratta di due argomenti distinti.
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)