Flash 在自定义XML类中调用方法将返回null

Flash 在自定义XML类中调用方法将返回null,flash,actionscript-3,Flash,Actionscript 3,我试图调用一个具有一些xml功能的方法,但它总是出现空值。我想做的是;我有一个页面,其中有四个动态文本字段,它们从xml文件中获取内容。我想创建一个方法,输出要在动态字段中显示的内容。也许我的方法与此相去甚远,但我的主管希望所有与xml相关的任务都包含在xml.as文件中 梅因 package classes { import flash.display.*; import flash.events.*; import classes.Xml; /* my custom

我试图调用一个具有一些xml功能的方法,但它总是出现空值。我想做的是;我有一个页面,其中有四个动态文本字段,它们从xml文件中获取内容。我想创建一个方法,输出要在动态字段中显示的内容。也许我的方法与此相去甚远,但我的主管希望所有与xml相关的任务都包含在xml.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 xml.@title; /* 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>

试试这个:

Main.as(文档类):

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 = _xml.@title; 
            }
            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()
getter方法中的
try
catch
,我就把它放在那里,这样如果您在加载xml文件并将其分配给它之前尝试访问
\uXML
属性的任何成员,就不会出现严重的
类型错误

[更新]

仔细想想,try-and-catch是不必要的,使用如下条件语句会更容易:

public function get title():String 
{
    return (_xml) ? _xml.@title : null;

}// end function

因为您试图在url加载程序加载xml文件之前访问xml对象,但真正的问题是,为什么您的
xml
类子类
MovieClip
?问得好,但不知道这个问题。我看过一些xml示例,它似乎最常用
EventDispatcher
。这就是我应该使用的,还是有更好的选择?谢谢,非常好。事实上,我找到了另一种方法,我一直在发布新代码,直到看到你的回复。我真的更喜欢你的代码,所以我打算使用它。非常感谢你的帮助,这对我帮助很大;为什么对于我的子类,
Sprite
MovieClip
更好?它不会,我为
CourseXML
扩展了
EventDispatcher
。正是为了文档类,我扩展了
Sprite
,而不是
MovieClip
。最好不要在文档类中使用
MovieClip
附带的任何额外属性和方法。事实上,我是个白痴,我不需要try-and-catch,只需要一个if语句来测试
\u-xml
是否为null,现在就要更改它。非常感谢,非常好的工作。我还没有机会玩它,但明天当我开始工作的时候,我就开始玩它了。感谢您抽出时间帮助我:-)
public function get title():String 
{
    return (_xml) ? _xml.@title : null;

}// end function