使用Flex的朋友都知道,Flex使用XML做为Flex 的数据源,那是家常便饭的事情,因此不可避免地要碰到XML遍历的问题,对于新手来说,这个问题,还真是需要解决的问题。下面我们来讨论一下这个问题。
一、XML的格式。我们这里讨论的XML数据,包括两种格式。
格式一: 树型结构XML数据:
<root label="系统功能区">
<child1 label="设备管理" >
<child2 label="单点操作"/>
<child2 label="自定义分组"/>
<child2 label="设备维护"/>
<child2 label="节点配置"/>
<child2 label="通讯号码"/>
<child2 label="自定义字段"/>
</child1>
<child1 label="警报处理" >
<child2 label="报警参数"/>
<child2 label="报警维护"/>
</child1>
格式二:记录型XML数据:
<alerts>
<alert>
<ID>213001</ID>
<name></name>
<kind></kind>
<desc></desc>
<addr></addr>
<tel>020-63263365</tel>
</alert>
<alert>
<ID>213001</ID>
<name></name>
<kind></kind>
<desc></desc>
<jb>5</jb>
<addr></addr>
<tel>020-63263365</tel>
</alert>
</alerts>
朋友们,有没有看出这两种数据的格式有个么不同,对了,一种的树型结构的,适合于给Tree控件提供数据源,一个是记录型的,适合于给 dataGrid List等控件提供数据源。
二、两种不同数据源的遍历方法不同。因为结构不一样,所以遍历起来的方法也不一样。
对于数型结构,要遍历的话,需要递归,遍历每一个叶子结点。
private function Trav_AddDg(xml:XMLList,):void
{
for each (var xmlChildren:XML in xml)
{
if (xmlChildren.@flag == "")
{
//做事情
}
//有子结点,递归
if (xmlChildren.hasComplexContent())
{
var list:XMLList=xmlChildren.children();
Trav_AddDg(list, desc); //递归调用
}
}
}
注意递归的条件,防止无穷递归。
对于记录型结构我们采用循环的方式就可以遍历:
var i:int;
for(i=0;i<flexXML.child("alert").length();i++)
{
trace(flexXML.child("alert").[i].Name+":"+flexXML.child("alert").[i].Version);
}
OK,好了。