2013-01-02 61 views
1

我正在使用AS3在Flash Builder上制作测验应用程序。AS3无法加载XML文件

我想加载一个XML文件来获得我的问题。但我想我无法加载我的XML文件。我GOOGLE了很多。我搜索了论坛。但没有任何工作。我只是在这里看不到我的错误。

当我点击按钮,我想在我的舞台上看到如果我的XML文件已加载。但在这种情况下,我的舞台上没有任何价值。

Quiz.as

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); 
     } 

    } 
} 

Question.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> 

回答

2

的问题是您对textLoaded回调,但你是不是等待它加载,然后再调用getter()。先试试这个:

public function get getter():String { 
    if(test) { 
     return test.questionText; 
    } else { 
     return "Data not available"; 
    } 

但是你也可以传递一个函数引用给Question类,以便在加载时传递值。在任何情况下,您都可以考虑预先加载问题。

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); 
    } 

您可能希望制作textfield和question类属性,并且不要将作用域保留在函数的本地,以便您访问它们。

+0

修好这个有什么好运气? – Gone3d