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; } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。