AS3-E4X、QName
2009-11-14 00:10
197 查看
AS3-E4X(ECMAScript for XML)
1. AS3的XML相关类只有两个了:一个XML、一个XMLList,AS2时代的XMLNode已经被完全抛弃;
2. 记住以下术语:
简单内容XML(simplecontent),指没有子节点的XML。以下示例是一个简单内容XML:
复杂内容XML,指至少包含一个子节点的XML。以下示例是一个复杂内容XML:
元素 (Element),指XML 文档中的单个项目,它被标识为开始标签和结束标签之间包含的内容(包括标签)。XML 元素可以包含文本数据或其它元素,也可以为空。
空元素 (Empty element),指不包含任何子元素的 XML 元素。通常,将空元素编写为自结束标签(如 <element/>)。
子元素,XML的子对象,对于简单内容的XML来说,其子元素就是它的文本节点(起始和结束标签之间的文字内容),对于复杂内容的XML来说,其子元素是指它的下级元素。
后代(descendant),指XML元素的所有子元素、孙子元素、曾孙元素……
文档 (Document),指单个 XML 结构。XML 文档可以包含任意数量的元素(或者仅包含单个空元素);但是,XML 文档必须具有一个顶级元素,该元素包含文档中的所有其它元素。
节点 (Node),XML 元素的另一种称谓。
属性 (Attribute),与元素关联的命名值,它以 attributename="value" 格式写入到元素的开始标签中,而不是编写为嵌套在元素内的单独子元素。
XMLList,包含多个XML元素的集合,本质上,它是一个数组。XML和XMLList的关系如下图所示:
3.创建及初始化XML对象:
使用MXL文本直接赋值:
使用XML类的构造函数生成:
使用数据引用生成:
使用URLLoader从外部加载:
3. 记住以下E4X 符号和方法的用法:
“.” ,子元素访问符,返回值为XMLList对象,对应的方法为child();
“..” ,后代访问符,返回值为XMLList对象,对应的方法为descendants();
“@” ,属性访问符,返回值为XMLList对象,对应的方法为attribute();
“*” ,通配符,用来搭配上面的三种符号模糊访问XML内容;
以下是上述4种符号的使用示例:
[注意] 不要错误地认为xml.video[0].synopsis是字符串哦,它依然是一个XMLList,只不过trace的时候它被toString()成那个样子了而已。关
于这点,可以用如下代码验证:trace(xml.video[0].synopsis is XMLList);
[注意] 后代访问符会取出元素中的所有匹配子元素;
[注意] 使用子元素访问符搭配通配符将取出XML元素的所有子元素
[注意] 使用属性访问符搭配通配符将取出XML元素的所有属性。此外,你可能发现一个问题,上面输出的属性全部连到一起了,非常难看,如果
想让输出结果赏心悦目一点,请改写上面的代码为:
4.掌握过滤搜寻。观察上面例子中的“trace(xml..artist);” ,我们发现,输出结果包含两条信息,如果只想要“苏菲玛索”那一条,那么如下操作:
[注意]需要注意,使用条件过滤时如果引用了不存在的属性或文本节点,则可能引发一个“ReferenceError”类型的错误。例如:
5. 遍历XMLList:
用for…in遍历
[注意]用for…in遍历XMLList时,计数器是一个从零开始递增的整数的字符形式(0,1,2…N)而不是节点名称,这表明XMLList在内部是以索引
数组来保存XML子元素的,因此我们也可以用常规循环来遍历XMLList,循环次数取XMLList.length()。要特别小心哦,MXLList没有length属
性,只有length()方法,用length()方法的时候不要忘了函数括号。
用for…each…in遍历XMLList:
6.
区别XML的name和localName,掌握XML命名空间的概念:
name()方法返回的是一个QName对象,而localName()方法返回的是一个本地节点名称字符串,用法示例如下:
MXL命名空间的作用是:划分元素定义域,避免同名歧义。它在大项目和集中管理多个XML元素的XML文档中非常有用。下面我们来学习如何定义和使用XML的命名空间:
XML命名空间的定义格式为:[xmlns:prefix]=[uri],其中xmlns是定义MXL命名空间的关键字,prefix叫做命名空间的前缀,uri叫做命名空间的
统一资源标识符(Universal Resource Identifier)。具体使用方法如下:
上例中,我们在顶级标签GameSwitcher中定义了三个命名空间,第一个是“fgs”,统一资源标识符
为“http://www.avocado.com/game/flash/gameswitcher”,被应用到了顶级标签GameSwitcher中(应用命名空间的方法是,将命名空间前
缀加冒号后写在标签名称前面);第二个是“sbc”,统一资源标识符为“http://www.avocado.com/game/flash/sbc/gameswitcher”,被应用到
了第一个scrollbar中;第三个是“tbj”,统一资源标识符为“http://www.avocado.com/game/flash/tbj/gameswitcher”,被应用到了第二
个scrollbar中。以下是使用上面定义的命名空间的示例代码:
运行结果此处就不写了,内容太多,恐徒增篇幅。请把上面的代码粘贴到帧上运行一下,仔细留
意trace(xml.sbc::scrollbar)和trace(xml.tbj::scrollbar)的结果,我们发现,这两个输出结果的顶级标签中都包含了所有在GameSwitcher标签
中定义的命名空间。这说明上层命名空间在子元素中可见,因此,我们可以将所有的命名空间定义都集中到顶级标签上去写,方便后期查寻和修
改。那么反过来呢,子元素中的命名空间是否在上级可见?运行以下下面的示例看看吧:
QName是什么?有什么用?
QName的全名是Qualified Name,中文名称叫做“限定名”,是用来标识XML元素和属性的一种命名规范(该规范定义在E4X的
ECMAScript中)。QName由两部分内容组成:localName和uri。其中localName叫做本地名称,在默认命名空间的XML元素中,它就是XML元
素的标签名;uri叫做统一资源标识符,指XML命名空间的uri内容。例如,有如下XML结构:
其中“avo:list”部分就相当于一个QName对象,AS3在将XML文本解析成XML对象的时候会把它处理成一个QName对象。再使用XML对象
的方法时,我们就可以用QName对象去匹配XML元素了。示例如下:
上面的trace将输出<chs:video></chs:video>标签对中(含<chs:video>标签对)的所有内容。
或者,你也可以用如下方式构造QName,来实现跟上面代码一样的操作:
OK,AS3中E4X的重要内容差不多就这些了,剩下一些函数,请自己F1。
完
1. AS3的XML相关类只有两个了:一个XML、一个XMLList,AS2时代的XMLNode已经被完全抛弃;
2. 记住以下术语:
简单内容XML(simplecontent),指没有子节点的XML。以下示例是一个简单内容XML:
var xmlA:XML = <data version="1.0">this is simple content</data>; trace(xmlA.hasSimpleContent()); //true trace(xmlA.hasComplexContent()); //false
复杂内容XML,指至少包含一个子节点的XML。以下示例是一个复杂内容XML:
var xmlA:XML = <data version="1.0"> <complex> this is simple content </complex> </data>; trace(xmlA.hasSimpleContent()); //false trace(xmlA.hasComplexContent()); //true
元素 (Element),指XML 文档中的单个项目,它被标识为开始标签和结束标签之间包含的内容(包括标签)。XML 元素可以包含文本数据或其它元素,也可以为空。
空元素 (Empty element),指不包含任何子元素的 XML 元素。通常,将空元素编写为自结束标签(如 <element/>)。
子元素,XML的子对象,对于简单内容的XML来说,其子元素就是它的文本节点(起始和结束标签之间的文字内容),对于复杂内容的XML来说,其子元素是指它的下级元素。
后代(descendant),指XML元素的所有子元素、孙子元素、曾孙元素……
文档 (Document),指单个 XML 结构。XML 文档可以包含任意数量的元素(或者仅包含单个空元素);但是,XML 文档必须具有一个顶级元素,该元素包含文档中的所有其它元素。
节点 (Node),XML 元素的另一种称谓。
属性 (Attribute),与元素关联的命名值,它以 attributename="value" 格式写入到元素的开始标签中,而不是编写为嵌套在元素内的单独子元素。
XMLList,包含多个XML元素的集合,本质上,它是一个数组。XML和XMLList的关系如下图所示:
3.创建及初始化XML对象:
使用MXL文本直接赋值:
var xml:XML = <list> <video> <artist name="苏菲玛索" sex="女" area="欧美"/> <infomation name="飘" duration="3:12" quality="高清"/> <synopsis>一段发生在美国南北战争时期的浪漫爱情故事</synopsis> </video> </list>;
使用XML类的构造函数生成:
var strXML:String = "<artist name='苏菲玛索' sex='女' area='欧美'>一段发生在美国南北战争时期的浪漫爱情故事</artist>" var xml:XML = new XML(strXML); trace(xml)
使用数据引用生成:
var tagname:String = "image"; var attributename:String = "color"; var attributevalue:String = "0xFF00FF"; var content:String = "欧罗巴"; var xml:XML = <dynamic> <{tagname}{attributename}={attributevalue}>{content}</{tagname}> </dynamic> trace(xml);
使用URLLoader从外部加载:
var xml:XML; var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, loadCompleteHandler); loader.load(new URLRequest("vide.xml")); function loadCompleteHandler(evt:Event):void { xml = XML(evt.target.data); trace(xml); }
3. 记住以下E4X 符号和方法的用法:
“.” ,子元素访问符,返回值为XMLList对象,对应的方法为child();
“..” ,后代访问符,返回值为XMLList对象,对应的方法为descendants();
“@” ,属性访问符,返回值为XMLList对象,对应的方法为attribute();
“*” ,通配符,用来搭配上面的三种符号模糊访问XML内容;
以下是上述4种符号的使用示例:
var xml:XML = <list> <video> <artist name="苏菲玛索" sex="女" area="欧美"/> <infomation name="飘" duration="3:12" quality="高清"/> <synopsis>一段发生在美国南北战争时期的浪漫爱情故事</synopsis> </video> <video> <artist name="金凯瑞" sex="男" area="欧美"/> <infomation name="变脸" duration="1:54" quality="高清"/> <synopsis>无厘头妄想搞笑片</synopsis> </video> </list> trace(xml.video); 将输出如下内容: <video> <artist name="苏菲玛索" sex="女" area="欧美"/> <infomation name="飘" duration="3:12" quality="高清"/> <synopsis>一段发生在美国南北战争时期的浪漫爱情故事</synopsis> </video> <video> <artist name="金凯瑞" sex="男" area="欧美"/> <infomation name="变脸" duration="1:54" quality="高清"/> <synopsis>无厘头妄想搞笑片</synopsis> </video> trace(xml.video[0]); 将输出如下内容: <video> <artist name="苏菲玛索" sex="女" area="欧美"/> <infomation name="飘" duration="3:12" quality="高清"/> <synopsis>一段发生在美国南北战争时期的浪漫爱情故事</synopsis> </video> trace(xml.video[0].synopsis);将输出如下内容: 一段发生在美国南北战争时期的浪漫爱情故事
[注意] 不要错误地认为xml.video[0].synopsis是字符串哦,它依然是一个XMLList,只不过trace的时候它被toString()成那个样子了而已。关
于这点,可以用如下代码验证:trace(xml.video[0].synopsis is XMLList);
trace(xml..artist);将输出如下内容: <artist name="苏菲玛索" sex="女" area="欧美"/> <artist name="金凯瑞" sex="男" area="欧美"/>
[注意] 后代访问符会取出元素中的所有匹配子元素;
trace(xml.*); 将输出如下内容: <video> <artist name="苏菲玛索" sex="女" area="欧美"/> <infomation name="飘" duration="3:12" quality="高清"/> <synopsis>一段发生在美国南北战争时期的浪漫爱情故事</synopsis> </video> <video> <artist name="金凯瑞" sex="男" area="欧美"/> <infomation name="变脸" duration="1:54" quality="高清"/> <synopsis>无厘头妄想搞笑片</synopsis> </video>
[注意] 使用子元素访问符搭配通配符将取出XML元素的所有子元素
trace(xml.video[0].artist.@name); 将输出如下内容: 苏菲玛索 trace(xml.video[0].artist.@*);将输出如下内容: 苏菲玛索女欧美
[注意] 使用属性访问符搭配通配符将取出XML元素的所有属性。此外,你可能发现一个问题,上面输出的属性全部连到一起了,非常难看,如果
想让输出结果赏心悦目一点,请改写上面的代码为:
trace(xml.video[0].artist.@*.toXMLString());
4.掌握过滤搜寻。观察上面例子中的“trace(xml..artist);” ,我们发现,输出结果包含两条信息,如果只想要“苏菲玛索”那一条,那么如下操作:
trace(xml..artist.(@sex == "女").@name); //输出苏菲玛索 或者,我们想要得到“金凯瑞video”,可以如下书写:trace(xml.video.(artist.@name == "金凯瑞")); 也可以如下书写: trace(xml.video.(synopsis == "无厘头妄想搞笑片"));
[注意]需要注意,使用条件过滤时如果引用了不存在的属性或文本节点,则可能引发一个“ReferenceError”类型的错误。例如:
trace(xml.video.(sb == "无厘头妄想搞笑片")); // ReferenceError: Variable sb is not defined. 为了避免出错,我们可以使用attribute() 和 elements() 方法来识别具有匹配属性或元素的属性,如下面的代码所示: trace(xml.video.(elements("sb") == "无厘头妄想搞笑片")); 或者,我们也可以用hasOwnProperty()方法来检查对象是否具有指定的属性: trace(xml.video.(hasOwnProperty("synopsis") && synopsis== "无厘头妄想搞笑片")); 此外,我们也可以用try…catch来忽略错误或对错误进行相应处理: try { trace(xml.video.(synopsis == "无厘头妄想搞笑片")); } catch(err:ReferenceError) { //忽略或处理错误 }
5. 遍历XMLList:
用for…in遍历
var xml:XML = <list> <peoples> <people>p1</people> <people>p2</people> <people>p3</people> <people>p4</people> </peoples> </list>; for(var s:String in xml.peoples.*) { trace(xml.peoples.*[s]); } 输出: p1 p2 p3 p4
[注意]用for…in遍历XMLList时,计数器是一个从零开始递增的整数的字符形式(0,1,2…N)而不是节点名称,这表明XMLList在内部是以索引
数组来保存XML子元素的,因此我们也可以用常规循环来遍历XMLList,循环次数取XMLList.length()。要特别小心哦,MXLList没有length属
性,只有length()方法,用length()方法的时候不要忘了函数括号。
用for…each…in遍历XMLList:
var xml:XML = <list> <peoples> <people>p1</people> <people>p2</people> <people>p3</people> <people>p4</people> </peoples> </list>; for each(var s:XML in xml.peoples.*) { trace(s); } 输出: p1 p2 p3 p4
6.
区别XML的name和localName,掌握XML命名空间的概念:
name()方法返回的是一个QName对象,而localName()方法返回的是一个本地节点名称字符串,用法示例如下:
var xml:XML = <sbc:GameSwitcher xmlns:sbc="http://www.avocado.com/game/flash/sbc/gameswitcher"> <sbc:scrollbar xmlns:it = "http://scrollbar.com"> <it:item> <it:upimg url="http://192.168.1.68/imgs/itemup">up</it:upimg> <it:ovimg url="http://192.168.1.68/imgs/itemov">ov</it:ovimg> <it:dnimg url="http://192.168.1.68/imgs/itemdn">dn</it:dnimg> </it:item> </sbc:scrollbar> </sbc:GameSwitcher>; trace(xml.name().localName); //GameSwitcher trace(xml.name()); //"http://www.avocado.com/game/flash/sbc/gameswitcher::GameSwitche"
MXL命名空间的作用是:划分元素定义域,避免同名歧义。它在大项目和集中管理多个XML元素的XML文档中非常有用。下面我们来学习如何定义和使用XML的命名空间:
XML命名空间的定义格式为:[xmlns:prefix]=[uri],其中xmlns是定义MXL命名空间的关键字,prefix叫做命名空间的前缀,uri叫做命名空间的
统一资源标识符(Universal Resource Identifier)。具体使用方法如下:
var xml:XML = <fgs:GameSwitcher xmlns:fgs="http://www.avocado.com/game/flash/gameswitcher" xmlns:sbc="http://www.avocado.com/game/flash/sbc/gameswitcher" xmlns:tbj="http://www.avocado.com/game/flash/tbj/gameswitcher"> <sbc:scrollbar> <item> <upimg url="http://avogm.com/imgs/fgs/sbc/itemup">up</upimg> <ovimg url="http://avogm.com/imgs/fgs/sbc/itemov">ov</ovimg> <dnimg url="http://avogm.com/imgs/fgs/sbc/itemdn">dn</dnimg> </item> </sbc:scrollbar> <tbj:scrollbar> <item> <upimg url="http://avogm.com/imgs/fgs/tbj/itemup">up</upimg> <ovimg url="http://avogm.com/imgs/fgs/tbj/itemov">ov</ovimg> <dnimg url="http://avogm.com/imgs/fgs/tbj/itemdn">dn</dnimg> </item> </tbj:scrollbar> </fgs:GameSwitcher>;
上例中,我们在顶级标签GameSwitcher中定义了三个命名空间,第一个是“fgs”,统一资源标识符
为“http://www.avocado.com/game/flash/gameswitcher”,被应用到了顶级标签GameSwitcher中(应用命名空间的方法是,将命名空间前
缀加冒号后写在标签名称前面);第二个是“sbc”,统一资源标识符为“http://www.avocado.com/game/flash/sbc/gameswitcher”,被应用到
了第一个scrollbar中;第三个是“tbj”,统一资源标识符为“http://www.avocado.com/game/flash/tbj/gameswitcher”,被应用到了第二
个scrollbar中。以下是使用上面定义的命名空间的示例代码:
trace("Namespace fgs:prefix="+fgs.prefix + " uri="+fgs.uri); trace("Namespace sbc:prefix="+sbc.prefix + " uri="+sbc.uri); trace("Namespace tbj:prefix="+tbj.prefix + " uri="+tbj.uri); trace(xml.sbc::scrollbar); trace("----------------"); trace(xml.tbj::scrollbar);
运行结果此处就不写了,内容太多,恐徒增篇幅。请把上面的代码粘贴到帧上运行一下,仔细留
意trace(xml.sbc::scrollbar)和trace(xml.tbj::scrollbar)的结果,我们发现,这两个输出结果的顶级标签中都包含了所有在GameSwitcher标签
中定义的命名空间。这说明上层命名空间在子元素中可见,因此,我们可以将所有的命名空间定义都集中到顶级标签上去写,方便后期查寻和修
改。那么反过来呢,子元素中的命名空间是否在上级可见?运行以下下面的示例看看吧:
var xml:XML = <dac:data xmlns:dac="http://data.com" xmlns:asc="http://data.com/ascode"> <asc:code xmlns:fpc="http://data.com/ascode"> <fpc:flvplayer>var video:Video = new Video();</fpc:flvplayer> </asc:code> </dac:data>; var dac:Namespace = xml.namespace("dac"); var asc:Namespace = xml.namespace("asc"); var fpc:Namespace = xml.namespace("fpc"); //取子元素中定义的命名空间,失败 trace(dac); //http://data.com trace(asc); //http://data.com/ascode trace(fpc); //null dac = xml.asc::code.namespace("dac"); //取上级元素中定义的命名空间,成功 trace(dac); //http://data.com
QName是什么?有什么用?
QName的全名是Qualified Name,中文名称叫做“限定名”,是用来标识XML元素和属性的一种命名规范(该规范定义在E4X的
ECMAScript中)。QName由两部分内容组成:localName和uri。其中localName叫做本地名称,在默认命名空间的XML元素中,它就是XML元
素的标签名;uri叫做统一资源标识符,指XML命名空间的uri内容。例如,有如下XML结构:
var xml:XML = <avo:list xmlns:avo="http://www.avocado.com" xmlns:eur="http://www.avocado.com/eur"> <eur:video> <artist name="苏菲玛索" sex="女" area="欧美"/> <infomation name="飘" duration="3:12" quality="高清"/> <synopsis>一段发生在美国南北战争时期的凄美爱情故事</synopsis> </eur:video> </avo:list>;
其中“avo:list”部分就相当于一个QName对象,AS3在将XML文本解析成XML对象的时候会把它处理成一个QName对象。再使用XML对象
的方法时,我们就可以用QName对象去匹配XML元素了。示例如下:
var xml:XML = <avo:list xmlns:avo="http://www.avocado.com/video" xmlns:eur="http://www.avocado.com/video/eur" xmlns:chs="http://www.avocado.com/video/chs"> <eur:video> <artist name="苏菲玛索" sex="女" area="欧美"/> <infomation name="飘" duration="3:12" quality="高清"/> <synopsis>一段发生在美国南北战争时期的浪漫爱情故事</synopsis> </eur:video> <chs:video> <artist name="葛优" sex="男" area="中国大陆"/> <infomation name="大腕" duration="1:54" quality="高清"/> <synopsis>贺岁喜剧大片</synopsis> </chs:video> </avo:list> var chsQname:QName = new QName("http://www.avocado.com/video/chs", "video"); trace(xml.descendants(chsQname));
上面的trace将输出<chs:video></chs:video>标签对中(含<chs:video>标签对)的所有内容。
或者,你也可以用如下方式构造QName,来实现跟上面代码一样的操作:
var chsQname:QName = new QName(xml.namespace("chs"), "video"); trace(xml.descendants(chsQname));
OK,AS3中E4X的重要内容差不多就这些了,剩下一些函数,请自己F1。
完
相关文章推荐
- AS3中新的XML处理方法 - E4X
- AS3中e4x用法纲要
- AS3中新的XML处理方法 - E4X
- AS3-E4X(ECMAScript for XML)总结
- protobuf的AS3版本
- AS3右键菜单+多个右键菜单
- AS3文本编辑器中选择部分正确方法
- AS3的一些优秀的开源类库
- AS3关闭声音时音量递减直至消失
- AS3之NetStatusEvent参考
- as3与node.js的socket通信
- as3 位图九宫格
- AS3的垃圾回收
- AS3定时任务管理工具类
- AS3 颜色处理 技巧(红绿反色,黑白,旧照片)
- AS3 条件编译法
- [AS3]as3监听退出全屏时esc按键(监听esc取消动作)
- 【AS3】Flash读取XML内容的方法(附加载一个视频的例子)
- QName
- PureMVC(AS3)剖析:实例