如何在Flex中遍历结果对象?

时间:2020-03-05 18:46:49  来源:igfitidea点击:

我在手动循环通过HTTPService调用接收的xml数据时遇到问题,该xml看起来像这样:

<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个以上的"行"节点,但是,如果只有一个"行"节点,则event.DataTable.Row对象不是错误,并且代码随后中断。

遍历HTTPService结果对象的正确方法是什么?我需要将其转换为某种类型的XMLList集合还是ArrayCollection?我尝试将resultFormat设置为" e4x",但尚未解决问题。

谢谢

解决方案

回答

除非存在多个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());

回答

问题在于此语句

event.result.DataTable.Row.length

长度不是XMLList的属性,而是一种方法:

event.result.DataTable.Row.length()

令人困惑,但这就是事实。

另外:实际上,最安全的做法是在XMLList上进行迭代时始终使用" for each"循环,这样就永远不会出错,代码更少,更易于阅读:

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