AS3将XML转成对象的类

来源:互联网 发布:知乎男朋友不提前女友 编辑:程序博客网 时间:2024/05/05 06:59

完整代码下载 

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,cls,mapping);return list.length==0?null:list[0];}///通过XMLList返回ArrayCollection对象public static function fromXMLToList(xmlList:XMLList,cls:Class,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;}}}