首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3将XML解析为多维数组?

AS3将XML解析为多维数组?
EN

Stack Overflow用户
提问于 2011-07-05 18:24:22
回答 2查看 4K关注 0票数 0

我使用这段代码加载XML:

示例XML文件:

代码语言:javascript
复制
<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来源:

代码语言:javascript
复制
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数据,如何存储它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-05 20:30:53

在我看来,最好的存储xml数据的方法是使用类,请看下面的示例:

代码语言:javascript
复制
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

在document类Main中,有一个带有播放列表xml数据的playlistXml对象(因为我不想使代码比原来的代码更大,所以没有将代码加载)。

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

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

代码语言:javascript
复制
var track:Track = playlist.getTrackByTitle("TestTrack 1");            
trace(track.band); // output: Band1
票数 1
EN

Stack Overflow用户

发布于 2011-07-05 18:38:41

据我所理解,您只想解析xml并将内容放入对象中。就像这样:

代码语言:javascript
复制
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
}

我不确定这是否是您要寻找的内容,或者您希望如何从其他functions...but访问数据,您也可以只使用“歌”XML变量,而不是创建一个实质上重复XML中存在的数据的对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6587121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档