Newsgroup: it.comp.lang.javascript
Titolo: Informazioni su DOMParser

Qualcuno può indicarmi qualche location dove si possa trovare della
documentazione circa DOMParser ed affini?
Grazie

 documentazione circa DOMParser ed affini?
www.w3c.org
.
Attento a non perderti :)
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 Attento a non perderti :)
Parole sante!
Ho trovato anche questa sorta di quick reference:
http://www.webreference.com/programming/javascript/domwrapper/index.html
Purtroppo però non ho trovato nulla che risponda alla mia domanda:
dato un documento XML che carico tramite del codice del tipo:
var objDOM = new DOMParser();
var objDoc = objDOM.parseFromString(strXML, "text/xml");
Non esiste niente che mi restituisca una array associativo con il contenuto
dell'XML?
In pratica da un documento del tipo:
<root>
   <persona>
      <nome>Andrea</nome>
      <eta>25</eta>
   </persona>
   <impiego>Programmatore</impiego>
</root>
Vorrei ottenere (rappresentazione di un array associativo):
Array (
   persona => Array (
      nome => Andrea
      eta => 25
   )
   impiego => Programmatore
)
Ho già implementato una funzione ricorsiva (che in JavaScript significa
tanto dolore!) ma è decisamente troppo lenta! Così cerco appunto un metodo
nativo (magari in XMLSerializer?) che mi dia questo risultato.
Sto' sognando i caraibi?

 Sto' sognando i caraibi?
Beh, piuttosto stai facendo un incubo. :) Mi spieghi a che diamine ti 
serve? ^_^


 tutto l'albero non ha veramente senso.
Hai colto nel segno Zer0, dal server carico una pagina che contiene una
stringa che in realtà è documento XML contenente dei dati che devono essere
processati da delle funzioni JavaScript per interagire su un determinato
frame; l'oggetto persona è solo un esempio in realtà i dati specificano dei
colori da applicare in certi punti della pagina, delle proprietà da
impostare, degli oggetti HTML da visualizzare o da nascondere, ...
Ho bisogno che sia in un'array per usarlo all'interno del codice!

 usarlo all'interno del codice! 
Invece di fa tornare una pagina che contiene una stringa XML (cosa 
significa?) fai tornare un documento XML ed utilizza una funzione come 
la seguente per caricarlo. 
Se la vuoi usare testala per bene. L'ho estratta da del codice che ho 
scritto tempo fa e non vorrei aver dimenticato qualcosa.
/**********************************************************************-
*** 
 * Carica il documento XML puntato da url in backgroud e richiama la 
 * funzione func quando il caricamento e' completato
 * @param url url del documento XML da caricare
 * @param func funzione che deve essere chiamata al temine del 
 caricamento * @return documento XML. *Attenzione* al ritorno della 
 funzione il *         documento non e' stato ancora caricato.
 **********************************************************************-
 ***/ 
function getXMLDoc( url, func ) {
	var xmlDoc;
 
       /* DOM level 2 browsers like mozilla */
	if (document.implementation && document.implementation.createDocument)
	{
		xmlDoc = document.implementation.createDocument("", "", null);	
		xmlDoc.onload = function() { func(xmlDoc) };
	}
	else if (window.ActiveXObject) /* IE :-( */
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = true;
		xmlDoc.onreadystatechange = function() {
			if( xmlDoc.readyState == 4 ) func( xmlDoc );
		}
 	}
	else
	{
		alert('Your browser can\'t handle this script');
		return 0;
	}
 
	xmlDoc.load(url);
	return xmlDoc;
}
La funzione func che passi viene richiamata al termine del caricamento. 
A questo punto puoi estrarre dal documento XML tutte le info che vuoi 
con funzioni come la getElementById etc.
Ciao.
 -Ema-

 Ho bisogno che sia in un'array per usarlo all'interno del codice!
Lato client o Server? O entrambi?


Il problema non sta' nell'ottenere il documento XML ma dopo...
In pratica questo è quello che succede:
Lato server (PhP)
1) costruzione di una stringa XML (in pratica è un documento XML solo che
invece che essere salvato in un file .xml lo memorizzo come attributo value
di un input HTML di tipo hidden)
Lato client (JavaScript)
2) passo il contenuto del campo hidden al metodo parseFromString
dell'oggetto DOMParser ottenendo un oggetto che rappresenta il documento XML
3) navigo nell'oggetto ottenuto al punto 2 per riportare i dati in un'array
associativo multidimensionale (dato che devo utilizzare i dati in varie
funzioni JavaScript un array è più comodo!)
Il tuo script, pur con una modalità diversa da quella che utilizzo io,
permette di ottenere l'oggetto che io ottengo al punto 2.
Io invece il problema ce l'ho al punto 3: esiste niente che mi permetta di
ottenere il risultato di cui al punto 3? (immagino un metodo del tipo
parseToArray dell'oggetto DOMParser!)

In pratica questo è quello che succede:
Lato server (PhP)
1) costruzione di una stringa XML (in pratica è un documento XML solo che
invece che essere salvato in un file .xml lo memorizzo come attributo value
di un input HTML di tipo hidden)
Lato client (JavaScript)
2) passo il contenuto del campo hidden al metodo parseFromString
dell'oggetto DOMParser ottenendo un oggetto che rappresenta il documento XML
3) navigo nell'oggetto ottenuto al punto 2 per riportare i dati in un'array
associativo multidimensionale (dato che devo utilizzare i dati in varie
funzioni JavaScript un array è più comodo!)
Quindi il documento lo costruisco sì lato server ma poi lo utilizzo lato
client ee è appunto lato client che ho la necessità di effettuare il
"trasbordo" dei dati dall'oggetto XML ad un array associativo
multidimensionale (vedi punto 3).
Ti ho accennato al codice lato server solo per farti capire il motivo per
cui mi credo l'oggetto XML: mi serve per passare i dati dal server al client
(sò che avrei potuto serializzare l'array lato server e deserializzarlo lato
client ma passando per una struttura XML ho la possibilità di tenermi la
strada aperta verso altre funzionalità future!).
Il problema è quindi puramente lato client e si riferisce alla soluzione del
punto 3 (che attualmente ho risolto con la ricorsione di cui ti accennavo!)


Non conosco metodi built-in per fare cio' che chiedi (DOMParser e 
DOMSerializer non fanno quello che ti serve). Sinceramente non capisco 
la necessita' di trasformarlo in un array associativo. Se proprio ti 
serve penso che l'unica soluzione oggi sia passarsi tutto il documento 
(forse in modo ricorsivo come dici tu, forse no) e costruire l'array 
associativo. Non dovrebbe essere troppo lento usando childNodes e 
compagnia. 
Ciao.
 -Ema-

 funzioni JavaScript un array č piů comodo!)
Mhm.. IMVHO, proprio per tenerti aperte strade future, non devi affatto 
trasformarlo in un array associativo, perche' ne perdi in versatilita'.
Se mi passi un esempio pratico del tuo problema, ti mostro come 
eventualmente farei io.
A naso, avendo un documento XML che mi serve essenzialmente come 
"configuratore", dovendo passare parti di esso a delle funzioni, 
prenderei il subset di nodi interessati, e passerei come parametro 
quelli.
Un array non potra' mai essere paragonato come flessibilita' ad un nodo 
xml; questo te lo dico spassionatamente. Non c'e' motivo pratico per 
farlo. Puoi benissimo rendere il codice leggibile e comodo tramite un 
nodo xml senza affidarti ad un array associativo, magari - come ti ho 
detto - limitando i nodi al subset interessato e non a tutto il 
documento.
Con un XML del genere, cmq:
<root>
   <persona>
      <nome>Andrea</nome>
      <eta>25</eta>
   </persona>
   <impiego>Programmatore</impiego>
</root>
Non ha senso usare tutti questi tag, in quanto i valori dentro i nodi 
non sono "complessi".
<root>
	<persone>
		<persona nome="Andrea" eta="25" impiego="Programmatore" />
	</persone>
</root>
Per esempio.
In questo modo ti basta avere un semplice riferimento al nodo che ti 
interessa, per poi recuperare i valori con i metodi relativi agli 
attributi:
myemployee.getAttribute("nome")
etc..


 xml; questo te lo dico spassionatamente.
VERISSIMO, sono d'accordo con te!
Però è anche vero che avendo i dati in un'array associativo posso scrivere
un'istruzione di questo tipo (supposto che la variabile DataFromServer sia
l'array associativo restituito):
document.getElementById('Griglia1').style.background=DataFromServer["Griglia
1"]["Stile"]["Sfondo"];
In pratica potrei avere varie griglie (ossia TABLE html) e quindi oltre al
nodo Griglia1 posso averne altri...
Inoltre il nodo Stile non contiene solamente Sfondo ma può contenere anche
carattere, dimensioni, ...
Così come il nodo Griglia1 può contenere anche i nodi DimX, DimY, ...
Insomma la struttura del documento xml non è affatto così semplice come
quella che, erroneamente, ti avevo dato io come esempio!
Tornando all'esempio, ipotizzando di estrarre i dati come "xml" anzichè come
array associativo, la stessa riga di codice diventerrebbe (supposto che la
variabile DataFromServer sia l'oggetto "xml" restituito):
document.getElementById('Griglia1').style.background=DataFromServer.childNod
es.item("Griglia1").childNodes.item("Stile").childNodes.item("Sfondo");
Che è decisamente meno leggibile!

document.getElementById('Griglia1').style.background=DataFromServer.childNod
es.item("Griglia1").childNodes.item("Stile").childNodes.item("Sfondo").child
Nodes.item(0).nodeValue;
ERRATA CORRIGE!
Ho riportato l'esempio esatto del codice JavaScript per accedere ai nodi di
un oggetto "xml".
(Ancora meno leggibile!)

 es.item("Griglia1").childNodes.item("Stile").childNodes.item("Sfondo");
Tra l'altro, come giustamente hai corretto dopo, questo non sarebbe 
neanche il codice giusto.
Cmq sia, perche' ti vuoi del male? Non e' piu' docile una cosa come 
questa?
//Griglia1/Stile/Sfondo
Come ti ho detto, pero', sarebbe preferibile gestire le cose con gli 
attributi, altrimenti l'XML non viene sfruttato a dovere.


 (Ancora meno leggibile!)
Leggi nell'altro post cos'ho scritto. Cmq se per un motivo o per un 
altro tu non volessi usare l'XPath, puoi sempre farti una 
funzione/metodo (dipende anche dal browser che usi) che ti restituisce 
il valore finale di una serie di nodi "flat". Ad esempio:
document.getElementById('Griglia1').style.background=DataFromServer.get
("Griglia1.Stile.Sfondo");
Quest'ipotetica "get" ovviamente ti recupera il nodeValue dell'ultimo 
nodo inserito. E' molto piu' leggibile e compatta di un array 
associativo, non credi? Inoltre, non sprechi tutte quelle risorse nel 
costruirlo, ma recuperi cio' che ti serve "on-demand".
Anche se, a questo punto, non vedo perche' non usare l'XPath. :) Dato 
che la lunghezza della stringa che passi e' la medesima, e l'Xpath e' 
gia' implementato di suo, e ti permette di recuperare nodi con 
condizioni piu' complesse.


 attributi, altrimenti l'XML non viene sfruttato a dovere.
Forse hai ragione!

 cos'č? un url????
No, e' un espressione XPath. In pratica e' la sintassi per dire di 
recuperare il riferimento al nodo "Sfondo" che e' figlio di Stile, che 
a sua volta e' figlio del nodo Griglia1 che si trova nella root del 
documento XML.
Non ti ho scritto il metodo per utilizzare l'XPath in quanto non so che 
browser usi (suppongo Mozilla/Netscape dato che fai uso del DOMParser).


 browser usi (suppongo Mozilla/Netscape dato che fai uso del DOMParser).
Hai ragione, non te l'ho mai detto: uso Mozilla 1.4...
Ti ho già più che sfruttato ma se potessi allungarmi un microesempio...
Ho cercato qualchecosa relativo all'utilizzo di XPath ma non ho trovato
niente altro che:
http://www.w3.org/TR/2002/WD-DOM-Level-3-XPath-20020328/expanded-toc.html
Che però ha un solo problema... non ha un minimo esempio!
Insomma definisce tutto, sono elencate tutte le specifiche, tranne chi è
l'oggetto padre!
In pratica se voglio farmi un file di esempio non sò dove andare a beccarmi
tutti i metodi e le proprietà che sono definiti nelle specifiche w3c...
Probabilmente sono io che non sò usare a dovere il sito della w3c: potresti
spiegarmi dove si trovano (e magari come si trovano!) le informazioni che
cerco?
Grazie ancora
PS: su 
microsoft.com
 ho cercato XPath, il primo risultato è
http://support.microsoft.com/default.aspx?scid=kb;en-us;285163
 (e la cosa
eccezionale è che questo url si apre anche con Mozilla!!!); notare l'esempio
che è praticamente quello che cerco per Mozilla! (la struttura di help e
supporto di Microsoft secondo me ha spesso e volentieri una marcia in più!)
Ho spezzato una lancia in favore di Microsoft perchè stavolta Mozilla.org (e
w3.org
) me li hanno fatti girare!!!  ;-)
PPSS: non è che l'esempio trovato sul sito Microsoft sia valido anche su
Mozilla?

 essere usata in svariati linguaggi (la uso in XSL, l'ho usata in Perl).
Vuoi dirmi che non esiste un modo di eseguire un'espressione XPath con la
chiamata a qualche metodo in uno script JavaScript?

 Grazie ancora
Di niente, fa piacere poi vedere uno che non si limita a chiedere 
nell'NG, ma applica cio' che gli viene detto e cerca la documentazione 
appropriata prima di riscrivere nuovamente. :)


 chiamata a qualche metodo in uno script JavaScript?
No, voleva dirti che "XPath" non e' legato univocamente a Javascript. 
Non c'e' una diretta dipendenza, l'XPath e' a "prescindere" dal 
linguaggio, che puo' o meno implementarne il resolver. XPath puo' 
essere usato in Javascript, in Java, in C, In Perl, in XSLT, etc..
Credo che ci tenesse solo a sottolineare questo. :)


Grazie Zer0.
In particolare
http://groups.google.it/groups?hl=it&lr=&ie=UTF-8&oe=UTF-8&threadm=MPG.1921a4a5872049a19898c9%40130.133.1.4&rnum=2&prev=/groups%3Fq%3Dxpath%2Bgabriele%2Bzer0%26hl%3Dit%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26selm%3DMPG.1921a4a5872049a19898c9%2540130.133.1.4%26rnum%3D2
 è
giusto quello che stavo cercando...
Ok, ora ci provo...
Mal che vada tornerò a stressare il ng!!! (ma con un nuovo msg perchè questo
ormai ha un tree biblico!)  ;-)

Ok, adesso ho capito la precisazione...
Grazie comunque dell'aiuto.
Ciao!