Возврат объекта XML после загрузки его данных - PullRequest
0 голосов
/ 23 марта 2012

Я создал класс, который загружает данные из XML-файла.

Мой файл gameObject.xml:

<?xml version="1.0" encoding="utf-8" ?>
<xml>
    <player>
        <health>100</health>
        <speed>200</speed>
    </player>
    <enemy>
        <health>50</health>
    </enemy>
</xml>

Класс XmlDataLoader загружает данные из xml, чтобы другие классы могли получить к ним доступ. Например. Игрок получает доступ к данным из тега игрока, врагу из тега противника и т. д. ...

Дело в том, что я не знаю, как вернуть объект XML только после загрузки данных XML.

Всякий раз, когда я отслеживаю m_xmlData вне этого класса, он всегда дает мне null. Я уже инициализировал XmlDataLoader перед передачей его другим классам.

Вот мой XmlDataLoader класс:

public class XmlDataLoader
{
   private var m_xmlData:XML = null;
   private var m_urlLoader:URLLoader = null;

   public function XmlDataLoader()
   {

   }

   public function initialize(sUrl:String = ""):void
   {
      if (!m_urlLoader)
      {
         if (sUrl == "")
         {
            m_urlLoader = new URLLoader(new URLRequest("gameObjectProperties.xml"));
         }
         else
         {
            m_urlLoader = new URLLoader(new URLRequest(sUrl));
         }

         if (!m_urlLoader.hasEventListener(Event.COMPLETE))
         {
            m_urlLoader.addEventListener(Event.COMPLETE, loadXml);
         }
      }
   }

   public function destroy():void
   {
      if (m_urlLoader)
      {
         if (m_urlLoader.hasEventListener(Event.COMPLETE))
         {
            m_urlLoader.removeEventListener(Event.COMPLETE, loadXml);
         }

         m_urlLoader = null;
      }

      if (m_xmlData)
      {
         m_xmlData = null;
      }
   }

   public function get xmlData():XML
   {
      return m_xmlData;
   }

   private function loadXml(e:Event):void
   {
      m_xmlData = new XML(e.target.data);

      if (m_urlLoader)
      {
         if (m_urlLoader.hasEventListener(Event.COMPLETE))
         {
            m_urlLoader.removeEventListener(Event.COMPLETE, loadXml);
         }

         m_urlLoader = null;
      }
   }

}

Заранее благодарю за помощь.

1 Ответ

1 голос
/ 23 марта 2012

Это ноль, потому что вы устанавливаете как ноль при определении переменной.
Вы не показали никакого кода, который показывает, как вы получаете доступ к данным.
Поэтому я предполагаю, что вы ищете данные до завершения загрузки.

Вы должны заново отправить событие в функцию loadXml

this.dispatchEvent( e );

// and out side the class you should have something like
var myDataLoader:XmlDataLoader = new XmlDataLoader()
    mydataLoader.addEventListener( Event.COMPLETE, gotData )

function gotData( e:Event ):void{
  trace( e.currentTarget.xmlData )
}
...