2008-09-02 2 views
2

У меня возникают проблемы вручную пробегает по данным XML, который будет получен через вызов HTTPService, XML, выглядит примерно так:Как мне перебирать объекты результата в Flex?

 

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

Когда событие результата webservie обжигает я сделать что-то вроде этого:

 

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 «Row» узлов, однако кажется, что если есть только один узел «Row», объект event.DataTable.Row не является ошибкой, а затем код прерывается.

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

Благодаря

ответ

4

Проблема заключается в этом утверждении

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) 
2

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

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

var returnedXml:Xml = new Xml(event.result.toString());