xiangpei01
Flash/Flex构架师 / 广东
积分 146

简单明了的flash+xml教程


2010-07-05 点击:


在FLASH中,使用XML接口获取外部数据是最有效的方法之一.(通常还有WebSerivce接口和LoadVars方法)
下面来看一个简单的XML文档(city.xml)
这个文档描述的是城市地区的信息

  1. <?xml version="1.0" encoding="gb2312"?> 
  2. <root> 
  3. <city name="上海" code="021" pnum="500000"/> 
  4. <city name="北京" code="010" pnum="600000"/> 
  5. <city name="浙江" code="057" pnum="1000000"/> 
  6. </root> 


简单介绍一下XML文档格式的书写规范: 
第一行:
这是一个XML文档的描述信息.其中定义了该XML文档的一些基本属性,包括:版本信息(version),使用的字符编码(encoding).
第二行:
(虽然在FLASH中我们用不到节点的任何属性,但是合式的XML文档必须要求一个根节点)
在XML文档中,这是一个根节点.XML规定所有标签必须有闭合.所以,在最后一行使用对应的标签来闭合.同样,单行的XML节点也需要闭合,例如:其中"/"符号就表示单行的节点闭合."name","code","pnum"是节点的属性,写法就是:属性名="属性值" 这样的名/值对.至于节点名和属性名都是可以自定义的,也就是说可以任意命名.但是还是建议要尽量规范
""节点是""的子节点,相应的""叫做""的父节点
在这个XML文档中有3个子节点,我们数据就存储在这3个子节点的属性中,分别有:城市名称(name),城市代码(code),城市人口数目(pnum)
我们要做的最终目的就是在FLASH中获取这些节点的属性值
下面来看一个FLASH调用XML的实例

  1. System.useCodepage = true;  
  2. var doc:XML = new XML();  
  3. doc.load("city.xml");  
  4. doc.ignoreWhite = true;  
  5. doc.onLoad = function(success){  
  6. if(success){  
  7. trace(doc.childNodes[0].childNodes[0].attributes.name);  
  8. trace(doc.childNodes[0].childNodes[1].attributes.name);  
  9. trace(doc.childNodes[0].childNodes[2].attributes.name);  
  10. }  
  11. }  

分析:
System.useCodepage = true;
如果在XML文档中使用了中文编码,例如"gb2312".那么在FLASH中必须启用使用页面编码的指令.
var doc:XML = new XML();
建立一个XML实例.赋予"doc"这个对象.
doc.load("city.xml");
"load()"-XML对象的一个方法:加载XML数据到"doc"这个对象当中.
提供XML数据的方式并不是限制于.xml的文件,任何符合XML书写格式的文档都可以,通常,我们是使用程序来提供XML数据的.
doc.ignoreWhite = true;
"ignoreWhite"-XML对象的一个属性:指定XML文档忽略空白,因为在XML中一个换行在FLASH中会被视为一个节点
doc.onLoad = function(success){}
"onLoad"-XML对象的一个方法.将会返回一个布尔值"true或false".用来判断XML是否被成功加载.如果加载成功则会返回"true",反之则返回"false"
此处为该方法使用了一个函数,其参数"success"用来贮存上述的布尔值
if(success){}
一个判断语句:如果加载成功(即success的值为"true"),则触发括号内的动作

  1. trace(doc.childNodes[0].childNodes[0].attributes.name); 


输出doc(此时"city.xml"中的数据已经包含到doc这个XML对象当中)这个XML对象的第一个节点下的第一个子节点的"name"属性值
childNodes-XML对象的一个属性,它的值的类型是数组型.XML的一个节点可以在FLASH中通过这个属性来表示其包含的数据.
由于FLASH中数组的长度计算是由"0"开始,所以我们XML文档中的第一个节点就存储在数组的"0"位置.而不是"1"
所以,我们取出XML文档的第一个节点-"",就应该表示成这样"childNodes[0]"
同样,我们取出XML对象根节点("")下的第一个子节点(""),就表示成

  1. doc.childNodes[0].childNodes[0] 


相应的,取出第二个子节点:doc.childNodes[0].childNodes[1]
第三个子节点:doc.childNodes[0].childNodes[2]
(这一步中,需要涉及到FLASH中数组对象的使用原理)
在FLASH与XML的数据交互中,可能数据的表现是最难的一步.
针对上面数据表现方式,我们可以充分利用数组的便利性来做
假如已经获得一个XML对象"doc"
首先,我们将这个XML中使用到的数据转换为一个数组对象来表示

  1. var myList:Array = doc.childNodes[0].childNodes;//直接将XML文档根节 

点下的的所有子节点放到一个数组中

  1. trace(myList[0].attributes.name+","+myList[0].attributes.code+","+myList[0].attributes.pnum);//输出第一个"city"节 

点所有的属性值

  1. trace(myList[1].attributes.name+","+myList[1].attributes.code+","+myList[1].attributes.pnum);//输出第二个"city"节 

点所有的属性值

  1. trace(myList[2].attributes.name+","+myList[2].attributes.code+","+myList[2].attributes.pnum);//输出第三个"city"节 

点所有的属性值
输出结果:
上海,021,500000
北京,010,600000
浙江,057,1000000
/*以上完整的代码为*/

  1. System.useCodepage = true;  
  2. var doc:XML = new XML();  
  3. doc.load("city.xml");  
  4. doc.ignoreWhite = true;  
  5. doc.onLoad = function(success){  
  6. if(success){  
  7. var myList:Array = doc.childNodes[0].childNodes;  
  8. trace(myList[0].attributes.name+","+myList[0].attributes.code+","+myList[0].attributes.pnum);  
  9. trace(myList[1].attributes.name+","+myList[1].attributes.code+","+myList[1].attributes.pnum);  
  10. trace(myList[2].attributes.name+","+myList[2].attributes.code+","+myList[2].attributes.pnum);  
  11. }  
  12. }  

/*代码结束*/
为了在FLASH中其他的位置都能够访问到我们所需要的XML数据,我们可以将myList数组对象放置到上下文的任意位置
例如:
 

  1. System.useCodepage = true;  
  2. var doc:XML = new XML();  
  3. var myList:Array = new Array();//预先建立一个数组对象用来放置XML节 

点数据,以便FLASH其他位置的代码都能够访问

  1. doc.load("city.xml");  
  2. doc.ignoreWhite = true;  
  3. doc.onLoad = function(success){  
  4. if(success){  
  5. myList = doc.childNodes[0].childNodes;//当XML加载成功后对上文的myList数组对象进行赋值.  
  6. }  
  7. }  
  8. //使用一个按钮动作来获取数组对象中的一个CITY节点信息  
  9. btName.onPress = function(){  
  10. trace(_root.myList[0].attributes.name+","+_root.myList[0].attributes.code+","+_root.myList[0].attributes.pnum);  
  11. }  

这样的写法当然还不满足我们一些复杂的需求,而且代码过冗长.
使用函数来返回我们需要的信息,应该是最正确的做法,我们来实现它
按下按钮时,向函数递交一个城市代码,返回城市名和人口信息

  1. System.useCodepage = true;  
  2. var doc:XML = new XML();  
  3. var myList:Array = new Array();//预先建立一个数组对象用来放置XML节点数据,以便FLASH其他位置的代码都能够访问  
  4. doc.load("city.xml");  
  5. doc.ignoreWhite = true;  
  6. doc.onLoad = function(success){  
  7. if(success){  
  8. myList = doc.childNodes[0].childNodes;//当XML加载成功后对上文的myList数组对象进行赋值.  
  9. }  
  10. }  
  11. //函数开始  
  12. function getCityInfo(code){? //构建一个函数的写法是:function 函数名(参数){//脚本代码}  
  13. var cityName:String;//建立一个字符窜变量来存储城市名  
  14. var pepCount:String;//建立一个字符窜变量来存储居民数量  
  15. for(var i=0;i<myList.length;i++){  
  16. if(code eq myList[i].attributes.code){  
  17. cityName = myList[i].attributes.name;  
  18. pepCount = myList[i].attributes.pnum;  
  19. }  
  20. }  
  21. return "城市:"+cityName+",人口:"+pepCount //返回一段文字表达信息  
  22. }  
  23. //函数结束  
  24. /*按钮的动作*/  
  25. btName.onPress = function(){  
  26. trace(getCityInfo("010"));//输出函数的返回结果,(在函数的参数中提交城市代码-"010") 

 


    xiangpei01  版权所有
    禁止任何用途(禁止转载、商用和个人使用)


所属分类:技术经验分享

本文标签:教程 flash+xml 简单明了

各位正在潜水的同学请注意,有0位无聊人士 在EBIBI附近出没!







    点击我更换图片 看不清
    评论内容 (*必填):

    (Ctrl + Enter 快速提交)