新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 关于 XML 的一般性技术讨论,提供 XML入门资料 和 XML教程
    [返回] 计算机科学论坛XML.ORG.CN讨论区 - XML技术『 XML基础 』 → FLASH+XML专题[三] 让Flash更好的利用Xml 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3357 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: FLASH+XML专题[三] 让Flash更好的利用Xml 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     小鞋子 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      头衔:大法師
      等级:大二期末(Java考了96分!)
      文章:353
      积分:958
      门派:XML.ORG.CN
      注册:2003/12/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给小鞋子发送一个短消息 把小鞋子加入好友 查看小鞋子的个人资料 搜索小鞋子在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看小鞋子的博客楼主
    发贴心情 FLASH+XML专题[三] 让Flash更好的利用Xml

    在网上许多XML的解释数据都涉及到在FLASH不断地从一个XML文档中读取节点树来释放数据。这种做法有两个不足的地方:速度和可读性。下面我将教大家一种不是新的,但是,更可用的方法。

    首先,所谓分析XML就是从一个XML文档中释放数据,并创建一个内部的数据代表。我们通常的做法是加载一个XML文件,并创建一个数组对象来装载里面的数据以便为我们在FLASH中使用。

    我们解释XML文档并把数据装载到数组对象中的原因是多方面的。我们可以节省我们的内存空间,因为XML对象在FLASH是有一点巨大,而且当我们需要用到已加载的XML文件的数据时,我们可以提高数据的访问速度。另外,用playlist_array[1]来表示数组总比在XML文档中找数据来得方便一点。

    下面我们开始吧,我们先看一个在XML文件,这个文件是做一个FLASH的MP3播放器时得用到的。下面是我们的文件,名为playlist.xml:

    <xml version="1.0"?>
    <playlist>
    <track>
    <artist><![CDATA[Some Band #1]]></artist>
    <name><![CDATA[Some band's song]]></name>
    <location><![CDATA[some_band_1.mp3]]></location>
    </track>

    <track>
    <artist><![CDATA[Some Band #2]]></artist>
    <name><![CDATA[Some band #2's song]]></name>
    <location><![CDATA[some_band_2.mp3]]></location>
    </track>
    </playlist>

    在上面的XML文件中,我们声名了一个带有两个轨道(track)的播放列表(playlist),每个轨道(track)里有一个歌手名(artist name),歌名(song name),还有mp3文件的地址(location),这些我们都可以动态地载入。下面是我们经常用到的XML的解析方法:

    playlist_arr = new Array();
    playlist_xml = new XML();
    playlist_xml.ignoreWhite = true;
    playlist_xml.onLoad = function(success) {
    if (success) {
      var startTime = getTimer();
      
      var tracks_xml = playlist_xml.firstChild;
      for (var i = 0; i < tracks_xml.childNodes.length; i++) {
       var trackData = new Object();
       for (var j = 0; j < tracks_xml.childNodes[i].childNodes.length; j++) {
        trackData[tracks_xml.childNodes[i].childNodes[j].nodeName] = tracks_xml.childNodes[i].childNodes[j].firstChild.nodeValue;
        }
       playlist_arr.push(trackData);
       }
      
      trace("Total parse time: " + (getTimer()-startTime));
      
      } else {
      trace("Error loading playlist.");
      }

             // clean up after ourselves
             delete playlist_xml;
    }
    playlist_xml.load("playlist.xml");


    上面的代码解释了我们的XML文件并创建了一个对组对象。如果在这之前你从来没有处理过XML数据理解这段代码是有点困难的。当解释完成了以后,如果我们要访问第一个轨道的mp3文件的地址我们会用“playlist_arr[0].location”,这里就会得到他的正确的地址。而对我们来说,我们可以把这个做得更好……

    上面那段代码,在我的机子上,用了5毫秒去解除。这里并不怎么样,但不要忘了我们只是解释了两个轨道而已。

    下面是一个更好的释放相同数据的方法,而不用依靠循环地读取子节点:


    playlist_arr = new Array();

    playlist_xml = new XML();
    playlist_xml.ignoreWhite = true;
    playlist_xml.onLoad = function(success) {
        if (success) {
            var startTime = getTimer();
            
            var track_xml = playlist_xml.firstChild.firstChild;
            while (track_xml != null) {
                // add the track data to our playlist!
                playlist_arr.push(getTrackData(track_xml));
                track_xml = track_xml.nextSibling;
            }
            
            trace("Total parse time: " + (getTimer()-startTime));
            
        } else {
            trace("Error loading playlist.");    
        }
        
        delete playlist_xml;
    }

    function getTrackData(track_xml) {
        var trackData = new Object();
        
        var data_xml = new XML();
        
        data_xml = track_xml.firstChild;
        while (data_xml != null) {
            trackData[data_xml.nodeName] = data_xml.firstChild.nodeValue;
            data_xml = data_xml.nextSibling;
        }
        
        return trackData;
    }

    playlist_xml.load("playlist.xml");


    上面这个方法,我们可以得到相同的结果,但是却快了一点,可读性高了一点。在我的机子上只用了2毫秒来解释这两条轨道信息并装载到playlist数组。

    5毫秒和2毫秒可能差别不大……如果我使到这个播放列表有20条轨道时,第一种处理方法用了113毫秒,而第二种方法则只用了20毫秒。是不是有觉得有点不一样?

    在这个例子中我给代码加了注释。我们最主要就是理解XML对象的onload事件。注意到我在第二种方法通过建立一个getTrackData函数使代码更可读了吗?这里面获得一个节点对象作为参数并返回一个代表着轨道信息的对象。

    不用在节点中频繁地读取每一个元素,我在这里只用了两个XML在FLASH中的属性,firstChild和nextSlibling。即首节点和下一个节点或元素。在循环开始之前,我去掉了所有的东西,只把首点节点作为一个XML值(在例子中为track_xml)。然后,我们的循环是简单:当有节点的时后,我们释放信息。在循环的结尾,我们已得到了数据,并使XML值跳到下一个节点。当下一个节点的值回值为空时,表示没有信息去处理,我们退出循环。

    现在你已看到了一个截然不同的XML对象的解释方法。不用依靠读取子节点,我们利用nextSibling的优点来提高XML解释的速度和可读性。你们许多人也许已用过这种方法,但我想在这里写一下,因为这种方法并不是每个人都知道的。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    本人只會一點點XML.
    和ASP.以及FLASH.其它都不太懂.

    大家多多指教.

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/3/22 22:11:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML基础 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/7/17 13:35:40

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms