写了个XML结构体转OBJ的功能

在AS3里用Lua的性能太低了, 即使每条配置数据只要1毫秒, 但随便一套任务或状态就有几千条数据, 加载的进度条就要跑开好几秒。 实在不能耐,只好把配置数据改用XML写,再转到AS3保存,忍痛牺牲Lua的脚本功能(自动生成配置表和相关小功能用不了了)。

另外补充一句, Altova XMLSpy这个XML编辑工具相当好用。 特别是其网格模式下的自动合并相关参成列表的功能, 做得相当漂亮。

		public function XML2OBJ( _xml:XML ):Object
		{
			var ret = new Object();
			
			//设置属性
			var pars:XMLList = _xml.attributes();
			for each( var par:XML in pars )
			{
				ret[par.name().toString()]= par.toString();
			}
			
			//设置集合
			var table:XMLList = _xml.children();
			if( table.length() > 0 )
			{
				for each( var item:XML in table ) 
				{
					var sub_ret:Object = XML2OBJ(item);
					var tmp:Object = ret[ item.name() ];
					if( null == tmp )
					{
						ret[ item.name() ] = sub_ret;
					}
					else if(tmp is Array)
					{
						(tmp as Array).push( sub_ret );
					}
					else
					{
						ret[ item.name() ] = new Array(tmp,sub_ret);
					}
				}
			}
			return ret;
		}


/**
		 * xml转obj
		 */	
		public function XML2OBJ( _xml:XML ):Object
		{
			var ret:Object = new Object();
			
			//设置属性
			var pars:XMLList = _xml.attributes();
			for each( var par:XML in pars )
			{
				par.prettyPrinting=false;
				var val:String = par.toString();
				val = val.split("\r\n").join("\r"); //flash会因为换行符的定义不同导致出现两次换行
				if( "\"" == val.charAt() )
				{
					ret[par.name().toString()]= val.substr(1,val.length-2);
				}
				else if( "" != val && val is String)
				{
					ret[par.name().toString()]= Number( val );
				}
				else
				{
					ret[par.name().toString()]= val;
				}
			}
			
			//设置集合
			var table:XMLList = _xml.children();
			if( table.length() > 0 )
			{
				for each( var item:XML in table ) 
				{
					var name:String = item.name();
					var item_type:String = name.substr(0,4);
					var sub_ret:Object = XML2OBJ(item);
					var tmp:Object = ret[ name ];
					if( null == tmp && null == sub_ret.TAB_ID && "ARY_" != item_type )
					{
						ret[ name ] = sub_ret;
					}
					else
					{
						//调整原结构
						if( null == tmp )
						{
							ret[ name ] = new Array();
						}
						else if( !(tmp is Array) )
						{
							ret[ name ] = new Array(tmp);
						}
						//添加新数
						if( null == sub_ret.TAB_ID )
						{
							ret[ name ].push( sub_ret );
						}
						else
						{
							ret[ name ][sub_ret.TAB_ID] = sub_ret;
						}
					}
				}
			}
			return ret;
		}



/**
* * 替换字符串中特殊字符
* */
public function txt2xml( _txt:String ):String
{
if (_txt == null)
{
return "";
}
var txt:String = _txt;
var reg:RegExp = null;
reg = /&/g;
txt = txt.replace(reg, "&");
reg = /</g;
txt = txt.replace(reg, "&lt;");
reg = />/g;
txt = txt.replace(reg, "&gt;");
reg = /\"/g;
txt = txt.replace(reg, "&quot;");
return txt;
}

/**
* * 还原字符串中特殊字符
* */
public function xml2txt( _txt:String ):String
{
if (_txt == null)
{
return "";
}
var txt:String = _txt;
var reg:RegExp = null;
reg = /&lt;/g;
txt = txt.replace("&lt;", "<");
reg = /&gt;/g;
txt = txt.replace("&gt;", ">");
reg = /&quot;/g;
txt = txt.replace("&quot;", "\"");
reg = /&amp;/g;
txt = txt.replace("&amp;", "&");
return txt;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值