http://bbs.9ria.com/viewthread.php?tid=63697&extra=page%3D3%26amp;orderby%3Drecommends%26amp;filter%3Drecommend
在一部分AS3项目中XML是我们经常使用的一种保存数据的手段,我们经常用XML来保存一些数据或者一些参数的设置。使用FLEX的朋友更是对MXML这个XML的加强定制版非常熟悉。那么在编写代码的时候我们就不得不经常写一些解析XML内容的代码。今天我要讲的有个小技巧也是刚整理出来的一种命名空间来方便解析XML的方法。有朋友已经从LEX的MXML中领悟到这种使用方法的话请勿见笑。
一、复杂类型变量值的转换
在XML中我们都知道在用AS3的XML类读取进来后,其各种值基本都是以String的形式存在的。所以在想存放一些比如数组或者在制作UI的时候的一些复合属性时我们需要对这些字符串进行加工以便转换成AS3的其他变量类型。比如下面的一个XML:
<object>
<id>1000</id>
<name>test</name>
<childIdList>23,23,523,5,235,23,52,35,235,235,4646</childIdList>
</ object >
复制代码
在内部我们要把XML转换数据到myClass类中的具体属性的话可能会写以下形式的函数 :
首先是myClass类:
package{
public class myClass{
public var id:int;
public var name:String;
public var childIdList:Array = new Array;
public function myClass(){
}
}
}
第一种写法:
public function buildObjectByXML(data:XML):void{
var myObject:myClass = new myClass;
myObject.id = data.id as int;
myObject.name = data.name as String;
myObject.childIdList = data.childIdList.split(“,”);
}
第二种写法:
function buildObjectByXML(data:XML):void {
var myObject:myClass = new myClass;
var nodeList:XMLList = data.children();
for each (var node:XML in nodeList) {
var valueName:String = node.localName();
if(!myObject.hasOwnProperty(valueName)) continue;
if (valueName == "childIdList") {
myObject[valueName] = node.toString().split(",");
} else {
myObject[valueName] = node.toString();
}
}
}
其中第一种写法就是人肉所有属性然后具体区别对待如何转换,第二种则是遍历XML中的元素然后用if条件来筛选后再进行具体区别和转换。两者所有的转换过程和算法都集中在buildObjectByXML函数中,其缺点就是万一需要设置的XML中属性复杂变量繁多的话阅读性就直线下降,比如我们在写XML配置的UI组件的时候就经常会碰到这样的情况。碰到这样的状况如果后期变量比较固定少做修改还好,如果要频繁修改的话我们就不得不经常面对一个非常长的而且复杂难读的buildObjectByXML函数。
那么如何使用命名空间来优化这一结构呢?首先,XML本身也拥有命名空间(详细请阅读AS3帮助)。第二命名空间不同的情况下可以使用同名函数或者变量。集合以上两个特点我们可以把上面的XML以及myClass改造成如下形式:
首先是XML:
<object xmlns:xmlSet=”http://www.aslii.com/xmlSet”>
<id>1000</id>
<name>test</name>
<xmlSet:childIdList>23,23,523,5,235,23,52,35,235,235,4646</ xmlSet:childIdList>
</ object >
然后是myClass类:
package{
public class myClass{
public namespace xmlSet = http://www.aslii.com/xmlSet;
public var id:int;
public var name:String;
public var childIdList:Array = new Array;
public function myClass(){
}
xmlSet function set childIdList(dataString:String):void{
this.childIdList = dataString.split(“,”);
}
}
}
最后是我们的buildObjectByXML函数:
function buildObjectByXML(data:XML):void {
var myObject:myClass = new myClass;
var nodeList:XMLList = data.children();
for each (var node:XML in nodeList) {
var valueName:String = node.localName();
var ns:Namespace = node.namespace();
if(myObject.hasOwnProperty(valueName)) {
myObject.ns::[valueName] = node.toString();
}
}
}
从中我们可以看到,具体转换类型的代码被移到了具体的类中以一个固定的命名空间以及和属性相同的名字存在。而且这么写如果后期有添加删除属性只需要在具体类中添加对应的方法和变量即可,buildObjectByXML函数就无须再做任何改动了。如果转换的时候算法有所改变我们也可以很轻松的很有针对性的去对象类中找到对应函数名的set函数。
二、用命名空间+XML来组建自己的组件配置文件。
这部分写UI的朋友应该会有兴趣,其实内容也基本是仿造MXML的做法。细心的朋友可能早已发现FLEX的MXML的结构其实非常频繁的使用了XML的命名空间系统,但是其MXML只能用在编写阶段,最后被编译成了SWF。在被编译成SWF之后我们就无法再使用MXML了。其利用XML命名空间来转换成实例的过程被固化在FLEX编辑器中而不是SWF动态编译,所以那部分转换代码我们无法看到他是咋写的。其实其原理和上面利用命名空间来指定特定命名空间的set函数一样,我们只需要在解析XML的时候把命名空间指定的函数内算法和创建元件关联起来即可。而具体写法其实就是写一套顶级的命名空间函数。
比如,我要写一套lii组件,需要通过XML来配置界面。那么可以如下简单实现:
首先是XML:
<root xmlns:lii="http://www.aslii.com/liiUI">
<lii:Button id="xx" x="0" y="0" width="232" height="333"/>
</root>
然后是一个默认默认包的顶级类:
package{
public class LiiUIManager{
public static const core:LiiUIManager = new LiiUIManager();
public namespace lii = "http://www.aslii.com/liiUI";
public var uiList:Array = new Array;
public var length:int;
public function LiiUIManager(){
}
lii static function set Button(data:XML):void{
trace("[ new lii::Button ]");
core.uiList[length] = new myButton();
core.length += 1;
//以下用XML解析转换属性代码并且进行详细构造,这里就不写了。
}
public static function buildUI(data:XML):void{
var nodeList:XMLList = data.children();
for each (var node:XML in nodeList) {
var valueName:String = node.localName();
var ns:Namespace = node.namespace();
LiiUIManager.ns::[valueName] = node;
}
}
}
}
最后是执行解析:
LiiUIManager.buildUI(xml);
复制代码
而且我们可以把它们写成可以动态编译的实时解析与构造而不像FLEX那样必须经过编辑器编译构造。这只是个小小的例子,具体的大家可以尽情发挥自己的想像力与创造力。FLEX的MXML并不神秘就是如此简单,我们也可以拥有。
分享到:
相关推荐
【标题】:“[转] [Lii]3D翻页的一种制作方法” 这篇博客主要讨论的是如何实现一种3D翻页效果,这种效果通常在电子书或者数字展示中被广泛应用,为用户带来更加生动和真实的交互体验。在AS3(ActionScript 3)环境...
《Liitokala Lii-500S俄罗斯用户手册》是针对Liitokala Lii-500S充电器的专业指南,旨在帮助俄语使用者更好地理解和操作这款设备。Liitokala是一家知名的电池充电器制造商,其产品以其高质量和易用性著称。Lii-500S...
标题中的“自制中文字库嵌入——单色图形面积压缩/加密法”涉及到的是一个关于汉字字库处理的技术,特别是如何有效地压缩和保护字库数据的方法。在IT领域,字库是计算机显示或打印文字的基础,尤其是对于中文系统,...
7. **第三方库和自定义视图**:项目中包含`DIYView.zip`,可能表示开发者使用了自定义视图来实现特定的UI效果。自定义视图允许开发者扩展Android的标准视图组件,以满足项目的独特需求。 8. **版本控制与打包**:...
LiCl-LiH-LiI体系的热力学优化,郭翠萍,杜振民,本文利用Calphad技术优化了LiCl-LiH,LiH-LiI,LiCl-LiH以及LiCl-LiH-LiI 体系。液相利用亚点阵模型处理成(Li+)(Cl-,H-,I-),三个终端相LiCl,LiH,LiI具
l-曲线矩阵代码LII信号的模块化分析(wat-lii) 注意:此代码仍在构建中,应视为实验性代码。 滑铁卢大学开发的模块化程序,用于建模和分析时间分辨的激光诱导白炽灯(TiRe-LII)信号。 该程序旨在模拟来自各种材料...
此工具是自己闲时制作,使用方便使用,无任何广告植入,欢迎使用! 自定义字符集,批量随机生成密码(口令),可选择大写英文字母(A-Z)、小写英文字母(a-z)、数字(0-9)、特殊字符(如:~!@#$%^&*()_-+={}[]\/...
6. 阴离子半径与阳离子半径之比最大,意味着阴离子半径大而阳离子半径小,这通常发生在高电荷和小原子半径的阳离子与低电荷和大原子半径的阴离子之间,因此LiI的比例可能是最大的。 7. 两种元素原子的核外电子层数...
这个压缩包文件“Android应用源码之猜拳游戏.zip”主要包含了一个Android平台上的猜拳游戏的源代码。从提供的文件列表来看,我们可以推测出以下几个关键知识点: 1. **Android应用开发**:这个项目显然是使用...
lii.ink-AngularJS Lii.ink 分享网站类似于 HackerNews/reddit #WTF AngularJS 实现 lii.ink 项目,最初使用 php 开发。 基于网络上的各种教程。 #ToDo 几乎所有事情。
本练习题涵盖了化学原理中的多个重要概念,主要涉及温度单位转换、原子核组成、同位素与平均原子质量、化学反应计算、化合物的分类和命名、酸的命名以及浓度计算等内容。下面将对这些知识点进行详细解析。 1. 温度...
- 使用XML布局文件来设计游戏界面,可能包含按钮、图片视图等组件,用于显示游戏元素和接收用户输入。 - 布局管理器如LinearLayout、RelativeLayout或ConstraintLayout将用于组织这些元素,以达到美观且响应式的...
这段代码主要用于从视频中检测烟雾区域,通过提取烟雾与背景之间的色彩差异和形状差异来实现。 ### 一、视频读取与帧提取 #### 1.1 视频基本信息获取 - `tic;`:计时器开始计时。 - `clearall; closeall; clc;`:...
TiRe-LII 通量曲线的 Matlab 工具 这构成了一个软件包,演示了与 . 所包含的函数评估为:(1) 计算给定材料组的过渡或参考通量和温度,以及 (2) 评估通量曲线本身,以 J/cm 2为单位的无量纲值或通量和以开尔文为单位...
- **软件兼容性**:确保所使用的软件版本与操作系统兼容,避免因兼容性问题导致文件损坏或转换失败。 - **参数调整**:在转换过程中,合理调整参数是关键。不合适的参数可能导致最终的CNC加工效果不佳。 - **文件...
这是一个软件包,最初与一起分发,该软件包评估光信号的一般误差模型,包括泊松-高斯噪声和重复观测之间(例如,两次激光照射之间)测量条件的变化。 特别关注的是时间分辨的激光诱导(TiRe-LII)和逐次变化的量,...
锂离子半径小于碘离子半径,使得LiI中阴离子半径与阳离子半径之比最大。 7. 氧化还原反应:选项B正确。等量的氧化剂中,MnO4-得到电子最多,因此生成I2最多。 8. 离子方程式配平:根据氧化还原反应守恒和电荷守恒...
1. 初始化:创建存储L和U矩阵的二维数组,以及用于存放临时结果的工作空间。 2. 主循环:遍历矩阵的行,对于每一行i,进行以下操作: - 计算L矩阵的(i,i)元素,即Lii = 1/Aii。 - 更新U矩阵的第i行,使得Ui,j = ...