AS3 can';无法加载XML文件
我正在用AS3在flash builder上制作一个测验应用程序 我想加载一个XML文件来获取我的问题。但是我想我无法加载我的XML文件。我在谷歌上搜索了很多。我搜索了论坛。但什么都没用。我只是看不出我的错误 当我单击按钮时,我想在我的后台查看我的XML文件是否已加载。但在这种情况下,我在舞台上没有任何价值 小测验AS3 can';无法加载XML文件,xml,actionscript-3,Xml,Actionscript 3,我正在用AS3在flash builder上制作一个测验应用程序 我想加载一个XML文件来获取我的问题。但是我想我无法加载我的XML文件。我在谷歌上搜索了很多。我搜索了论坛。但什么都没用。我只是看不出我的错误 当我单击按钮时,我想在我的后台查看我的XML文件是否已加载。但在这种情况下,我在舞台上没有任何价值 小测验 package { [SWF('width'= 800, 'height' = 600, 'frameRate'=40)] public class Quiz
package
{
[SWF('width'= 800, 'height' = 600, 'frameRate'=40)]
public class Quiz extends Sprite
{
// gloabal container
public static var container:Sprite = new Sprite();
// button object
public var btnMulti:MyButton = new MyButton();
public function Quiz()
{
init();
}
private function init():void {
addChild(container);
makeMenu();
}
private function makeMenu():void {
btnMulti.buttonText = "multipleChoice";
btnMulti.x = 50;
btnMulti.y = 20;
btnMulti.addEventListener(MouseEvent.CLICK, multiHandler);
// add button to the stage
container.addChild(btnMulti);
}
private function multiHandler(e:MouseEvent):void {
// if button clicked make a Question object
var q:Question = new Question();
// get the value
var questionText:String = q.getter;
// print the value in a textfield on the stage
var tField:TextField = new TextField();
tField.text = questionText;
container.addChild(tField);
}
}
}
问题.as
public class Question extends Sprite
{
private var test:String;
public function Question()
{
// xml
var urlReq:URLRequest = new URLRequest("./files/multiplechoice.xml");
var urlLoad:URLLoader = new URLLoader();
urlLoad.addEventListener(Event.COMPLETE, textLoaded);
urlLoad.load(urlReq);
}
private function textLoaded(e:Event):void {
XML.ignoreWhitespace = true;
var xml:XML = new XML(e.target.data);
// check if loaded
test = "xml loaded";
}
// getter
public function get getter():String {
return test.questionText;
}
}
multiplechoice.xml
<?xml version="1.0" encoding="UTF-8"?>
<multipleChoice>
<questionSet>
<question>Question 1</question>
<answer correct="yes">Answer 1</answer>
<answer>Answer 2</answer>
<answer>Answer 3</answer>
<answer>Answer 4</answer>
</questionSet>
<questionSet>
<question>Question 2</question>
<answer correct="yes">Answer 1</answer>
<answer>Answer 2</answer>
<answer>Answer 3</answer>
<answer>Answer 4</answer>
</questionSet>
<questionSet>
<question>Question 3</question>
<answer correct="yes">Answer 1</answer>
<answer>Answer 2</answer>
<answer>Answer 3</answer>
<answer>Answer 4</answer>
</questionSet>
</multipleChoice>
问题1
答复1
答复2
答复3
答复4
问题2
答复1
答复2
答复3
答复4
问题3
答复1
答复2
答复3
答复4
问题是您有一个已加载文本的回调,但在调用getter()之前,您没有等待它加载。先试试这个:
public function get getter():String {
if(test) {
return test.questionText;
} else {
return "Data not available";
}
但也可以将函数引用传递给问题类,以便在加载时将值传递回。您可能需要考虑在任何情况下预加载问题
public class Question extends Sprite
{
private var test:String;
private var callback:Function;
public function Question(_callback:Function)
{
this.callback = _callback;
// xml
var urlReq:URLRequest = new URLRequest("./files/multiplechoice.xml");
var urlLoad:URLLoader = new URLLoader();
urlLoad.addEventListener(Event.COMPLETE, textLoaded);
urlLoad.load(urlReq);
}
private function textLoaded(e:Event):void {
urlLoad.removeEventListener(Event.COMPLETE, textLoaded);
XML.ignoreWhitespace = true;
var xml:XML = new XML(e.target.data);
// check if loaded
this.callback(xml);
}
}
// in the main class
private function multiHandler(e:MouseEvent):void {
// if button clicked make a Question object
var q:Question = new Question(this.questionCallback);
}
public function questionCallback(xml:XML):void
// get the value from the xml
var tField:TextField = new TextField();
tField.text = <<parsed xml....>>;
container.addChild(tField);
}
公共类问题扩展了Sprite
{
私有var测试:字符串;
私有var回调:函数;
公共函数问题(_回调:函数)
{
this.callback=\u callback;
//xml
var urlReq:URLRequest=newurlrequest(“./files/multiplechoice.xml”);
var urlLoad:URLLoader=new URLLoader();
urlLoad.addEventListener(Event.COMPLETE,textLoaded);
加载(urlReq);
}
私有函数textLoaded(e:事件):void{
urlLoad.removeEventListener(Event.COMPLETE,textLoaded);
XML.ignoreWhitespace=true;
var xml:xml=新的xml(e.target.data);
//检查是否已加载
回调(xml);
}
}
//在班上
私有函数multiHandler(e:MouseEvent):void{
//如果单击按钮,则生成问题对象
var q:Question=新问题(this.questionCallback);
}
公共函数questionCallback(xml:xml):void
//从xml中获取值
var-tField:TextField=new TextField();
tField.text=;
container.addChild(tField);
}
您可能希望将textfield和question类属性设置为本地属性,而不是将作用域保留为函数的本地属性,以便您也可以访问它们