AS3将XML解析为多维数组?
我使用以下代码加载XML im闪存: 示例XML文件:AS3将XML解析为多维数组?,xml,flash,actionscript-3,parsing,Xml,Flash,Actionscript 3,Parsing,我使用以下代码加载XML im闪存: 示例XML文件: <playlist> <track> <title>TestTrack 1</title> <band>Band1</band> <file>test1.mp3</file> </track> <track> <title>
<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>
测试轨道1
波段1
test1.mp3
测试轨道2
波段2
test2.mp3
测试轨道3
波段3
test3.mp3
测试轨道4
波段4
test4.mp3
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());
}
}
var-xmlLoader:URLLoader=new-URLLoader();
addEventListener(Event.COMPLETE,showXML);
load(新的URL请求(“playlas3.xml”);
函数showXML(e:Event):void{
XML.ignoreWhitespace=true;
var:XML=newxml(e.target.data);
trace(songs.track.length());
变量i:数量;
对于(i=0;i
这里一切正常,但我想做的不仅仅是跟踪结果。
我希望将结果存储在对象或数组中,并从其他函数访问它
我的问题是,如果我想从其他函数中使用XML数据,如何存储它?据我所知,您只想解析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
}
var:XML;
var songsObj:Object=新对象();
函数showXML(e:Event):void{
XML.ignoreWhitespace=true;
songs=新的XML(e.target.data);
var len:int=songs.track.length();
对于(var i:int=0;i,据我所知,您只需要解析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
}
var:XML;
var songsObj:Object=新对象();
函数showXML(e:Event):void{
XML.ignoreWhitespace=true;
songs=新的XML(e.target.data);
var len:int=songs.track.length();
对于(var i:int=0;i而言,我认为存储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
在我看来,存储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
如何在自定义查找中使用“songs”XML。很抱歉问了一个愚蠢的问题,但我不熟悉as3:(.如果您有变量“songs”在函数外部,可以从该时间轴上的所有自定义函数中访问它。我假设您没有使用类,而是将脚本放在时间轴上。而不是使用“songsObj[0].song”,它将是“songs.track[0].title.text()。我已经用另一个自定义函数更新了上面的代码。您可以看到仅使用XML或使用对象的两种方法。我如何在自定义函数中使用“songs”XML。很抱歉问了一个愚蠢的问题,但我不熟悉as3:(.如果您有变量“songs”在函数外部,可以从该时间轴上的所有自定义函数中访问它。我假设您没有使用类,而是将脚本放在时间轴上。而不是使用“songsObj[0].song”,它将是“songs.track[0].title.text()。我已经用另一个自定义函数更新了上面的代码。您可以看到仅使用XML或使用对象的两种方法。