Вопрос

У меня возникли проблемы с ручным циклом обработки данных XML, полученных через вызов HTTPService. XML выглядит примерно так:


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

Когда запускается событие результата веб-сервиса, я делаю что-то вроде этого:


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

}

Этот код работает, если возвращается более 1 узла «Строка», однако кажется, что если есть только один узел «Строка», то объект event.DataTable.Row не является ошибкой, и код впоследствии ломается.

Как правильно перебрать объект результата HTTPService?Нужно ли мне преобразовать его в какой-либо тип коллекции XMLList или ArrayCollection?Я попытался установить для resultFormat значение «e4x», но это еще не решило проблему...

Спасибо

Это было полезно?

Решение

Проблема в этом утверждении

event.result.DataTable.Row.length

length не является собственностью XMLList, но метод:

event.result.DataTable.Row.length()

это сбивает с толку, но это так.

Добавление: на самом деле, самое безопасное — всегда использовать for each цикл при повторении XMLLists, таким образом вы никогда не допустите ошибки, будет меньше кода и его будет легче читать:

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

Другие советы

Row не является массивом, если не существует нескольких элементов Row.Это раздражает.Вам нужно сделать что-то вроде этого, но я давно не писал AS3, поэтому забыл, существует ли там функция существования.

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

Я бы сохранил его в объекте Xml, а затем использовал его методы для поиска нужного значения узла.

var returnedXml:Xml = new Xml(event.result.toString());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top