2011-09-07 8 views
0

xmlの機能を持つメソッドを呼び出そうとしていますが、nullが返され続けます。私がしようとしていることは、私はxmlファイルからコンテンツを取得する4つの動的テキストフィールドを持つページを持っています。私は動的なフィールドに表示する内容を出力するメソッドを作成したいと思います。たぶん私のアプローチはこちらから離れているかもしれませんが、私の上司はxml.asファイルに含まれるすべてのxml関連タスクを必要としています。カスタムXMLクラスでメソッドを呼び出すとnullが返されます

Main.as

package classes 
{ 
    import flash.display.*; 
    import flash.events.*; 

    import classes.Xml; /* my custom class */ 

    public class Main extends MovieClip 
    { 
     public function Main():void 
     { 
      var xml:Xml = new Xml("menu.xml"); 
      trace(xml.getCourseTitle()); 
     } 
    } 
} 

Xml.as

package classes 
{ 
    import flash.display.*; 
    import flash.net.*; 
    import flash.events.*; 

    public class Xml extends MovieClip 
    { 
     private var xml:XML; 
     private var loader:URLLoader = new URLLoader(); 

     public function Xml(p:String):void 
     { 
      loader.load(new URLRequest(p)); 
      loader.addEventListener(Event.COMPLETE,processXML); 
     } 
     public function processXML():void 
     { 
      xml = new XML(loader.data) 
      trace(xml); /* this will trace all xml data in xml file */ 
     } 
     public function getCourseTitle():String 
     { 
      return [email protected]; /* this is supossed to return Test Course */ 

     }  
    } 
} 

menu.xml

<?xml version="1.0"?> 
    <course title="Test Course"> 
     <folder name="Question 1" link="1_1.swf"/> 
    <folder name="Question 2" link="1_2.swf"/> 
    <folder name="Question 3" link="1_3.swf"/> 
    <folder name="Question 4" link="1_4.swf"/> 
    <folder name="Question 5" link="1_5.swf"/> 
    <folder name="Question 6" link="1_6.swf"/> 
    <folder name="Question 7" link="1_7.swf"/> 
    <folder name="Question 8" link="1_8.swf"/> 
    <folder name="Question 9" link="1_9.swf"/> 
    <folder name="Question 10" link="1_10.swf"/> 
    </course> 
+0

あなたがあなたにアクセスしようとしているのでxmlオブジェクトをロードする前に、あなたのXMLファイルを読み込んでいますが、実際の質問は、なぜ 'Xml'クラスが' MovieClip'のサブクラスですか? – Taurayi

+0

良い質問と質問を知らない。私はいくつかのXMLの例を見てきました、そして、それはほとんど 'EventDispatcher'を使用しているようです。これは私がこれに使用すべきものなのでしょうか、それとも良い選択肢がありますか?おかげで – Mike

答えて

1

代わりにこれを試してみてください:

Main.as(やりますcumentクラス):

package 
{ 
    import com.example.CourseXML; 
    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 courseXml:CourseXML = new CourseXML("xml/course.xml"); 
      courseXml.addEventListener(CourseXML.LOAD_COMPLETE, onCourseXmlLoadComplete); 
      trace(courseXml.title)// output: null 

     }// end function 

     private function onCourseXmlLoadComplete(e:Event):void 
     { 
      var courseXml:CourseXML = CourseXML(e.target); 
      trace(courseXml.title) // output: Test Course 

     }// end function 

    }// end class 

}// end package 

CouseXML.as

package com.example 
{ 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 

    public class CourseXML extends EventDispatcher 
    { 
     public static const LOAD_COMPLETE:String = "loadComplete"; 

     private var _urlLoader:URLLoader; 
     private var _xml:XML; 

     public function get title():String 
     { 
      var title:String; 

      try 
      { 
       title = [email protected]; 
      } 
      catch (e:TypeError) 
      { 
       title = null; 

      }// end catch 

      return title; 

     }// end function 

     public function CourseXML(url:String) 
     { 
      _urlLoader = new URLLoader(); 
      _urlLoader.addEventListener(Event.COMPLETE, onUrlLoaderComplete); 
      _urlLoader.load(new URLRequest(url)); 

     }// end function 

     private function onUrlLoaderComplete(e:Event):void 
     { 
      _xml = XML(URLLoader(e.target).data); 

      dispatchEvent(new Event(CourseXML.LOAD_COMPLETE)); 

     }// end function 

    }// end class 

}// end package 

あなたがCourseXMLオブジェクトのtitle()ゲッターメソッドでtrycatchに疑問を抱いて、私はあなたがそこにしようとすると、アクセスので、もしことを置く場合xmlファイルが読み込まれて割り当てられる前に_xmlのプロパティのメンバーのいずれかがあると、厄介なTypeErrorを取得しません。 tryおよびcatchが不要だった

[UPDATE]

考え直したら、次のような条件付きステートメントを使用する方が簡単だっただろう:

public function get title():String 
{ 
    return (_xml) ? [email protected] : null; 

}// end function 
+0

うわー、非常に良い。私は実際にそれを行う別の方法を考え出しました。私はあなたの応答を見るまで新しいコードを投稿していました。私はあなたのコードが本当に好きなので、私はそれを使用するつもりです。あなたの助けをありがとう、これは私をたくさん助けます。 – Mike

+0

私はあなたのために1つの質問があります。私のサブクラスで 'Sprite'が' MovieClip'より優れているのはなぜですか? – Mike

+0

私は 'CourseXML'に対して' EventDispatcher'を拡張しませんでした。ドキュメントクラスのために、 'MovieClip'の代わりに' Sprite'を拡張しました。ドキュメントクラスの 'MovieClip'に追加された追加のプロパティやメソッドが必要ない場合は、より良いことです。 – Taurayi

関連する問題