Question

J'ai des problèmes pour parcourir manuellement les données XML reçues via un appel HTTPService, le fichier XML ressemble à ceci :


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

Lorsque l'événement de résultat du service Web est déclenché, je fais quelque chose comme ceci :


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!');

}

Ce code fonctionne alors il y a plus d'un nœud "Row" renvoyé, mais il semble que s'il n'y a qu'un seul nœud "Row", alors l'objet event.DataTable.Row n'est pas une erreur et le code est ensuite interrompu.

Quelle est la bonne façon de parcourir l’objet de résultat HTTPService ?Dois-je le convertir en un type de collection XMLList ou en ArrayCollection ?J'ai essayé de définir resultFormat sur "e4x" et cela n'a pas encore résolu le problème...

Merci

Était-ce utile?

La solution

Le problème réside dans cette déclaration

event.result.DataTable.Row.length

length n'est pas une propriété de XMLList, mais une méthode :

event.result.DataTable.Row.length()

c'est déroutant, mais c'est comme ça.

Ajout: en fait, la chose la plus sûre à faire est de toujours utiliser un for each boucle lors de l'itération XMLLists, comme ça vous ne faites jamais d'erreur, c'est moins de code et plus facile à lire :

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

Autres conseils

Row n'est pas un tableau à moins qu'il n'y ait plusieurs éléments Row.C'est ennuyant.Vous devez faire quelque chose comme ça, mais je n'ai pas écrit AS3 depuis un moment donc j'oublie s'il existe une fonction.

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!');
}

Je le stockerais dans un objet XML, puis utiliserais ses méthodes pour rechercher la valeur de nœud dont vous avez besoin.

var returnedXml:Xml = new Xml(event.result.toString());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top