上面的代码解释了我们的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解释的速度和可读性。你们许多人也许已用过这种方法,但我想在这里写一下,因为这种方法并不是每个人都知道的。
出处:闪客帝国
责任编辑:地狱天堂
上一页 让Flash更好的利用Xml 下一页
◎进入论坛Flash专栏版块参加讨论
|