У меня возникли проблемы с ручным циклом обработки 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, но это еще не решило проблему ...
Спасибо.





Строка не является массивом, если нет нескольких элементов строки. Это раздражает. Вы должны сделать что-то подобное, но я давно не писал 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());
Проблема заключается в этом утверждении
event.result.DataTable.Row.length
length - это не свойство XMLList, а метод:
event.result.DataTable.Row.length()
это сбивает с толку, но так оно и есть.
Добавление: на самом деле, самый безопасный вариант - всегда использовать цикл for each при итерации по XMLList, так вы никогда не ошибетесь, это меньше кода и будет легче читать:
for each ( var node : XML in event.result.DataTable.Row )