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;
}
}
}
09-11
09-11
09-11