主题:  在FLASH中读取XML类型文件

another

职务:普通成员
等级:1
金币:0.0
发贴:59
注册:2001/5/24 14:23:14
#12001/7/13 13:52:10
XML是一种比较新的数据储存格式。它使用树状结构的标签对数据进行格式化。这种方法和传统的HTML非常的类似,但XML的标签却是可以非常随意的由用户自定义,甚至我们可以使用中文等双字节编码文字作为XML标签。比如,我们可以建立以下一个XML文件:

<好友>
<编号 n="1">
<姓>王〈/姓〉
〈名〉磊〈/名〉
〈性别〉男〈/男〉
〈/编号〉


对于这样的一个文件,脉络清晰,即使是不懂网络知识的人也可以轻易的从中找到大部分的信息。同时,XML在结合了CSS,XSL,ASP,PHP后更是在信息检索中展现了自己的特长。这几年来,有目共睹的,XML越来越受到了大家的青睐。

在FLASH5中我们终于可以通过其新增的函数非常方便的读取XML文件了。于是,我们可以很方便的为我们的电影夹、动态文本框指定一个外部的数据源。我们以后需要修改这些部分的数据的时候,不需要用FLASH再次编辑,FLASH电影自己就已经根据当前的XML数据源更新过了。

甚至,我们通过在ACTION SCRIPT中对XML的操作甚至可以实现一些数据库检索的功能,而这样的功能却完全不需要数据库服务器的支持,于是我们不需要去专门寻找一个支持ASP的空间啦!听我这么说了以后你有没有动心呢?以下的部分我假定你已经对FLASH的ACTIONSCRIPT已经有了一定的了解。(实际上你如果学过C语言的话,很容易就能看懂ACTION SCRIPT的语句。)同时,建议大家要对其中的数组要有一定认识,因为我们后面的XML操作始终在应用到数组,我们读取到的XML信息都要保存在一个数组当中。

如果一切准备就绪,OK!NOW,LET'S GO!

首先,这些是我们将要用到的ACTION SCRIPT关于XML操作的函数:

load 载入文档 ( XML 对象指定的) .
onLoad load 和 sendAndLoad的回收函数.
loaded 测试指定 XML 对象是否被载入.
firstChild 指向指定节点子目录中第一个子节点. (如上面的XML中“姓”就是“编号”的firstChild)
lastChild 指向指定节点子目录中最后一个子节点.
nextSibling 指向父节点子目录中下一个同级节点.(如“名”相对于“姓”就是nextSibling)
previousSibling 指向父节点子目录中上一个同级节点.
nodeName 返回XML元素的标签名.(如“编号”的firstChild.nodeName就是“姓”)
nodeType 返回指定节点的类型(XML 元素或 text 节点).
nodevalue 如果指定节点是正文节点, 返回它的文本.(如“编号”的firstChild.nodevalue就是“姓”的文本“王”)
attributes 返回一个包含指定节点所有属性的数组.(如“编号”的属性就是“n=1”)
childNodes 返回一个包含指定节点所有子节点的数组.(如“编号”的childNodes就包含了“姓”、“名”、“性别”)
parentNode 指向指定节点的父节点.

然后,为了你能够在实验中学习XML,你应该自己写一个XML文件。这样的一个文件应该说书写起来很自由,要注意的就是:所有的标签都必须成对出现——你写了〈某标签〉,就一定不要忘了写〈/某标签〉;如果标签仅需要属性,不需要文本,那么标签可以只写一个,格式为〈某标签 某属性="" /〉——请一定要给属性用""号引起来。以下是一个moreover.xml的部分内容:







http://c.moreover.com/click/here.pl?x13177340

Microsoft Signs Pact With Electronic Arts To Develop Games for Its X-Box Console








http://c.moreover.com/click/here.pl?x13176678

Attorney general says children have easy access to violent video games





http://c.moreover.com/click/here.pl?x13171767
Nintendo generation piling on the kilos





现在,我们有了以上的准备以后就可以正式的进入我们的实战了!下面的例子,我们是要读取一个数据坐标的XML文件,并显示在我们的一个文本框中。我们在FLASH场景中用TYPE工具拖出一个文本框,将TEXT OPTION设为Dynamic Text,Multiline,Variable我们设为content_feed_display。这样我们就可以通过content_feed_display="xxxx"来为文本框定义内容了。别忘了把HTML的复选框勾上,以便我们可以直接向文本框中写HTML代码。

在时间条当前帧上右击,吊出ACTION面板。我们开始写我们的读取语句:

urlXML = new XML(); //声明一个新的XML类对象。
urlXML.onLoad = convertXML; //载入文件时调用convertXML函数,


content_feed_display = "Loading data..."; //文本框提示用户等待
urlXML.load("moreover.xml"); //假设我们以后的.swf文件和.xml文件在同一个目录下。


function convertXML() {
if(this.loaded) {
content_feed_display = "Data loaded."; //读取结束时显示信息
}
mainTag = new XML;
elementTag = new XML;
articleList = new Array;
elementList = new Array;

//为了找到〈moreovernews〉标签,我们要跳过〈!DOCTYPE……〉的格式定义语句,使用nextSilbing
mainTag = this.firstChild.nextSibling;
//为保证我们找到正确的父节点(moreovernews),我们对其nodeName进行判断。toLowerCase是将字符串全部转换为小写。
if(mainTag.nodeName.toLowerCase() == "moreovernews") {
//然后我们把所有article元素赋予articleList数组
articleList = mainTag.childNodes;
//现在我们依次在各个article标签中检索
content_feed_display = "";
for(i=0;i<=articleList.length;i++){
//初始化两个变量,保存我们马上要显示的内容。
document_url = "";
headline_text = "";
if(articleList.nodeName.toLowerCase() == "article") {
//把范围缩小到一个article标签内部检索
elementList = articleList.childNodes;
//将需要的信息检索出来于headline_text和url中
for(j=0;j<=elementList.length;j++) {
elementTag = elementList[j];
elementType = elementTag.nodeName.toLowerCase();
if(elementType == "headline_text"){
headline_text = elementTag.firstChild.nodevalue;
} else {
if(elementType == "url"){
url = elementTag.firstChild.nodevalue;
}

}
}
//将检索出来的信息书写为HTML格式,显示在文本框中
content_feed_display += "

"+ headline_text +"

";
}
}
}
}

好了,好了,终于大功告成了。如果你耐心的看完了以上的源程序,你会发现一切真的就是这么简单,第一个IF循环找到〈moreovernews〉标签,给变量articleList依次装入各〈article〉标签所有子节点,然后在第二个IF循环中将〈headline〉〈url〉等同级子节点放入elementList变量中,根据标签名elementType的不同,把不同的标签中的内容elementTag给变量headline_text或url,最后整合显示出来。

如果我们给不同的按钮加上不同的检索、显示条件,那么我们的就可以动态的显示出我们需要的信息了。

#END



E人类

职务:普通成员
等级:1
金币:0.0
发贴:8
注册:2001/7/17 22:28:30
#22001/7/17 22:35:59
我学到东西了