PDA

View Full Version : [AS & XML] Problema lettura Xml con Flash


AnD01
24-03-2008, 00:08
Ciao a tutti, premetto subito che ho già letto numerose guide, tutorial ed esempi vari in merito a questo argomento, dopo una settimana sono ancora al punto di partenza...o quasi.

Vado subito al punto: Ho un file Xml di questo tipo:


<xml>
<categorie>
<cat id="0001">
<nome>nome_categoria</nome>
<descr>descrizione_categoria</descr>
//
</cat>
<cat id="0002">
<nome>nome_categoria2</nome>
<descr>descrizione_categoria2</descr>
//
</cat>
//
</categorie>
</xml>


Supponiamo che io debba leggere tutti i campi "nome" con un ciclo for.

Indubbiamente ho bisogno di sapere quante "cat" ci sono nell xml quindi ho fatto:

var dato = new Array();
var my_xml = new XML();
var nodes = new Array();
my_xml.onLoad = function(success){

if (success){
nodes = my_xml.firstChild.childNodes;
for(i = 0; i < nodes.length; i++){
var dato[i] = nodes[i].attributes.nome;
}

}
}

naturalmente non va...chi è che saprebbe come dare una raddrizzata al mio codice?? o comunque che sappia mettermi sulla una strada buona???

Grazie della disponibilità

kk3z
24-03-2008, 14:41
<xml>
<categorie>
<cat id="0001">
<nome>nome_categoria</nome>
...
non è xml valido, prova con:
<?xml version="1.0" encoding="ISO-8859-1"?>
<categorie>

var my_xml = new XML();
Ti sei dimenticato di usare my_xml.load("nome del file.xml)?

nodes = my_xml.firstChild.childNodes;
for(i = 0; i < nodes.length; i++){
var dato[i] = nodes[i].attributes.nome;
}
my_xml.firstChild si riferisce al nodo "categorie", e i suoi childnodes sono i nodi "cat". Ma nessuno dei nodi cat ha un attributo "nome", ma solo "id". Se vuoi trovare il valore del sottonodo "nome", fai
dato.push( nodes[i].firstChild.value );

AnD01
24-03-2008, 16:10
allora l'xml è valido solo che nn ho scritto tutto l'ambaradan anche qui sul forum, my_xml.load(nome_file.xml) è messo fuori dalla funzione onload quindi anche quello c'è.
Le altre due cose che mi hai suggerito credo che mi risolvano il problema quindi intanto grazie, poi appena faccio le prove ti faccio sapere come è andata


Aggiornamento:

Ho modificato il codice in questa maniera:
stop();

var my_xml = new XML();
var nodes = new Array();
my_xml.onLoad = function(success){

if (success){
nodes = my_xml.firstChild.childNodes;
for(i = 0; i < nodes.length; i++){
txt_lo.text += nodes[i].firstChild.value
}

}
}
my_xml.load("categorie.xml");


Il risultato è che non entra nemmeno nel ciclo for...non ne riesco a venire a capo

kk3z
25-03-2008, 09:36
Si vede che success è false... prova qualche trace qua e là, per esempio trace(success) o trace(nodes) o trace(nodes[i])

AnD01
25-03-2008, 11:01
allora ho fatto come dici e come pensavo non entra nel ciclo for perchè con le impostazioni nodes = my_xml.firstchild.childNodes, nodes.length risulta uguale a 0. Success = true

Aggiornamento:

Sto facendo qualche prova (a caso devo dire) ,posto i risultati sperando che possano illuminare qualcuno :D

PROVA 1:

stop();

var my_xml = new XML();

var nodes = new Array();
my_xml.onLoad = function(success){

if (success){
nodes = my_xml.nextSibling.childNodes;
trace(success);
trace(nodes.length)
trace(nodes)
}
}
my_xml.load("categorie.xml");

Risultati:
success = true
nodes.length = undefined
nodes = undefined

PROVA 2:

stop();

var my_xml = new XML();
var nodes = new Array();
my_xml.onLoad = function(success){

if (success){
nodes = my_xml.childNodes;
trace(success);
trace(nodes.length);
trace(nodes)
}
}
my_xml.load("categorie.xml");

Risultati:
success = true
nodes.length = 2
nodes =
,<categorie> (cos'è sta virgola davanti categorie????)

<cat name="primi piatti">

<name>primi piatti</name>

<descr>boniii</descr>

<delay>49</delay>

</cat>

<cat name="secondi">

<name>secondi</name>

<descr>asdf</descr>

<delay>23</delay>

</cat>

</categorie>

PROVA 3:

stop();

var my_xml = new XML();
var nodes = new Array();
my_xml.onLoad = function(success){

if (success){
nodes = my_xml.firstChild.childNodes;
trace(success);
trace(nodes.length);
trace(nodes)
}
}
my_xml.load("categorie.xml");

Risultati:
success = true
nodes.length = 0
nodes = (niente)

AnD01
25-03-2008, 11:33
Ancora qualche prova

PROVA 4:

stop();

var my_xml = new XML();
var nodes = new Array();
my_xml.onLoad = function(success){

if (success){
nodes = my_xml.firstChild.nextSibling.childNodes;
trace(success);
trace(nodes.length);
trace(nodes)
}
}
my_xml.load("categorie.xml");

Risultati:
success = true
nodes.length = 5
nodes =
,<cat name="primi piatti">

<name>primi piatti</name>

<descr>boniii</descr>

<delay>49</delay>

</cat>,

,<cat name="secondi">

<name>secondi</name>

<descr>asdf</descr>

<delay>23</delay>

</cat>,

eseguendo la stessa prova con il comando my_xml.ignorewhite= "true" si ottengono i seguenti risultati
success = true
nodes.lenght = undefined
nodes = undefined

AGGIORNAMENTO:
Ho trovato la chiave di volta!

PROVA 5:

stop();

var my_xml = new XML();
my_xml.ignoreWhite = true; *
var nodes = new Array();
my_xml.onLoad = function(success){

if (success){
nodes = my_xml.firstChild.childNodes;*
trace(success);
trace(nodes.length);
trace(nodes[0].attributes.name)
}
}
my_xml.load("categorie.xml");

Risultati:
success = true
nodes.length = 2
nodes[0].attributes.name = primi piatti

l'unica cosa che non riesco ancora a leggere sono l tag all' interno di cat (descr, delay ecc)

AnD01
25-03-2008, 12:23
L'ultimo scoglio da superare :

PROVA 6:

stop();

var my_xml = new XML();
my_xml.ignoreWhite = true;
var nodes = new Array();
my_xml.onLoad = function(success){

if (success){
nodes = my_xml.firstChild.childNodes;
trace(success);
trace(nodes.length);
var dato;
dato = (nodes[0].childNodes[1].value)
trace(dato)
}
}
my_xml.load("categorie.xml");

Risultati:
success = true
nodes.lenght = 2
dato = undefined (mentre se tolgo il ".value" mi da <descr> descrizione </descr>... quindi come si estraggono i dati dai tag??? grazie mille