Frage

Ich habe Probleme beim manuellen Durchlaufen von XML-Daten, die über einen HTTPService-Aufruf empfangen werden. Das XML sieht in etwa so aus:


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

Wenn das Webservie-Ergebnisereignis ausgelöst wird, mache ich etwa Folgendes:


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

}

Dieser Code funktioniert, wenn mehr als 1 „Zeilen“-Knoten zurückgegeben wird. Wenn jedoch nur ein „Zeilen“-Knoten vorhanden ist, ist das Objekt „event.DataTable.Row“ offenbar kein Fehler und der Code bricht anschließend ab.

Was ist der richtige Weg, um das HTTPService-Ergebnisobjekt zu durchlaufen?Muss ich es in eine Art XMLList-Sammlung oder eine ArrayCollection konvertieren?Ich habe versucht, das resultFormat auf „e4x“ zu setzen, aber das hat das Problem noch nicht behoben ...

Danke

War es hilfreich?

Lösung

Das Problem liegt in dieser Aussage

event.result.DataTable.Row.length

length ist kein Eigentum von XMLList, sondern eine Methode:

event.result.DataTable.Row.length()

es ist verwirrend, aber so ist es.

Zusatz: Tatsächlich ist es am sichersten, immer a zu verwenden for each Schleife beim Durchlaufen XMLLists, auf diese Weise machen Sie nie den Fehler, es ist weniger Code und einfacher zu lesen:

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

Andere Tipps

Row ist kein Array, es sei denn, es gibt mehrere Row-Elemente.Es ist nervig.Sie müssen so etwas tun, aber ich habe AS3 schon eine Weile nicht mehr geschrieben, daher vergesse ich, ob es eine Funktion „exists“ gibt.

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

Ich würde es in einem XML-Objekt speichern und dann seine Methoden verwenden, um nach dem benötigten Knotenwert zu suchen.

var returnedXml:Xml = new Xml(event.result.toString());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top