关于命名空间有很多人回避。认为太难。其实命名空间使用很普遍,在xml中也大量存在。初学as3者搞不清楚是因为关于这方面的教程少且as3帮助文件中也没有从基础讲起。而从一本厚厚的xml书籍中查询或者看官方网站的介绍又是一种非常苦的事情。这里我把我学习和理解的过程总结下,尽量用通俗的语言写出来。希望能够帮助初学者过这个难关,利益他人。
为了避免XML的标签同名。XML也拥有命名空间。标签可以放入命名空间中,不同的命名空间中的相同名称标签是不同的标签。
在xml文件中,命名空间的定义如下:
<d:student xmlns:d=”http://www.develop.com/student>;
其中student 是命名空间的标签,http://www.develop.com
是命名空间的标识,d是命名空间的前缀。
由于命名空间采取元素属性的定义方式,所以需要一个标签。
命名空间标识是命名空间最重要的属性,重要到当输出一个命名空间时就直接转换为它的标识。标识有个规范的称呼:URI(统一资源定位符)。URI的最大特点是唯一性。如果不唯一就失去了辨识的意义。实际上相同URI不同的命名空间被看成同一个命名空间。URI分为两种类型:
前缀用于在XML中作为URI的简化引用。因为URI太长了。如:
<d:student xmlns:d="http://www.develop.com/student">
<d:id>3235329</d:id>
<d:name>Jeff Smith</d:name>
</d:student>
使用前缀把标签放入对应的命名空间中。
有了命名空间区分后相同标签名可以不会被错误解析。实际上命名空间加上元素名叫做QName。QName有两个属性:uri和localName,分别获取命名空间名和本地名称。这个QName可以使用xml的name()方法得到。如上例子中的xml文件可以使用如下代码访问:
var ns:Namespace=xml.namespace();
var node:XMLList=xml.ns::id;
var qNameName=node.name();
trace(qName.uri);
trace(qName.localName);
命名空间不一点要定义在根节点。可以在任何标签中定义,但只有定义了后才能使用。命名空间还可以嵌套或者被重定义。但这样会增加复杂性。一般用的比较少。一个xml文件中可以拥有多个命名空间。使用命名空间前缀可以轻松处理它们。如:
<x:transform version=”1.0” xmlns:x=http://www.w3.org/1999/XSL/Transform xmlns:d=”urn:dm:student”>
<x:template match=”student”/>
<d:template match=”name”/>
</x:transform>
在xml文档中,可以使用以下语句定义默认命名空间:
xmlns=<namespace identifier>
使用默认命名空间后,如果不加前缀则引用默认命名空间。使用默认命名空间会降低xml结构的清晰度。要慎用。