AS3将XML转成对象的类
发布时间:2020-12-15 23:41:57 所属栏目:百科 来源:网络整理
导读:完整代码下载 package com.rofine.util.reflection{import com.degrafa.geometry.utilities.ArcUtils;import com.rofine.util.reflection.*;import flash.utils.getDefinitionByName;import flash.utils.getQualifiedClassName;import mx.collections.ArrayC
完整代码下载 package com.rofine.util.reflection { import com.degrafa.geometry.utilities.ArcUtils; import com.rofine.util.reflection.*; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; import mx.collections.ArrayCollection; import mx.formatters.DateFormatter; import mx.utils.ObjectUtil; public class XMLConverter { private static var A_CLASS:String="mx.collections::Array"; private static var C_CLASS:String="mx.collections::ArrayCollection"; private static var O_CLASS:String="Object"; private static var classinfos:Object=new Object(); private static var baseTypes:Array=["String","int","Number","uint","Boolean","Date"]; private static function ToObject(xml:Object,type:String,mapping:Object=null):Object { if(xml!=null) { switch(type) { case "String": return xml.toString(); break; case "int": case "Number": case "uint": return Number(xml.toString()); break; case "Boolean": return Boolean(xml.toString());break; case "Date":return DateFormatter.parseDateString(xml.toString()); break; default:break; } var cls:Class = flash.utils.getDefinitionByName(type) as Class; return fromXMLToObject(xml,cls,mapping); } return null; } ///获取需要赋值反射类型属性和变量 private static function getAttrinfos(cls:Class):Array { var className:String=getQualifiedClassName(cls); if(classinfos[className]==null) { var classInfo:ClassInfo=new ClassInfo(cls); var attrs:Array=new Array(); for each(var propertyInfo:PropertyInfo in classInfo.properties) { if(propertyInfo.access==PropertyInfo.ACCESS_READWRITE || propertyInfo.access==PropertyInfo.ACCESS_WRITEONLY) { attrs.push(new VariableInfo(propertyInfo.name,propertyInfo.type)); } } for each(var varinfo:VariableInfo in classInfo.variables) { attrs.push(new VariableInfo(varinfo.name,varinfo.type)); } classinfos[className]=attrs; } return classinfos[className] as Array; } private static function getAttrObject(xml:XML,attr:VariableInfo,mapping:Object):Object { if(baseTypes.indexOf(attr.type)==-1) { if(mapping!=null) { var isObj:Boolean=attr.type==O_CLASS; if(isObj || attr.type==A_CLASS || attr.type==C_CLASS) { if(xml[attr.name]!=null && xml[attr.name][0]!=null) { var children:XMLList=xml[attr.name][0].children(); var list:ArrayCollection= new ArrayCollection(); var atteObj:Object=new Object(); for each(var child:XML in children) { var name:String=child.name().localName; var obj:Object=fromXMLToObject(child,mapping[name] as Class,mapping); if(obj!=null) { if(isObj) { atteObj[name]=obj; } else { list.addItem(obj); } } } } if(isObj) { return atteObj; } else { return attr.type==A_CLASS?list.toArray():list; } } } } else { var value:Object=ToObject(xml[attr.name],attr.type); value=(value==null?ToObject(xml.@[attr.name],attr.type):value); return value; } return null; } ///通过XML对象或者XMLList对象返回对象 public static function fromXMLToObject(xml:*,cls:Class,mapping:Object=null):Object { var xmlList:XMLList=xml is XML?XMLList(xml):XMLList((xml as XMLList)[0]); if(xmlList.length()==0 || cls==null) return null; var list:ArrayCollection=fromXMLToList(xmlList,mapping); return list.length==0?null:list[0]; } ///通过XMLList返回ArrayCollection对象 public static function fromXMLToList(xmlList:XMLList,mapping:Object=null):ArrayCollection { if(xmlList==null) return null; if(xmlList.length()==0) return null; if(cls==null) return null; var list:ArrayCollection=new ArrayCollection(); var attrs:Array=getAttrinfos(cls); for each (var xml : XML in xmlList) { var obj:Object=new cls(); for each(var attr:VariableInfo in attrs) { obj[attr.name]=getAttrObject(xml,attr,mapping); } list.addItem(obj); } return list; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |