让Flash更好的利用Xml

news/2025/2/8 11:01:07

英文原文地址:

http://www.darronschall.com/weblog/archives/000065.cfm

  在网上许多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解释的速度和可读性。你们许多人也许已用过这种方法,但我想在这里写一下,因为这种方法并不是每个人都知道的


http://www.niftyadmin.cn/n/530354.html

相关文章

数组(随机生成一维数组),二维数组的概念和题目设计(利用二维数组 :任意给定分数去计算科目和人均平均分)...

1 //数组间的关系arr[]中的数字为几&#xff0c;[]内就有几个数2 //{ }内的数是从0开始&#xff0c;如需要打印应从0开数3 如{2,6,9,8,7}打印arr[4]就是74 #include <stdio.h>5 #include <stdlib.h>6 int main()7 {8 int arr[] { 1,2,3,4,8};9 10 …

mysql5.6备份脚本_实战:INNOBACKUPEX for mysql 5.6自己主动备份脚本

#backup.sh#!/bin/sh## 第一次运行它的时候它会检查是否有全然备份,否则先创建一个全库备份# 当你再次执行它的时候。它会依据脚本中的设定来基于之前的全库备份进行增量备份#ocpyang126.comINNOBACKUPEX_PATHinnobackupex #INNOBACKUPEX的命令INNOBACKUPEXFULL/usr/bin/$INNO…

flash读取xml简明实例教程

----------------------------flash读取xml简明实例教程 --------------------------****************************************************************一、建立XML对象&#xff1a; var myXML new XML();二、引用XML文件&#xff1a; myXML.load("data.xml");三、…

单例模式双重校验_面试官:你知道双重加锁单例模式为什么加volatile关键字吗?...

单例模式的实现上面代码是一个经典的单例的双重监测的代码&#xff0c;这段代码在单线程环境下并没有什么问题&#xff0c;但如果在是多线程环境下就可能出现线程安全问题。多线程不安全的原因上面代码不安全的原因如下&#xff1a;当某一个线程执行到第一次监测&#xff0c;读…

好用的XML/SWF Charts图表組件

俗话说&#xff1a;“一画抵千言”。这句话很难反驳&#xff0c;尤其是在谈论图形的时候。然而一直以来&#xff0c;在 Web 上画图并非易事。虽然有些 Web 框架包括了一些用于构建图像的基本图形&#xff0c;但大多数 Web 框架都缺少即开即用的画图工具。这种功能的缺失使您必须…

flash与数据库的连接

确切地说..flash是不可以直接与数据库连接的.只能是通过ASP(只是我比较了解ASP,也可以是其他的PHP/JSP等);所以呢.首先,先在ASP里编写好连接数据库的语句 <% dim cn dim connstr dim db db"asp.mdb" Set cn Server.CreateObject("ADODB.Connection") c…

mysql数据库中发布与订阅_SQL SERVER 使用订阅发布同步数据库 【推送订阅】

一、数据库复制涉及1、发布服务器&#xff1a;数据的来源服务器&#xff0c;维护源数据&#xff0c;决定哪些数据将被分发&#xff0c;检测哪些数据发生了修改&#xff0c;并将这些信息提交给分发服务器。2、分发服务器&#xff1a;分发服务器负责把从发布服务器拿来的数据传送…

React 特性剪辑(版本 16.0 ~ 16.9)

Before youre going to hate it, then youre going to love it. Concurrent Render(贯穿 16) 在 18年的 JSConf Iceland 上, Dan 神提到 Concurrent Render 涉及到 CPU 以及 IO 这两方面。 Time Slicing 对应解决左侧的问题, Suspense 对应解决了右侧的问题。它们共同要解决的是…