1、arraycollection轉化為xml,代碼如下:
//動態產生樹形結構<br /> public static function flatArrayToXML(arr:Object,rootname:String=null,nodename:String=null, outputString:Boolean=false):Object{<br /> if (arr is Array){</p><p> }else if ( arr is ArrayCollection){<br /> arr= ArrayCollection(arr).source;<br /> }else if (arr == null){<br /> return null;<br /> }<br /> if (rootname==null) rootname="root";<br /> var xmlstr:String="<"+rootname+" "+"label='套餐項目'>";<br /> var xmlList:XMLList=new XMLList();<br /> var alength:int=arr.length;<br /> if (alength > 0)<br /> {<br /> for (var i:int=0; i < alength; i++)<br /> {<br /> xmlstr+=objToSimpXML(arr[i].name,0,nodename,true);<br /> }<br /> xmlstr +="</"+nodename+">";<br /> }<br /> }<br /> }<br /> xmlstr+="</"+rootname+">";<br /> trace(xmlstr);<br /> var xmldoc:XMLDocument=new XMLDocument(xmlstr);<br /> if (outputString==true)<br /> return xmldoc==null ? "": xmldoc.toString();<br /> var xml:XML=new XML(xmldoc);<br /> return xml;<br /> }</p><p> //將對象轉換為簡單xml.<node property1='value1' property2='value2'/>這種形式<br /> //obj轉換來源物件,僅支援簡單對象,如果對象的屬性也是一個對象則不進入遞迴,<br /> //nodename可以自訂節點名稱, 預設是"node"<br /> //是否輸出為字串, 預設轉換為xml, 如果為true則將xml變為字串<br /> //return 實值型別根據outputString 來決定, 可能是XML,可能是String<br /> public static function objToSimpXML(ri_name:String,nodeorchild:int, nodename:String=null, outputString:Boolean=false):String{<br /> if(ri_name==null) return null;<br /> if (nodename==null)nodename="node";//節點名字<br /> var str:String="<"+nodename;<br /> str+=" label='"+filterXMLString(ri_name)+"'";節點中屬性的名字<br /> nodeorchild == 1?str+="/>":str+=">";<br />// var xmldoc:XMLDocument=new XMLDocument(str);<br />// if (outputString==true) return xmldoc==null ? "": xmldoc.toString();<br />// var xml:XML=new XML(xmldoc);<br /> return str;<br /> }<br /> //過濾xmlstring, 一些Unsafe 字元需要轉義, 比如 單雙引號, 左右單箭頭等<br /> public static function filterXMLString(str:String):String<br /> {<br /> if (str ==null) return "";<br /> str=str.replace("&", "&");//順序不要改,這個必須是第一個轉換<br /> str=str.replace(">", ">");<br /> str=str.replace("<", "<");<br /> str=str.replace("'", "'");<br /> str=str.replace("/"", "");<br /> return str;<br /> }<br />
在上面的代碼中,只要將arraycollection資料來源傳入到flatArrayToXML方法就行了,如果要增加節點中的屬性,只要在 str+=" label='"+filterXMLString(ri_name)+"'";的label 前面增加你想要的的屬性名稱就行了,上面的“套餐項目”是頂級根節點。
在這裡要注意的是,比如說你的用戶端組件時tree,那麼你用這個方法來產生xml就很麻煩了,這個方法適用於比如你只有1個或者2個子節點的情況,如果有多個節點或者是傳過來的資料量大的時候,建議在java後台使用遞迴方法來產生xml。
下面還有個簡單的arraycollection轉化成xml的例子:
<?xml version="1.0" encoding="utf-8"?><br /><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" creationComplete="init()"><br /> <mx:Style source="style/Smoke.css"/><br /> <mx:Script><br /> <!--[CDATA[<br /> import mx.collections.ArrayCollection;<br /> [Bindable]private var shijxml:XML; </p><p> private function init():void{<br /> shijxml = arrToXml(exams);<br /> } </p><p> [Bindable]<br /> public var exams:ArrayCollection = new ArrayCollection(<br /> [{sjtitle:"資料結構第一章", kemu:"資料結構",shijID:"sj000" ,num:"30"},<br /> {sjtitle:"資料結構第二章", kemu:"資料結構",shijID:"sj001" ,num:"30"},<br /> {sjtitle:"組成原理第一章", kemu:"組成原理",shijID:"zc000" ,num:"50"},<br /> {sjtitle:"組成原理第二章", kemu:"組成原理",shijID:"zc001" ,num:"30"} ]); </p><p> private function arrToXml(arr:ArrayCollection):XML{<br /> var root:XML = new XML("<root/>");<br /> for(var i:int = 0;i<arr.length;i++){<br /> var node:XML = new XML("<node/>");<br /> node.sjtitle = arr[i].sjtitle;<br /> node.kemu= arr[i].kemu;<br /> node.shijID= arr[i].shijID;<br /> node.num= arr[i].num;<br /> root.appendChild(node);<br /> }<br /> return root;<br /> }<br /> private function closeHandler(event:Event):void {<br /> show.text="試卷標題: "+ ComboBox(event.target).selectedItem;<br /> var temp:String=String(ComboBox(event.target).selectedItem);<br /> for each(var xml:XML in shijxml.node){<br /> if(xml.sjtitle==temp){<br /> show.text="考試科目: "+xml.kemu+"/n"+"試卷題數: "+xml.num+"/n"+<br /> "試卷編號: "+xml.shijID;<br /> }<br /> }<br /> }<br /> ]]--><br /> </mx:Script><br /> <mx:Panel width="100%" height="100%" layout="absolute" ><br /> <mx:DataGrid height="100%" width="50%" dataProvider="{exams}"><br /> </mx:DataGrid><br /> <mx:ComboBox y="79" close="closeHandler(event);" dataProvider="{shijxml.node.sjtitle}" right="88"></mx:ComboBox><br /> <mx:Text y="111" id="show" width="185" height="126" right="50"/><br /> </mx:Panel><br /></mx:Application>
2、xml轉化為arraycollection,代碼如下:
主程式碼:
<?xml version="1.0" encoding="utf-8"?><br /><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"><br /> <mx:Script><br /> <!--[CDATA[<br /> import mx.collections.ArrayCollection;<br /> import mx.rpc.events.ResultEvent;<br /> import mx.utils.ObjectProxy; </p><p> [Bindable]<br /> private var list:ArrayCollection=new ArrayCollection(); </p><p> private function resultHandler(event:ResultEvent):void {<br /> if(event.result.store.book is ObjectProxy){<br /> list.removeAll();<br /> list.addItem(event.result.store.book);<br /> }<br /> else<br /> list=event.result.store.book; </p><p> booksGrid.dataProvider=list;<br /> } </p><p> ]]--><br /> </mx:Script><br /> <mx:HTTPService id="booksXML" url="data/book_store.xml" showBusyCursor="true" result="resultHandler(event)"/> </p><p> <mx:Button label="讀取資料" click="this.booksXML.send()"/><br /> <mx:DataGrid id="booksGrid" width="600" height="400"><br /> <mx:columns><br /> <mx:DataGridColumn headerText="編號" dataField="id" width="30"/><br /> <mx:DataGridColumn headerText="書名" dataField="bookname"/><br /> <mx:DataGridColumn headerText="分類" dataField="category" width="80"/><br /> <mx:DataGridColumn headerText="售價" dataField="sprice" width="60"/><br /> <mx:DataGridColumn headerText="特價" dataField="sale" width="60"/><br /> </mx:columns><br /> </mx:DataGrid><br /></mx:Application><br />
data/book_store.xml:
<?xml version="1.0" encoding="utf-8"?><br /><store><br /> <store_title>我的書店</store_title><br /> <store_telephone>0411-12345678</store_telephone><br /> <store_address>大連市高新園區新華路60號</store_address><br /> <book id="1" category="Web 開發"><br /> <bookname>Getting Start with Flex</bookname><br /> <sprice>49.9</sprice><br /> <sale>45.9</sale><br /> </book><br /></store>