如何在Flex中循环结果对象?

eiee3dmh  于 2022-09-21  发布在  Apache
关注(0)|答案(3)|浏览(120)

我在手动循环通过HTTPService调用接收的XML数据时遇到了问题,XML如下所示:

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

当触发WebService结果事件时,我会执行如下操作:

for(var i:int=0;i&lt;event.result.DataTable.Row.length;i++)
{
    if(event.result.DataTable.Row[i].text == "foo")
        mx.controls.Alert.show('foo found!');
}

如果返回1个以上的“Row”节点,则此代码可以正常工作。但是,如果只有一个“Row”节点,那么vent.DataTable.Row对象就不是错误,代码随后就会中断。

循环通过HTTPService结果对象的正确方式是什么?我是否需要将其转换为某种类型的XMLList集合或ArrayCollection?我已尝试将ResultFormat设置为e4x,但仍未解决问题……

谢谢。

uemypmqf

uemypmqf1#

问题出在这句话里

event.result.DataTable.Row.length

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

event.result.DataTable.Row.length()

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

  • 附加:*实际上,最安全的做法是在XMLLists上迭代时始终使用for each循环,这样就不会出错,代码更少,更容易阅读:
for each ( var node : XML in event.result.DataTable.Row )
qyyhg6bp

qyyhg6bp2#

除非有多个Row元素,否则Row不是数组。这是令人讨厌的。您必须这样做,但我已经有一段时间没有编写AS3了,所以我忘记了是否有EXISTS函数。

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

esyap4oy3#

我会将其存储在一个XML对象中,然后使用它的方法来搜索您需要的节点值。

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

相关问题