我在手动循环通过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”,而这还没有解决问题...
由于
答案 0 :(得分: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 )
答案 1 :(得分: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!');
}
答案 2 :(得分:1)
我会将它存储在Xml对象中,然后使用其方法搜索所需的节点值。
var returnedXml:Xml = new Xml(event.result.toString());