`

[转]自定义命名空间使用技巧之——命名空间与XML

阅读更多





  在一部分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并不神秘就是如此简单,我们也可以拥有。
分享到:
评论

相关推荐

    spring 自定义xml标签

    3. **注册自定义标签**:在Spring的XML配置文件中,你需要声明自定义命名空间,例如`&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"&gt;`。...

    xml——————表单资源

    XML还支持命名空间(Namespaces),这是一个重要的特性,它允许在同一文档中使用来自不同来源的标签而不产生冲突。例如,`xmlns`属性可以定义一个命名空间,`xmlns:prefix="URI"`,其中`prefix`是别名,`URI`是该...

    C#命名与注释规范——个人版

    本文将围绕《C#命名与注释规范——个人版》进行深入解读,帮助读者理解和掌握C#中的命名规范与注释技巧。 #### 二、命名规范概述 命名规范是编程中非常重要的一环,它涉及到变量、方法、类等元素的命名规则。合理的...

    android 自定义xml存储方式以及存储位置

    它的特点是易读性高,可扩展性强,支持命名空间,非常适合存储和交换结构化数据。 在Android中,XML存储通常分为两种方式:内存中的XML和文件系统的XML。 1. 内存中的XML:在程序运行时,可以使用`org.w3c.dom`或`...

    XML架构说明——XML架构说明

    XML架构的主要组成部分包括数据类型、命名空间和类型定义。数据类型定义了XML元素和属性可能的值。XSD内置了一系列预定义的数据类型,如整数、浮点数、字符串等,这些类型都有其特定的值空间,即允许的值的集合。...

    XML初学进阶——XML基础帮手

    5. **命名空间**:XML命名空间用于解决元素名称的冲突问题,通过引入命名空间URI(Uniform Resource Identifier)可以确保不同来源的元素不互相混淆。 6. **文档类型定义(DTD)与XML Schema**:DTD和XML Schema是...

    自定义view之——折线图

    本教程将深入探讨如何自定义一个折线图,即“自定义view之——折线图”。折线图是一种常见的数据可视化工具,常用于展示连续数据的变化趋势。 首先,我们需要创建一个新的Java类,继承自`View`或`ViewGroup`。在这...

    Schama —— Xml文档约束技术 学习笔记

    **Schama —— XML文档约束技术 学习笔记** XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、Web服务等场景。为了确保XML文档的数据结构正确、完整,避免数据错误,XML...

    Android如何使用XML自定义属性

    ### Android如何使用XML自定义属性 在Android开发中,我们经常需要为自定义视图或者控件设置一些特定的属性来满足不同的需求。为了更好地控制这些属性并使其更易于管理和扩展,Android提供了一种机制——XML自定义...

    网站建设——XML教程CHM

    4. 无关性:XML与任何特定的程序或硬件平台无关,这使得它可以在各种环境中广泛使用。 5. 可读性:XML文档以纯文本形式存储,人和机器都能轻松阅读和解析。 在"网站建设——XML教程CHM"中,可能涵盖了以下内容: 1...

    网站建设——XML初级教程

    2. **命名规则**:XML的元素、属性、命名空间等都遵循一定的命名规则,如名称必须以字母或下划线开头,不能包含空格和某些特殊字符。 3. **XML声明**:每个XML文档的开始都应有一个XML声明,例如`&lt;?xml version=...

    自定义控件练习Demo5——实现文字阴影

    本示例"自定义控件练习Demo5——实现文字阴影"旨在教授开发者如何为文字添加阴影效果,以增强视觉吸引力。以下将详细解释这个实践过程中的关键知识点。 首先,理解Android中的文字阴影涉及两个主要属性:`android:...

    ACCP4.0课件——XML课件

    &gt;`),定义命名空间(`xmlns="http://example.com"`),以及使用DTD(Document Type Definition)或XSD(XML Schema Definition)进行文档验证,确保数据的完整性和一致性。 XML与HTML的区别在于,HTML主要用于展示...

    SpringSecurity笔记2-SpringSecurity命名空间

    在"SpringSecurity笔记2-SpringSecurity命名空间"这个主题中,我们将深入探讨SpringSecurity配置的核心——命名空间。 SpringSecurity通过XML配置文件中的命名空间来简化设置过程,这些命名空间提供了丰富的元素和...

    安卓Android源码——AndroidXstream(解决xml和对象转换问题).rar

    这篇内容将详细讲解AndroidXstream如何解决XML与对象转换的问题。 首先,让我们理解XML序列化和反序列化的概念。序列化是指将Java对象转换为XML字符串,以便于存储或传输。反序列化则是相反的过程,将XML字符串解析...

    《无废话XML》——两只老虎

    ##### 1.3.5 XML与数据库的集成 - **数据库集成**:许多数据库管理系统支持XML数据类型,允许直接存储和检索XML文档,从而简化了数据管理和处理过程。 ##### 1.3.6 XML与编程语言 - **编程语言集成**:多数现代...

    xml轻松学习手册.rar_xml

    8. **命名空间**:XML命名空间用于解决相同标签名冲突的问题,通过使用前缀和URI(Uniform Resource Identifier)来区分来自不同来源的元素。 在“www.pudn.com.txt”和“pcbookcn.com”这两个文件中,可能包含了更...

    《动态Web数据库技术——基于JSP和XML技术实现》

    理解XML的基本结构和语法规则是必不可少的,包括元素、属性、文本内容、注释、处理指令以及命名空间。此外,XML的解析也至关重要,可以使用DOM(Document Object Model)、SAX(Simple API for XML)或StAX...

    XML网页设计实用教程——例题源码.rar

    它不仅涵盖了XML的基础概念,还延伸到了与之相关的JSP(JavaServer Pages)和AJAX(Asynchronous JavaScript and XML)技术。这个压缩包包含了该教程各章节的例题源代码,为读者提供了一个实践学习的平台。 XML,...

    XMLSpy 2005企业版 用户手册

    XMLSpy 2005企业版用户手册是针对XML开发工具——XMLSpy的专业指南,它提供了全面的功能介绍和操作指导,旨在帮助用户充分利用该软件进行XML相关的开发工作。XMLSpy是一款强大的XML编辑器,广泛应用于XML文档的创建...

Global site tag (gtag.js) - Google Analytics