Flash课件网 - 您身边的课件制作专家
Flash课件网官方,专业代做课件、定制原创Flash动画或参赛课件、修改Flash、制作演讲或汇报幻灯片PPT课件。联系QQ:4318100或搜索微信号:flashkj

基于flash+xml的考试系统的构建

本站提供Flash课件代做和PPT幻灯片定制业务,联系QQ/微信:4318100
在FLASH中,使用XML接口获取外部数据是最有效的方法之一,下面以一个简单的XML文档(city.xml),讲讲flash+xml技术,这个文档描述的是城市地区的信息

xml version="1.0" encoding="gb2312"?>
<root>
<city name="上海" code="021" pnum="500000"/>
<city name="北京" code="010" pnum="600000"/>
<city name="浙江" code="057" pnum="1000000"/>
root>
简单介绍一下XML文档格式的书写规范:
第一行:
这是一个XML文档的描述信息.其中定义了该XML文档的一些基本属性,包括:版本信息(version),使用的字符编码(encoding).

第二行:
(虽然在FLASH中我们用不到节点的任何属性,但是合式的XML文档必须要求一个根节点)
在XML文档中,这是一个根节点.XML规定所有标签必须有闭合.所以,在最后一行使用对应的标签来闭合.同样,单行的XML节点也需要闭合,例如:其中"/"符号就表示单行的节点闭合."name","code","pnum"是节点的属性,写法就是:属性名="属性值" 这样的名/值对.至于节点名和属性名都是可以自定义的,也就是说可以任意命名.但是还是建议要尽量规范

""节点是""的子节点,相应的""叫做""的父节点

在这个XML文档中有3个子节点,我们数据就存储在这3个子节点的属性中,分别有:城市名称(name),城市代码(code),城市人口数目(pnum)
我们要做的最终目的就是在FLASH中获取这些节点的属性值

下面来看一个FLASH调用XML的实例

System.useCodepage = true;
var doc:XML = new XML();
doc.load("city.xml");
doc.ignoreWhite = true;
doc.onLoad = function(success){
if(success){
trace(doc.childNodes[0].childNodes[0].attributes.name);
trace(doc.childNodes[0].childNodes[1].attributes.name);
trace(doc.childNodes[0].childNodes[2].attributes.name);
}
}
分析:

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数据的,例如"http://www.51ww.com/city.aspx?country=china"

doc.ignoreWhite = true;
"ignoreWhite"-XML对象的一个属性:指定XML文档忽略空白,因为在XML中一个换行在FLASH中会被视为一个节点

doc.onLoad = function(success){}
"onLoad"-XML对象的一个方法.将会返回一个布尔值"true或false".用来判断XML是否被成功加载.如果加载成功则会返回"true",反之则返回"false"
此处为该方法使用了一个函数,其参数"success"用来贮存上述的布尔值

if(success){}
一个判断语句:如果加载成功(即success的值为"true"),则触发括号内的动作

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对象根节点("")下的第一个子节点(""),就表示成doc.childNodes[0].childNodes[0]
相应的,取出第二个子节点:doc.childNodes[0].childNodes[1]
第三个子节点:doc.childNodes[0].childNodes[2]
(这一步中,需要涉及到FLASH中数组对象的使用原理)

在FLASH与XML的数据交互中,可能数据的表现是最难的一步.
针对上面数据表现方式,我们可以充分利用数组的便利性来做
假如已经获得一个XML对象"doc"


首先,我们将这个XML中使用到的数据转换为一个数组对象来表示
var myList:Array = doc.childNodes[0].childNodes;//直接将XML文档根节点下的的所有子节点放到一个数组中
trace(myList[0].attributes.name+","+myList[0].attributes.code+","+myList[0].attributes.pnum);//输出第一个"city"节点所有的属性值
trace(myList[1].attributes.name+","+myList[1].attributes.code+","+myList[1].attributes.pnum);//输出第二个"city"节点所有的属性值
trace(myList[2].attributes.name+","+myList[2].attributes.code+","+myList[2].attributes.pnum);//输出第三个"city"节点所有的属性值

输出结果:

上海,021,500000
北京,010,600000
浙江,057,1000000

/*以上完整的代码为*/
System.useCodepage = true;
var doc:XML = new XML();
doc.load("city.xml");
doc.ignoreWhite = true;
doc.onLoad = function(success){
if(success){
var myList:Array = doc.childNodes[0].childNodes;
trace(myList[0].attributes.name+","+myList[0].attributes.code+","+myList[0].attributes.pnum);
trace(myList[1].attributes.name+","+myList[1].attributes.code+","+myList[1].attributes.pnum);
trace(myList[2].attributes.name+","+myList[2].attributes.code+","+myList[2].attributes.pnum);
}
}
/*代码结束*/
为了在FLASH中其他的位置都能够访问到我们所需要的XML数据,我们可以将myList数组对象放置到上下文的任意位置
例如:

System.useCodepage = true;
var doc:XML = new XML();
var myList:Array = new Array();//预先建立一个数组对象用来放置XML节点数据,以便FLASH其他位置的代码都能够访问
doc.load("city.xml");
doc.ignoreWhite = true;
doc.onLoad = function(success){
if(success){
myList = doc.childNodes[0].childNodes;//当XML加载成功后对上文的myList数组对象进行赋值.
}
}


//使用一个按钮动作来获取数组对象中的一个CITY节点信息
btName.onPress = function(){
trace(_root.myList[0].attributes.name+","+_root.myList[0].attributes.code+","+_root.myList[0].attributes.pnum);
}
这样的写法当然还不满足我们一些复杂的需求,而且代码过冗长.
使用函数来返回我们需要的信息,应该是最正确的做法,我们来实现它
按下按钮时,向函数递交一个城市代码,返回城市名和人口信息

System.useCodepage = true;
var doc:XML = new XML();
var myList:Array = new Array();//预先建立一个数组对象用来放置XML节点数据,以便FLASH其他位置的代码都能够访问
doc.load("city.xml");
doc.ignoreWhite = true;
doc.onLoad = function(success){
if(success){
myList = doc.childNodes[0].childNodes;//当XML加载成功后对上文的myList数组对象进行赋值.
}
}

//函数开始
function getCityInfo(code){? //构建一个函数的写法是:function 函数名(参数){//脚本代码}
var cityName:String;//建立一个字符窜变量来存储城市名
var pepCount:String;//建立一个字符窜变量来存储居民数量
for(var i=0;i<myList.length;i++){
if(code eq myList[i].attributes.code){
cityName = myList[i].attributes.name;
pepCount = myList[i].attributes.pnum;
}
}
return "城市:"+cityName+",人口:"+pepCount //返回一段文字表达信息
}

//函数结束

??? /*按钮的动作*/
btName.onPress = function(){
trace(getCityInfo("010"));//输出函数的返回结果,(在函数的参数中提交城市代码-"010")

 

根据上面所讲的原理,下面来做一个简单的在线考试,随机出题,并统计考试分数的系统:

首先建立一个XML文件,在XML中的文件内容如下:
 

<root>
    <t1 key="A">      //key指本题的答案
          <qu> 第1题 。。。。。。。</qu>   //三个答案,当然也可以多, 
          <n1>  1.A 题目 </n1>
          <n2>  B题目 </n2>
          <n3>  C 题目 </n3>
    </t1>
    <t2 key="B">
          <qu> 第2题 。。。。。。。</qu>
          <n1>  2.A 题目 </n1>
          <n2>  B题目 </n2>
          <n3>  C 题目 </n3>
    </t2>
。。。。。。。
</root>

第一帧上AS:欢迎界面,做个按纽,点击按纽后进入第二帧
第二帧 上AS: 解析加载的XML数据,建立几个数组存放题目,选项和答案。实现了随机出题,但不重复。
AS为:
 

myxml = new XML();      //建一XML对象
myxml.ignoreWhite = true;     //忽略空格
System.useCodepage = true;   //正确显示中文
myxml.load("mmxml.xml");    //加载mmxml.xml文档
key_arr = new Array();         //存放正 确答案的变量
t_arr = new Array();            //存放题目及选项的变量
result_arr = new Array();      //记录随机排列题目的变量
mykey_arr = new Array();     //记录你做出的答案。
myxml.onLoad = function(ss) {     //加载XML
 if (ss) {                                             //如果加载成功
  trace("load XML OK");   
  len = myxml.firstChild.childNodes.length;   //将题目数量存入len中
  tt = myxml.firstChild.childNodes;               //下面将结果存入数据
  for (var i = 0; i   result_arr[i] = i;
   key_arr[i] = tt[i].attributes.key;           //存答案
   t_arr[i] = new Object();                          //将题目及答案存入对象。     
   t_arr[i].question = tt[i].childNodes[0].firstChild;
   t_arr[i].k1 = tt[i].childNodes[1].firstChild;
   t_arr[i].k2 = tt[i].childNodes[2].firstChild;
   t_arr[i].k3 = tt[i].childNodes[3].firstChild;
  }
  for (var i = 0; i   //随机排列题目
   tmp = random(len);
   v1 = result_arr[i];
   result_arr[i] = result_arr[tmp];
   result_arr[tmp] = v1;
   v2 = key_arr[i];
   key_arr[i] = key_arr[tmp];
   key_arr[tmp] = v2;
  }
   nextFrame();
 } else {
  trace("load XML error");
 }
};
stop();

第三帧上AS: 显示题目及选项,放置一按纽操作下一题。
AS:    question是一个MC,在库中设置链接ID名:question,它包含有三个RadioButton组件,组名相同,实例名分别为:A_btn,B_btn,C_btn,四个动态文本框,实例名分别为:

t_txt,  k1_txt,  k2_txt,  k3_txt. attachMovie("question", "qu", 1,{_x:50,_y:50});
var v1 = 0;
qu.t_txt.selectable=false;
qu.t_txt.text = t_arr[result_arr[v1]].question;
qu.k1_txt.text = t_arr[result_arr[v1]].k1;
qu.k2_txt.text = t_arr[result_arr[v1]].k2;
qu.k3_txt.text = t_arr[result_arr[v1]].k3;
v1++;
next_btn.onRelease = function() {
 if (qu.A_btn.selected == true) {
  mykey_arr[v1-1] = "A";
 }
 if (qu.B_btn.selected == true) {
  mykey_arr[v1-1] = "B";
 }
 if (qu.C_btn.selected == true) {
  mykey_arr[v1-1] = "C";
 }
 if (v1  qu.A_btn.selected = false;
  qu.B_btn.selected = false;
  qu.C_btn.selected = false;
  qu.t_txt.text = t_arr[result_arr[v1]].question;
  qu.k1_txt.text = t_arr[result_arr[v1]].k1;
  qu.k2_txt.text = t_arr[result_arr[v1]].k2;
  qu.k3_txt.text = t_arr[result_arr[v1]].k3;
  v1++;
 } else {
  qu.removeMovieClip();
  nextFrame();
 }
};

第四帧为检测和显示结果,用一动态文本框显示成绩,变量名为total.
 

AS: var total = 0;
for (var i = 0; i if (mykey_arr[i] == key_arr[i]) {  //你做的结果和答案对比
  total += 10;
  //每题10分
 }
}
replay_btn.onRelease=function(){   //放上重新做一次的按纽
 gotoAndStop(1);

好了,一个简单的在线考试系统做好了,测试一下吧,你也可以按以上方法自己做个来试试。

标签:Flashxml考试系统
分类:Flash源文件| 发布:cmx| 查看: | 发表时间:2011-9-22
原创文章如转载,请注明:转载自Flash课件网 http://www.flashkj.com/
本文链接:http://www.flashkj.com/flashsc/142.html

已经有 ( 0 ) 位网友发表了评论,你也评一评吧!

Design By Flashkj.Com | Login | Power By Chen Feiyang.