AS3中应用XML数据

  AS3的出现,使我们使用XML更方便,AS3采用E4X(ECMAScript for XML)规范,使我们操作XML文件更加简便快速。
这篇帖子很多朋友评价我这篇帖子AS2中加载xml的知识讲解得很详细,给予支持和鼓励,在此表示感谢!同时,也有发邮件请教AS3中是如何应用XML的。这段时间正好不是很忙,抽时间再续上讲解AS3加载XML的一些方法,希望能够对爱好FLASH脚本编程的朋友一些帮助。

如何应用以下为AS3中使用XML的基本知识。
一、创建XML对象
在AS3中,创建xml对象有两种方法
1、使用构造函数

引用:
如:var xmlstr:String="<root><child>this is the string</child></root>";
var myxml:XML=new XML(xmlstr);
trace(myxml);
//输出: <root><child>this is the string</child></root>

2、使用XML文本创建XML对象

引用:
如:var myxml:XML=<root><child>this is the string</child></root>;
    trace(myxml);
    //输出: <root><child>this is the string</child></root>

另外,在AS3中,值得提到的是,可以使用"{ }"来使用变量(如果设置属性,不需要再加引号),这样我们就可以定义变量,使XML使用更加灵活了。

引用:
如:var 变量:String="this is the string";
var 子节点:String="child";
var 属性:String="attribute";
var myxml:XML=<root><{子节点} attr={属性}>{变量}</{子节点}></root>;
trace(myxml);
//输出: <root><child attr="attribute">this is the string</child></root>

是不是很奇妙!
二、操作XML数据
1、使用"."访问子元素,使用"@"访问各个元素的属性   多个相同的子节点成为一个XMLList对象,是一个XML对象的集合,使用" []"访问集合中的单个子节点。

引用:
例子:var myxml:XML = <root><child attr="attribute1">this is the string1</child>
<child attr="attribute2">this is the string2</child></root>;
trace(myxml.child[0]); //输出: this is the string1
trace(myxml.child[0].@attr)  //输出 :attribute1

2、同样,使用"."修改、创建子元素,使用"@"修改、创建元素的属性

引用:
例子:var myxml:XML = <root><child attr="attribute1">this is the string1</child><child attr="attribute2">this is the string2</child></root>;
myxml.child[1]="第2个节点的值改变了!";
myxml.child[0].@attr1="这是新创建的属性";
trace(myxml.child[0]);//输出: this is the string1
trace(myxml.child[1]);//输出: 第2个节点的值改变了!
trace(myxml.child[0].@attr);//输出 : attribute1
trace(myxml.child[0].@attr1);//输出 : 这是新创建的属性

3、使用delete删除子节点或属性

引用:
例子:var myxml:XML = <root><child attr="attribute1">this is the string1</child><child attr="attribute2">this is the string2</child></root>;
delete myxml.child[0].@attr
trace(myxml.child[0].@attr);//输出 :输出为空,表示不存在该属性

如果你还需要学习更复杂的操作访问xml知识请查阅相关文档。
学习了AS3中的有关操作XML的知识后,我们还需要知道AS3是如何加载外部的xml文件的,因为将xml定义在flash内部固然能够提高运行的速度,但是如果xml比较大,或者想像前面一样根据不同的情况,加载由ASP、php或其它语言动态生成的xml,就无能为力了,所以学习加载外部的XML可以说是非常非常重要,所以学习加载外部文件(包含xml文件)是非常重要的。

下面就向大家讲解AS3加载外部文件的相关知识
一、AS3加载外部文件(网络通讯)的三个流程
1、构建通讯请求对象;
一个完整的请求对象应该包括:
(1)请求的地址(对应URLRequest 对象的url属性);
(2)请求的方式(对应URLRequest 对象的GET属性):有两种方式提交,GET和POST方式(同as2),使用URLRequestMethod.GET和URLRequestMethod.POST常量赋值。
(3)请求(提交)的数据(对应URLRequest 对象的data属性):数据的格式对应于contentType属性,AS3为
http://www.youweb.com?value=aa这样的值对形式的参数传递专门提供一个URLVariables类来处理。

引用:
如: var vars:URLVariables=new URLVariables("value=aa");
var req:URLRequest=new URLRequest();
req.url="http://www.youweb.com";
req.method=URLRequestMethod.GET;
req.data=vars;

像AS2一样,可以提交数据给ASP、PHP等动态页面,它们将根据提交的数据,动态生成xml文档。
2、使用通讯请求对象,构建URLLoader对象,并发出数据请求:发出数据请求,就是将请求对象(URLRequest)所携带的信息,向指定请求对象指定的地点发出请求,可以使用URLLoader对象来完成。
有两种方法来发出请求:
(1)在建立URLLoader对象的同时发送请求。

引用:
var ld:URLLoader=new URLLoader(req);

(2)先建立URLLoader对象,等到需要时使用URLLoader对象的load方法发出请求。

引用:
var ld:URLLoader=new URLLoader();
ld.load(req);

3、 处理数据通讯结果,调用事件的侦听器处理返回的数据。
   在第二步发出请求后,如果有数据返回,将存储到URLLoader对象的data属性中(区别URLRequest对象的data属性),可以通过URLLoader的dataformat属性来判断返回数据的数据格式:
(1)       文本类型(URLLoaderDataFormat.TEXT)
(2)       二进制类型(URLLoaderDataFormat.BINARY)
(3)       值对类型(URLLoaderDataFormat.VARIABLES)
在as2中如果加载的数据不是Unicode编码的,需要使用System.useCodepage=true防止乱码。同样,在AS3中,也使用System.useCodePage=true(注意useCodePage与as2中useCodepage的区别)。
提示:由于再AS2中System是顶级类,而在AS3中不是,在使用System类前需要使用import导入flash.system.System。
同时,URLLoader有6种事件,能够更好的监听和控制加载流程:
(1)       Event.OPEN  当URLLoader对象发出请求(或使用load)时,就发出该事件
(2)       ProgressEvent.PROGRESS  加载过程中,获取下载字节数信息
(3)       Event.COMPLETE  当加载完成后,发出该事件
(4)       HTTPStatusEvent.HTTP_STATUS  加载完成或失败前,会发出HTTP状态事件
(5)       IOErrorEvent.IO_ERROR  加载出错时发出该事件
(6)       SecurityErrorEvent.SECURITY_ERROR  当加载违反安全规则的资源时,发出该事件
可以使用这些事件设置预加载。
另外,在AS2中,我们可以使用getURL()函数来加载外部文件,在AS3中,取而代之的是flash.net包中的navigateToURL()方法用于发送数据请求对象:

引用:
如:import flash.net.*;
var url:URLRequest=new URLRequest("http://www.youweb.com/books.asp?id=1");
navigateToURL(url,"_blank");

当只想提交数据,不需要返回数据,还可以使用sendToURL()方法。

引用:
如:var url:URLRequest=new URLRequest("http://www.youweb.com/books.asp?id=1");
sendToURL(url,"_blank");

有了以上的知识,继续回到我们前面讲到的内容,同样我们使用AS3来获得mybook.xml文件

引用:
<?xml version="1.0" encoding="gb2312"?>
<books>
       <book>
              <name>Thinking in Java</name>
              <author>Bruce Eckel</author>
              <pub src="1.jpg">机械工业</pub>
       </book>
       <book>
              <name>朗文英语词典</name>
              <author>--</author>
              <pub src="2.jpg">商务印书馆</pub>
       </book>
       <book>
              <name>数据结构</name>
              <author>严蔚敏</author>
              <pub src="3.jpg">清华大学</pub>
       </book>
       <book>
              <name>Database Concepts</name>
              <author>Oracle Corporation</author>
              <pub src="4.jpg">Oracle Corporation</pub>
       </book>
</books>

中的<pub src="1.jpg">机械工业</pub>中的图片地址怎么办呢(即“1.jpg”)?利用上面讲到的AS3应用XML的知识,就不难办到了。由于我们要使用的XML文件是外部文件,再操作之前,我们先要加载进flash,加载完成后转换为XML对象后就可以对xml操作了。

步骤: 
(1)首先建立请求对象

引用:
var req:URLRequest=new URLRequest("mybook.xml");

(2)建立URLLoader对象发送数据请求

引用:
var ld:URLLoader=new URLLoader(req);

(3)调用侦听函数,一旦加载完成,则执行ok函数

引用:
ld.addEventListener(Event.COMPLETE,ok);
function ok(event:Event):void {

(4)加载完成后,返回的数据存储在event.target(URLLoader对象)的data属性中

引用:
//trace(event.target.data);

(5)建立XML对象,并把返回的数据转换为xml格式

引用:
       var xml:XML=new XML(event.target.data);

(6)使用as3的EX4规范操作XML数据

引用:
       for (var i:int=0; i<=xml.book.length()-1; i++) {
              trace(xml.book[i].pub.@src);
         //输出: 1.jpg    2.jpg   3.jpg   4.jpg
       }
}
posted @ 2011-12-31 01:27  rob_2010  阅读(249)  评论(0)    收藏  举报