2008-09-02 78 views
2
我有通过通过HTTPService调用接收到的XML数据手动循环问题

中,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个“行”节点,但是如果只有一个“行”节点,那么event.DataTable.Row对象不是错误,代码随后会中断。

循环访问HTTPService结果对象的正确方法是什么?我是否需要将其转换为某种类型的XMLList集合或ArrayCollection?我已经尝试设置的resultFormat为“E4X”,而且还没有解决这个问题...

感谢

回答

4

问题就出在这条语句

event.result.DataTable.Row.length 

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

event.result.DataTable.Row.length() 

它的混乱,但是这事情是这样的。

增加:实际上,以最安全的做法是遍历XMLList■当始终使用for each循环,这样你永远不会犯这样的错误,这是更少的代码,并且更易于阅读:

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

行不是一个数组,除非有多个行元素。这很烦人。你必须做这样的事情,但我没有写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()); 
相关问题