`
it_liuyong
  • 浏览: 97793 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

flex遍历xml

    博客分类:
  • flex
 
阅读更多
xml.*.elements("node").(attribute("state")=="unchecked")
     使用Flex的朋友都知道,Flex使用XML做为Flex 的数据源,那是家常便饭的事情,因此不可避免地要碰到XML遍历的问题,对于新手来说,这个问题,还真是需要解决的问题。下面我们来讨论一下这个问题。
      一、XML的格式。我们这里讨论的XML数据,包括两种格式。

       格式一: 树型结构XML数据:



[html] view plaincopyprint?
01.<root  label="系统功能区">  
02.      <child1  label="设备管理" >  
03.                <child2 label="单点操作"/>  
04.                <child2 label="自定义分组"/>  
05.                <child2 label="设备维护"/>  
06.                <child2 label="节点配置"/>  
07.                <child2 label="通讯号码"/>  
08.                <child2 label="自定义字段"/>    
09.       </child1>  
10.       <child1  label="警报处理" >  
11.                <child2 label="报警参数"/>  
12.                <child2 label="报警维护"/>   
13.</child1> 
<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数据:


[html] view plaincopyprint?
01.<alerts>  
02.      <alert>  
03.        <ID>213001</ID>  
04.        <name></name>  
05.        <kind></kind>  
06.        <desc></desc>  
07.        <addr></addr>  
08.        <tel>020-63263365</tel>  
09.    </alert>  
10.    <alert>  
11.        <ID>213001</ID>  
12.        <name></name>  
13.        <kind></kind>  
14.        <desc></desc>  
15.        <jb>5</jb>  
16.        <addr></addr>  
17.        <tel>020-63263365</tel>  
18.    </alert>  
19.</alerts> 
<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等控件提供数据源。

    二、两种不同数据源的遍历方法不同。因为结构不一样,所以遍历起来的方法也不一样。

          对于数型结构,要遍历的话,需要递归,遍历每一个叶子结点。


[java] view plaincopyprint?
01.private function Trav_AddDg(xml:XMLList,):void  
02.{  
03.    for each (var xmlChildren:XML in xml)  
04.    {  
05.        if (xmlChildren.@flag == "")  
06.        {  
07.            //做事情   
08.        }  
09.        //有子结点,递归   
10.        if (xmlChildren.hasComplexContent())  
11.        {  
12.            var list:XMLList=xmlChildren.children();  
13.            Trav_AddDg(list, desc); //递归调用     
14.        }  
15.    }  
16.} 
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); //递归调用  
        }
    }
}




     注意递归的条件,防止无穷递归。

     对于记录型结构我们采用循环的方式就可以遍历:

[java] view plaincopyprint?
01.var i:int;  
02.for(i=0;i<flexXML.child("alert").length();i++)  
03. 
04.{                                           
05. 
06.trace(flexXML.child("alert").[i].Name+":"+flexXML.child("alert").[i].Version);   
07.}  


楼主试试这个
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:XML id="xmlSource"> 
<node label="grandFather" state="unchecked"> 
<node label="Father" state="unchecked"> 
<node label="son" state="unchecked"> 
<node label="1001" state="unchecked"> 
<node label="100101" state="unchecked"> 
</node> 
</node> 
</node> 
</node> 
<node label="Uncle3" state="unchecked"> 
<node label="son2" state="unchecked"> 
<node label="1002" state="unchecked"> 
<node label="100102" state="unchecked"> 
</node> 
</node> 
</node> 
</node> 
<node label="Uncle3" state="unchecked"> 
<node label="son3" state="unchecked"> 
<node label="1003" state="unchecked"> 
<node label="100103" state="checked"> 
</node> 
</node> 
</node> 
</node>  
</node> 
</mx:XML>  
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;

private function onClick():void{
var xmlList:XMLList = xmlSource.children();
findChecked(xmlList);
}

private function findChecked(xmlList:XMLList):void{
for(var i:int =0;i<xmlList.length();i++){
if(xmlList[i].@state.toString()== "checked"){
Alert.show(xmlList[i].@label.toString());
br}
if(xmlList[i].hasComplexContent()){
findChecked(xmlList[i].children());
}

}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics