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>