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