3

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

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

当 web 服务结果事件被触发时,我会做这样的事情:

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”节点,那么event.DataTable.Row对象似乎不是错误,代码随后会中断。

遍历HTTPService结果对象的正确方法是什么?我是否需要将其转换为某种类型的XMLList集合或ArrayCollection?我已经尝试将 resultFormat 设置为e4x并且尚未解决问题...

谢谢。

4

3 回答 3

4

问题出在这句话上

event.result.DataTable.Row.length

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

event.result.DataTable.Row.length()

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

补充:for each实际上,最安全的做法是在迭代 s 时始终使用循环XMLList,这样您就不会出错,代码更少,更易于阅读:

for each ( var node : XML in event.result.DataTable.Row )
于 2008-09-03T05:48:34.180 回答
2

除非有多个 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!');
}
于 2008-09-02T23:47:13.923 回答
1

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

var returnedXml:Xml = new Xml(event.result.toString());
于 2008-09-02T23:56:46.100 回答