Domanda

Sto riscontrando problemi nel ciclo manuale dei dati XML ricevuti tramite una chiamata HTTPService, l'XML è simile al seguente:


<DataTable>
    <Row>
        <text>foo</text>
    </Row>
    <Row>
        <text>bar</text>
    </Row>
</DataTable>

Quando viene attivato l'evento risultato del servizio web, faccio qualcosa del genere:


for(var i:int=0;i<event.result.DataTable.Row.length;i++)
{
    if(event.result.DataTable.Row[i].text == "foo")
        mx.controls.Alert.show('foo found!');

}

Questo codice funziona se viene restituito più di 1 nodo "Riga", tuttavia sembra che se è presente un solo nodo "Riga", l'oggetto event.DataTable.Row non è un errore e il codice successivamente si interrompe.

Qual è il modo corretto di eseguire il ciclo dell'oggetto risultato HTTPService?Devo convertirlo in qualche tipo di raccolta XMLList o ArrayCollection?Ho provato a impostare resultFormat su "e4x" e il problema non è ancora stato risolto...

Grazie

È stato utile?

Soluzione

Il problema sta in questa affermazione

event.result.DataTable.Row.length

length non è una proprietà di XMLList, ma un metodo:

event.result.DataTable.Row.length()

è confuso, ma è così.

Aggiunta: in realtà, la cosa più sicura da fare è usare sempre a for each loop durante l'iterazione XMLLists, in questo modo non commetti mai errori, c'è meno codice e più facile da leggere:

for each ( var node : XML in event.result.DataTable.Row )

Altri suggerimenti

Row non è un array a meno che non siano presenti più elementi Row.È noioso.Devi fare qualcosa del genere, ma è da un po' che non scrivo AS3 quindi dimentico se esiste una funzione esistente.

if (exists(event.result.DataTable) && exists(event.result.DataTable.Row)){
  if (exists(event.result.DataTable.Row.length)) {
    for(var i:int=0;i<event.result.DataTable.Row.length;i++)
    {
        if (exists(event.result.DataTable.Row[i].text)
        && "foo" == event.result.DataTable.Row[i].text)
            mx.controls.Alert.show('foo found!');
    }
  }
  if (exists(event.result.DataTable.Row.text)
  && "foo" == event.result.DataTable.Row.text)
      mx.controls.Alert.show('foo found!');
}

Lo memorizzerei in un oggetto Xml e quindi utilizzerei i suoi metodi per cercare il valore del nodo che ti serve.

var returnedXml:Xml = new Xml(event.result.toString());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top