zoukankan      html  css  js  c++  java
  • 直接解析xml转换为object对象

    平时做游戏开发的时候,很大程度上都会采用xml来做配置文件。有时候需要写很多,然后又需要依次去解析。如果有一个工具来自动解析每一个xml,并且提取出自己需要的数据,多好呀。所以偷了个懒,写了一个解析一定格式的xml和解析类,把这个格式丢给策划自己去调整数据啦。同时自己这边只需要接受现成的类

    注意,这里的指的类,一般是自定义的数据结构(类似javaBean,使用的都是属性值)。这样通过访问有数据类型定义的类,比直接访问xml的属性来得方便多了,而且也省了数据类型的转换的麻烦

    (当然,这里只是开了个头,需要做好的地方还有很多,也包括其他的文件,例如csv等)

    先看一下程序:

    [javascript] view plaincopy
     
    1. package  
    2. {  
    3.     import flash.display.Sprite;  
    4.     import flash.system.ApplicationDomain;  
    5.       
    6.     import org.sujun.utils.XMLUtils;  
    7.       
    8.     import test.TestBean;  
    9.     import test.TwoBean;  
    10.       
    11.     public class TestXML extends Sprite  
    12.     {  
    13.         //反射需要用到,所以必须先声明  
    14.         private var testBean        :TestBean;  
    15.         private var twoBean         :TwoBean;  
    16.           
    17.         //xml文件。这里为了方便,直接写在代码里,实际可以从外部加载  
    18.         private var xml             :XML =   
    19.             <testBean type="class" path="test.TestBean">  
    20.                 <!-- 注意,字符串,数值类型是可以不设置type的 -->  
    21.                 <attribute name="name" value="sodaChen" />  
    22.                 <attribute name="age" value="18" />  
    23.                 <attribute name="flag" type="Boolean" value="true" />  
    24.                 <!-- 数组内容描述 -->  
    25.                 <attribute name="urls" type="array" >  
    26.                     <attribute type="int" value="18" />  
    27.                     <attribute type="string" value="soda" />  
    28.                     <!-- 数组里包含一个对象 -->  
    29.                     <attribute type="class" value="test.TwoBean" >  
    30.                         <attribute name="name" value="www.sujun.org" />  
    31.                         <attribute name="has" value="true" />  
    32.                     </attribute>  
    33.                 </attribute>  
    34.                 <attribute name="twoBean" type="class" value="test.TwoBean" >  
    35.                         <attribute name="name" type="string" value="http://blog.csdn.net/sujun10" />  
    36.                         <attribute name="has" type="Boolean" value="true" />  
    37.                 </attribute>  
    38.             </testBean>  
    39.           
    40.         public function TestXML()  
    41.         {  
    42.             //调用XMLUtils类来解析,直接把XML格式数据转换成自己的类,然后输出数据检验结果  
    43.             var myBean:TestBean = XMLUtils.xmlToObject(xml,ApplicationDomain.currentDomain);  
    44.             trace("myBean.name:" + myBean.name);  
    45.             trace("myBean.flag:" + myBean.flag);  
    46.             trace("myBean.urls:" + myBean.urls);  
    47.             trace("myBean.urls[2].name:" + myBean.urls[2].name);  
    48.             trace("myBean.twoBean.name:" + myBean.twoBean.name);  
    49.         }  
    50.     }  
    51. }  

    输出结果是:

    myBean.name:sodaChen
    myBean.flag:true
    myBean.urls:18,soda,[object TwoBean]
    myBean.urls[2].name:www.sujun.org
    myBean.twoBean.name:http://blog.csdn.net/sujun10

    看到结果之后,XMLUtils这个类做的事也很简单,就是一步一步分析xml,然后根据类型进行数据格式的转换,特别处理数组和自定义对象。

    当然,其实这里可以完善的地方还是非常多。例如可以使用简单的xml属性,更好排列格式等

    再简单地看看解析xml的类吧

    [javascript] view plaincopy
     
    1. package org.sujun.utils  
    2. {  
    3.     import flash.system.ApplicationDomain;  
    4.       
    5.     /** 
    6.      * XML的相关工具  
    7.      * @author SodaChen 
    8.      *  
    9.      */   
    10.     public class XMLUtils  
    11.     {  
    12.           
    13.         public function XMLUtils()  
    14.         {  
    15.         }  
    16.         /** 
    17.          * 根据XML转换成对象,并填充对应的值  
    18.          * @param xml:描述对应数值的XML对象 
    19.          * @return 返回成功填充数据的对象 
    20.          *  
    21.          */       
    22.         public static function xmlToObject(xml:XML,domain:ApplicationDomain):*  
    23.         {  
    24.             //生成实例,根据类路径反射出类  
    25.             var obj:* = referenceObject(xml.@path,null,domain);  
    26.             //填充属性  
    27.             fillAttribute(obj,xml.attribute,domain);  
    28.             return obj;  
    29.         }  
    30.         /** 
    31.          * 根据XMLList的内容填充具体的数据  
    32.          * @param obj: 
    33.          * @param propertys: 
    34.          *  
    35.          */       
    36.         public static function fillAttribute(obj:*,attributes:XMLList,domain:ApplicationDomain):void  
    37.         {  
    38.             for each(var xml:XML in attributes)  
    39.             {  
    40.                 if(xml.@type.toString() == "")  
    41.                 {  
    42.                     //没有填写tpye属性的有限处理,必须是基本数据  
    43.                     obj[xml.@name.toString()] = xml.@value;  
    44.                 }  
    45.                 else if(xml.@type.toString() == "array")  
    46.                 {  
    47.                     obj[xml.@name.toString()] = fillArrayValue(xml,domain);  
    48.                 }  
    49.                 else if(xml.@type.toString() == "class")  
    50.                 {  
    51.                     var tempObj:* = referenceObject(xml.@value,null,domain);  
    52.                     obj[xml.@name.toString()] = tempObj;  
    53.                     //递归  
    54.                     fillAttribute(tempObj,xml.attribute,domain);  
    55.                 }  
    56.                 else if(xml.@type.toString() == "boolean")  
    57.                 {  
    58.                     if(xml.@value.toString() == "true")  
    59.                     {  
    60.                         obj[xml.@name.toString()] = true;  
    61.                     }  
    62.                     else  
    63.                     {  
    64.                         obj[xml.@name.toString()] = false;  
    65.                     }  
    66.                 }  
    67.                 else  
    68.                 {  
    69.                     obj[xml.@name.toString()] = xml.@value;  
    70.                 }  
    71.             }  
    72.         }  
    73.         /** 
    74.          * 填充数组的xml数据  
    75.          * @param arrayXML:描述数组数据结构的xml对象 
    76.          *  
    77.          */       
    78.         public static function fillArrayValue(arrayXML:XML,domain:ApplicationDomain):Array  
    79.         {  
    80.             var tempAry:Array = new Array();  
    81.             for each(var ary:XML in arrayXML.attribute)  
    82.             {  
    83.                 if(ary.@type.toString() == "class")  
    84.                 {  
    85.                     var arrayObj:* = referenceObject(ary.@value,null,domain);  
    86.                     tempAry.push(arrayObj);  
    87.                     //递归  
    88.                     fillAttribute(arrayObj,ary.attribute,domain);  
    89.                 }  
    90.                 else if(ary.@type.toString() == "array")  
    91.                 {  
    92.                     tempAry.push(fillArrayValue(ary,domain));  
    93.                 }  
    94.                 else if(ary.@type.toString() == "boolean")  
    95.                 {  
    96.                     tempAry.push(Boolean(ary.@value));  
    97.                 }  
    98.                 else if(ary.@type.toString() == "int")  
    99.                 {  
    100.                     tempAry.push(int(ary.@value));  
    101.                 }  
    102.                 else if(ary.@type.toString() == "number")  
    103.                 {  
    104.                     tempAry.push(Number(ary.@value));  
    105.                 }  
    106.                 else if(ary.@type.toString() == "unit")  
    107.                 {  
    108.                     tempAry.push(uint(ary.@value));  
    109.                 }  
    110.                 else  
    111.                 {  
    112.                     tempAry.push(String(ary.@value));  
    113.                 }  
    114.             }  
    115.             return tempAry;  
    116.         }  
    117.         /** 
    118.          * 根据名称创建一个实例,允许传递参数 
    119.          * @param name:类全路径 
    120.          * @param args:参数,只一个参数 
    121.          * @param domain:所在的域 
    122.          * @return *:返回实例 
    123.          * 该方法可能会抛出ReferenceError异常,但不需要显式捕捉 
    124.          */  
    125.         public static function referenceObject(name:String,args:Object = null,domain:ApplicationDomain = null):*  
    126.         {  
    127.             var cl:Class = null;  
    128.             //判断域是否为空   
    129.             if(domain != null)  
    130.             {  
    131.                 cl = domain.getDefinition(name) as Class;  
    132.             }  
    133.             else  
    134.             {  
    135.                 cl = ApplicationDomain.currentDomain.getDefinition(name) as Class;  
    136.             }  
    137.             if(args != null)  
    138.             {  
    139.                 return new cl(args);  
    140.             }  
    141.             return new cl();  
    142.         }  
    143.     }  
    144. }  
  • 相关阅读:
    RatProxy
    Jacob
    系统二级运维之业务单据错误处理
    材料的构成 —— 塑料
    作文 —— 诙谐、幽默、调侃、批判
    作文 —— 诙谐、幽默、调侃、批判
    (中英)作文 —— 标题与小标题
    公司的组成
    公司的组成
    数据结构的时间复杂度与空间复杂度、及相关证明
  • 原文地址:https://www.cnblogs.com/regalys168/p/4092395.html
Copyright © 2011-2022 走看看