flex xml和arraycollection相互转换


flex xml和arraycollection相互转换
(2010-06-04 13:58:17)
转载▼
标签:
it
    分类: Flex

1、arraycollection转化为xml,代码如下:

    

    view plaincopy to clipboardprint?
//动态生成树形结构  
  public static function flatArrayToXML(arr:Object,rootname:String=null,nodename:String=null, outputString:Boolean=false):Object{  
            if (arr is Array){  
                  
            }else if ( arr is ArrayCollection){  
                arr= ArrayCollection(arr).source;  
            }else if (arr == null){  
                return null;  
            }  
            if (rootname==null) rootname="root";  
            var xmlstr:String="<"+rootname+" "+"label='套餐项目'>";  
            var xmlList:XMLList=new XMLList();  
            var alength:int=arr.length;  
   if (alength > 0)  
   {  
    for (var i:int=0; i < alength; i++)  
    {  
      xmlstr+=objToSimpXML(arr[i].name,0,nodename,true);    
      }  
      xmlstr +="</"+nodename+">";  
     }  
    }  
   }  
            xmlstr+="</"+rootname+">";  
   trace(xmlstr);  
            var xmldoc:XMLDocument=new XMLDocument(xmlstr);  
            if (outputString==true)  
                return xmldoc==null ? "": xmldoc.toString();  
            var xml:XML=new XML(xmldoc);  
            return xml;  
        }  
          
        //将对象转换为简单xml.<node property1='value1'  property2='value2'/>这种形式  
        //obj转换源对象,仅支持简单对象,如果对象的属性也是一个对象则不进入递归,  
        //nodename可以自定义节点名称, 默认是"node"  
        //是否输出为字符串, 默认转换为xml, 如果为true则将xml变为字符串  
        //return 值类型根据outputString 来决定, 可能是XML,可能是String  
        public static function objToSimpXML(ri_name:String,nodeorchild:int, nodename:String=null, outputString:Boolean=false):String{  
            if(ri_name==null) return null;  
            if (nodename==null)nodename="node";//节点名字  
            var str:String="<"+nodename;  
            str+=" label='"+filterXMLString(ri_name)+"'";节点中属性的名字  
            nodeorchild == 1?str+="/>":str+=">";  
//            var xmldoc:XMLDocument=new XMLDocument(str);  
//            if (outputString==true) return xmldoc==null ? "": xmldoc.toString();  
//            var xml:XML=new XML(xmldoc);  
            return str;  
        }  
        //过滤xmlstring, 一些不安全字符需要转义, 比如 单双引号, 左右单箭头等  
        public static function filterXMLString(str:String):String  
        {  
            if (str ==null) return "";  
            str=str.replace("&", "&");//顺序不要改,这个必须是第一个转换  
            str=str.replace(">", ">");  
            str=str.replace("<", "<");  
            str=str.replace("'", "'");  
            str=str.replace("\"", "");  
            return str;  
        }  
//动态生成树形结构
  public static function flatArrayToXML(arr:Object,rootname:String=null,nodename:String=null, outputString:Boolean=false):Object{
            if (arr is Array){
               
            }else if ( arr is ArrayCollection){
                arr= ArrayCollection(arr).source;
            }else if (arr == null){
                return null;
            }
            if (rootname==null) rootname="root";
            var xmlstr:String="<"+rootname+" "+"label='套餐项目'>";
            var xmlList:XMLList=new XMLList();
            var alength:int=arr.length;
   if (alength > 0)
   {
    for (var i:int=0; i < alength; i++)
    {
      xmlstr+=objToSimpXML(arr[i].name,0,nodename,true);
      }
      xmlstr +="</"+nodename+">";
     }
    }
   }
            xmlstr+="</"+rootname+">";
   trace(xmlstr);
            var xmldoc:XMLDocument=new XMLDocument(xmlstr);
            if (outputString==true)
                return xmldoc==null ? "": xmldoc.toString();
            var xml:XML=new XML(xmldoc);
            return xml;
        }
       
        //将对象转换为简单xml.<node property1='value1'  property2='value2'/>这种形式
        //obj转换源对象,仅支持简单对象,如果对象的属性也是一个对象则不进入递归,
        //nodename可以自定义节点名称, 默认是"node"
        //是否输出为字符串, 默认转换为xml, 如果为true则将xml变为字符串
        //return 值类型根据outputString 来决定, 可能是XML,可能是String
        public static function objToSimpXML(ri_name:String,nodeorchild:int, nodename:String=null, outputString:Boolean=false):String{
            if(ri_name==null) return null;
            if (nodename==null)nodename="node";//节点名字
            var str:String="<"+nodename;
            str+=" label='"+filterXMLString(ri_name)+"'";节点中属性的名字
            nodeorchild == 1?str+="/>":str+=">";
//            var xmldoc:XMLDocument=new XMLDocument(str);
//            if (outputString==true) return xmldoc==null ? "": xmldoc.toString();
//            var xml:XML=new XML(xmldoc);
            return str;
        }
        //过滤xmlstring, 一些不安全字符需要转义, 比如 单双引号, 左右单箭头等
        public static function filterXMLString(str:String):String
        {
            if (str ==null) return "";
            str=str.replace("&", "&");//顺序不要改,这个必须是第一个转换
            str=str.replace(">", ">");
            str=str.replace("<", "<");
            str=str.replace("'", "'");
            str=str.replace("\"", "");
            return str;
        }
 

 

   在上面的代码中,只要将arraycollection数据源传入到flatArrayToXML方法就行了,如果要增加节点中的属性,只要在  str+=" label='"+filterXMLString(ri_name)+"'";的label 前面增加你想要的的属性名就行了,上面的“套餐项目”是顶级根节点。

  在这里要注意的是,比如说你的客户端组件时tree,那么你用这个方法来生成xml就很麻烦了,这个方法适用于比如你只有1个或者2个子节点的情况,如果有多个节点或者是传过来的数据量大的时候,建议在java后台使用递归方法来生成xml。

   下面还有个简单的arraycollection转化成xml的例子:

  view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>    
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12"  creationComplete="init()">    
    <mx:Style source="style/Smoke.css"/>    
    <mx:Script>    
        <!--[CDATA[    
         import mx.collections.ArrayCollection;         
         [Bindable]private var shijxml:XML;    
             
          private function init():void{    
            shijxml = arrToXml(exams);    
          }    
             
        [Bindable]    
        public var exams:ArrayCollection = new ArrayCollection(    
                [{sjtitle:"数据结构第一章", kemu:"数据结构",shijID:"sj000" ,num:"30"},     
                 {sjtitle:"数据结构第二章", kemu:"数据结构",shijID:"sj001" ,num:"30"},     
                {sjtitle:"组成原理第一章", kemu:"组成原理",shijID:"zc000" ,num:"50"},                        
                {sjtitle:"组成原理第二章", kemu:"组成原理",shijID:"zc001" ,num:"30"} ]);    
                      
         private function arrToXml(arr:ArrayCollection):XML{    
                var root:XML = new XML("<root/>");    
                for(var i:int = 0;i<arr.length;i++){    
                    var node:XML = new XML("<node/>");    
                    node.sjtitle = arr[i].sjtitle;    
                    node.kemu= arr[i].kemu;    
                    node.shijID= arr[i].shijID;    
                    node.num= arr[i].num;    
                    root.appendChild(node);    
                }    
                return root;    
            }    
            private function closeHandler(event:Event):void {    
               show.text="试卷标题: "+ ComboBox(event.target).selectedItem;    
               var  temp:String=String(ComboBox(event.target).selectedItem);    
               for each(var xml:XML in shijxml.node){    
                if(xml.sjtitle==temp){    
                    show.text="考试科目: "+xml.kemu+"\n"+"试卷题数: "+xml.num+"\n"+    
                    "试卷编号: "+xml.shijID;    
                }    
              }       
            }         
        ]]-->    
    </mx:Script>    
    <mx:Panel width="100%" height="100%" layout="absolute" >    
        <mx:DataGrid height="100%" width="50%" dataProvider="{exams}">    
        </mx:DataGrid>    
        <mx:ComboBox y="79" close="closeHandler(event);" dataProvider="{shijxml.node.sjtitle}" right="88"></mx:ComboBox>    
        <mx:Text y="111" id="show"  width="185" height="126" right="50"/>    
    </mx:Panel>    
</mx:Application>  
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12"  creationComplete="init()">
    <mx:Style source="style/Smoke.css"/>
    <mx:Script>
        <!--[CDATA[
         import mx.collections.ArrayCollection;      
         [Bindable]private var shijxml:XML;
          
          private function init():void{
            shijxml = arrToXml(exams);
          }
          
        [Bindable]
        public var exams:ArrayCollection = new ArrayCollection(
                [{sjtitle:"数据结构第一章", kemu:"数据结构",shijID:"sj000" ,num:"30"},  
                 {sjtitle:"数据结构第二章", kemu:"数据结构",shijID:"sj001" ,num:"30"},  
                {sjtitle:"组成原理第一章", kemu:"组成原理",shijID:"zc000" ,num:"50"},                     
                {sjtitle:"组成原理第二章", kemu:"组成原理",shijID:"zc001" ,num:"30"} ]);
                   
         private function arrToXml(arr:ArrayCollection):XML{
                var root:XML = new XML("<root/>");
                for(var i:int = 0;i<arr.length;i++){
                    var node:XML = new XML("<node/>");
                    node.sjtitle = arr[i].sjtitle;
                    node.kemu= arr[i].kemu;
                    node.shijID= arr[i].shijID;
                    node.num= arr[i].num;
                    root.appendChild(node);
                }
                return root;
            }
            private function closeHandler(event:Event):void {
               show.text="试卷标题: "+ ComboBox(event.target).selectedItem;
               var  temp:String=String(ComboBox(event.target).selectedItem);
               for each(var xml:XML in shijxml.node){
                if(xml.sjtitle==temp){
                    show.text="考试科目: "+xml.kemu+"\n"+"试卷题数: "+xml.num+"\n"+
                    "试卷编号: "+xml.shijID;
                }
              }    
            }      
        ]]-->
    </mx:Script>
    <mx:Panel width="100%" height="100%" layout="absolute" >
        <mx:DataGrid height="100%" width="50%" dataProvider="{exams}">
        </mx:DataGrid>
        <mx:ComboBox y="79" close="closeHandler(event);" dataProvider="{shijxml.node.sjtitle}" right="88"></mx:ComboBox>
        <mx:Text y="111" id="show"  width="185" height="126" right="50"/>
    </mx:Panel>
</mx:Application>

 

 

   2、xml转化为arraycollection,代码如下:

主程序代码:

view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>    
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">    
    <mx:Script>    
        <!--[CDATA[    
        import mx.collections.ArrayCollection;    
        import mx.rpc.events.ResultEvent;    
        import mx.utils.ObjectProxy;    
            
        [Bindable]    
        private var list:ArrayCollection=new ArrayCollection();    
            
        private function resultHandler(event:ResultEvent):void {            
            if(event.result.store.book is ObjectProxy){    
                list.removeAll();    
                list.addItem(event.result.store.book);    
            }    
            else    
                list=event.result.store.book;    
                    
            booksGrid.dataProvider=list;    
        }    
            
        ]]-->    
    </mx:Script>    
    <mx:HTTPService id="booksXML" url="data/book_store.xml" showBusyCursor="true" result="resultHandler(event)"/>    
         
    <mx:Button label="读取资料" click="this.booksXML.send()"/>    
    <mx:DataGrid id="booksGrid" width="600" height="400">    
        <mx:columns>    
            <mx:DataGridColumn headerText="编号" dataField="id" width="30"/>    
            <mx:DataGridColumn headerText="书名" dataField="bookname"/>    
            <mx:DataGridColumn headerText="分类" dataField="category" width="80"/>    
            <mx:DataGridColumn headerText="售价" dataField="sprice" width="60"/>    
            <mx:DataGridColumn headerText="特价" dataField="sale" width="60"/>    
        </mx:columns>    
    </mx:DataGrid>    
</mx:Application>    
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    <mx:Script>
        <!--[CDATA[
        import mx.collections.ArrayCollection;
        import mx.rpc.events.ResultEvent;
        import mx.utils.ObjectProxy;
         
        [Bindable]
        private var list:ArrayCollection=new ArrayCollection();
         
        private function resultHandler(event:ResultEvent):void {         
            if(event.result.store.book is ObjectProxy){
                list.removeAll();
                list.addItem(event.result.store.book);
            }
            else
                list=event.result.store.book;
                 
            booksGrid.dataProvider=list;
        }
         
        ]]-->
    </mx:Script>
    <mx:HTTPService id="booksXML" url="data/book_store.xml" showBusyCursor="true" result="resultHandler(event)"/>
      
    <mx:Button label="读取资料" click="this.booksXML.send()"/>
    <mx:DataGrid id="booksGrid" width="600" height="400">
        <mx:columns>
            <mx:DataGridColumn headerText="编号" dataField="id" width="30"/>
            <mx:DataGridColumn headerText="书名" dataField="bookname"/>
            <mx:DataGridColumn headerText="分类" dataField="category" width="80"/>
            <mx:DataGridColumn headerText="售价" dataField="sprice" width="60"/>
            <mx:DataGridColumn headerText="特价" dataField="sale" width="60"/>
        </mx:columns>
    </mx:DataGrid>
</mx:Application>  
 

     

 

data/book_store.xml:

view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>    
<store>    
  <store_title>我的书店</store_title>    
  <store_telephone>0411-12345678</store_telephone>    
  <store_address>大连市高新园区新华路60号</store_address>    
  <book id="1" category="Web 开发">    
    <bookname>Getting Start with Flex</bookname>    
    <sprice>49.9</sprice>    
    <sale>45.9</sale>    
  </book>    
</store>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值