2011-07-05 63 views
0

我使用此代码加载XML IM闪存:AS3将XML解析为多维数组?

示例XML文件:

<playlist> 
    <track> 
     <title>TestTrack 1</title> 
     <band>Band1</band> 
     <file>test1.mp3</file> 
    </track> 
    <track> 
     <title>TestTrack 2</title> 
     <band>Band2</band> 
     <file>test2.mp3</file> 
    </track> 
    <track> 
     <title>TestTrack 3</title> 
     <band>Band3</band> 
     <file>test3.mp3</file> 
    </track> 
    <track> 
     <title>TestTrack 4</title> 
     <band>Band4</band> 
     <file>test4.mp3</file> 
    </track> 
</playlist> 

AS3来源:

var xmlLoader:URLLoader = new URLLoader(); 
xmlLoader.addEventListener(Event.COMPLETE, showXML); 
xmlLoader.load(new URLRequest("playlistAS3.xml")); 

function showXML(e:Event):void { 

    XML.ignoreWhitespace = true; 
    var songs:XML = new XML(e.target.data); 
    trace(songs.track.length()); 
    var i:Number; 

    for (i=0; i < songs.track.length(); i++) { 
     trace(" Name of the song: "+ songs.track[i].title.text()); 
     trace(" Name of the Band: "+ songs.track[i].band.text()); 
     trace(" File Location of the song: "+ songs.track[i].file.text()); 
    } 
} 

这里一切正常,但我想,以做多只是追踪结果。 我想将结果存储在一个对象或数组中,并从其他函数中访问它。

我的问题是如何存储XML数据,如果我想从其他功能使用它?

回答

1

存储XML数据的最佳方式是在我看来课,看看下面的例子中,我提出:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var playlistXml:XML = <playlist> 
            <track> 
             <title>TestTrack 1</title> 
             <band>Band1</band> 
             <file>test1.mp3</file> 
            </track> 
            <track> 
             <title>TestTrack 2</title> 
             <band>Band2</band> 
             <file>test2.mp3</file> 
            </track> 
            <track> 
             <title>TestTrack 3</title> 
             <band>Band3</band> 
             <file>test3.mp3</file> 
            </track> 
            <track> 
             <title>TestTrack 4</title> 
             <band>Band4</band> 
             <file>test4.mp3</file> 
            </track> 
           </playlist>; 

      var playlist:Playlist = new Playlist(playlistXml); 

      var track:Track = playlist.getTrackByTitle("TestTrack 1"); 
      trace(track.band); // output: Band1 


     }// end function 

    }// end class 

}// end package 

internal class Playlist 
{ 
    private var _tracks:Vector.<Track>; 

    public function Playlist(playlistXml:XML) 
    { 
     _tracks = new Vector.<Track>(); 

     for each(var track:XML in playlistXml.children()) 
     { 
      _tracks.push(new Track(track.title, track.band, track.file)); 

     }// end for each 

    }// end function 

    public function getTrackByTitle(title:String):Track 
    { 
     var track:Track; 

     for each(var t:Track in _tracks) 
     { 
      if (t.title == title) track = t; 

     }// end for each 

     if (!track) throw new Error("Could not find track with title " + "\"title\"."); 

     return track; 

    }// end function 

    public function getTrackByBand(band:String):Track 
    { 
     var track:Track; 

     for each(var t:Track in _tracks) 
     { 
      if (t.band == band) track = t; 

     }// end for each 

     if (!track) throw new Error("Could not find track with band " + "\"band\"."); 

     return track; 

    }// end function 

    public function getTrackByFile(file:String):Track 
    { 
     var track:Track; 

     for each(var t:Track in _tracks) 
     { 
      if (t.file == file) track = t; 

     }// end for each 

     if (!track) throw new Error("Could not find track with file " + "\"file\"."); 

     return track; 

    }// end function 

}// end class 

internal class Track 
{ 
    private var _title:String; 
    private var _band:String; 
    private var _file:String; 

    public function get title():String { return _title } 
    public function get band():String { return _band } 
    public function get file():String { return _file } 

    public function Track(title:String, band:String, file:String) 
    { 
     _title = title; 
     _band = band; 
     _file = file; 

    }// end function 

}// end class 

在文档类Main还有的playlistXml对象与播放列表的XML数据(没”不要让代码加载它,因为我不想让代码比以前更大,好吧)。

接下来是Playlist对象。这是一个类的对象,它处理分解xml中的跟踪节点并将它们存储在Track对象中。此外,Playlist类还有三种公共方法,分别称为getChildByTitle(),getChildByBand(),getChildByFile(),该方法通过相应方法搜索指定的轨道。

这种方法的优点是它创建了一个强大的结构来存储您的数据,并允许一个简单的方法来检索它。

var track:Track = playlist.getTrackByTitle("TestTrack 1");    
trace(track.band); // output: Band1 
2

从我的理解,你只是想解析XML并把内容放入一个对象。事情是这样的:

var songs:XML; 
var songsObj:Object = new Object(); 

function showXML(e:Event):void { 
    XML.ignoreWhitespace = true; 
    songs = new XML(e.target.data); 
    var len:int = songs.track.length(); 
    for (var i:int = 0; i<len; i++) { 
     trace(" Name of the song: "+ songs.track[i].title.text()); 
     trace(" Name of the Band: "+ songs.track[i].band.text()); 
     trace(" File Location of the song: "+ songs.track[i].file.text()); 
     songsObj[i] = { 
      song:songs.track[i].title.text(), 
      band:songs.track[i].band.text(), 
      file:songs.track[i].file.text() 
     }; 
    } 
    customFunction(); 
} 

function customFunction():void { 
    trace(songs.track[0].title.text()); // traces TestTrack 1 
    trace(songsObj[0].song); // also traces TestTrack 1 
} 

我不知道如果这是你在找什么,或者你是如何想访问其他功能的数据......但是,你也可以只使用“歌曲“XML变量,而不是创建一个实质上复制XML中存在的数据的对象。

+0

如何在定制的Finctions中使用“歌曲”XML。对不起,愚蠢的问题,但我不熟悉as3 :(。 – Faraona

+1

如果你的函数以外有变量“歌曲”,那么它可以在该时间轴上的所有自定义函数中访问。不是使用Classes,而是将时间轴放在脚本上,而不是使用“songsObj [0] .song”,它会是“songs.track [0] .title.text()”。 – Corey

+0

Plese give me示例代码 – Faraona