我正在用 Actionscript 2 编写一个应用程序,它需要访问 XML 文件、获取其内容,然后使用该信息来填充一堆文本字段。这在基于帧的动作脚本中很简单,因为我所要做的就是停止做事,将下一步设置为从 XML.onLoad 函数运行,然后我就可以开始了。但是我正在用类文件重写这个东西,并且在调用依赖于它已经存在的函数之前,我很难让我的 XML 加载。
详细说明,
假设我有一堂课,Main。该类看起来像:
import XMLItems;
class Main {
private var _xmlItems:XMLItems;
public function Main() {
_xmlItems = new XMLItems();
_itemData = _xmlItems.getItemData();
}
到目前为止看起来还不错,对吧?它所做的只是创建一个新的 XMLItems 实例,然后调用该实例的 getItemData() 方法。
所以现在这里是 XMLItems:
import mx.xpath.XPathAPI;
import XMLLoader;
class XMLItems {
private var _loader:XMLLoader;
private var _itemData:XML;
private var _eventPath:String = "/*/dbresult/playlist/";
public function XMLItems() {
trace('XMLItems object instantiated.');
}
private function parseItemData(itemData:XML):Array {
var nodes:Array = XPathAPI.selectNodeList(itemData, _eventPath + "item");
return nodes;
}
public function getItemData():Array {
_loader = new XMLLoader();
_itemData = _loader.getXML();
var r:Array = parseItemData(_itemData);
return r;
}
}
所以现在我们有了一个 XMLLoader 对象,以便我们可以调用该 getXML 函数(别担心,最后一个):
import mx.xpath.XPathAPI;
class XMLLoader {
private var _rawXML:XML;
private var _xmlLocation:String = '';
private var _recommendRequestURL:String;
private var _xmlIsLoaded:Boolean = false;
private var _eventPath:String = "/*/dbresult/playlist/";
public function XMLLoader() {
trace('Instantiating XML loader...');
_recommendRequestURL = _root.recmReqUrl ? _root.recmReqUrl : escape('http://www.myURL.com/');
_rawXML = new XML();
_rawXML.ignoreWhite = true;
var host = this;
_rawXML.onLoad = function(success:Boolean) {
if (success) {
_xmlIsLoaded = true;
trace('XML data was successfully loaded.');
var nodes:Array = XPathAPI.selectNodeList(host._rawXML, host._eventPath + "item");
trace("Number of XML nodes: " + nodes.length);
trace("Sample node: " + nodes[nodes.length - 1]);
} else {
trace('There was an error loading the XML. Please check the XML file.');
}
}
loadXML();
}
private function loadXML():Void {
var xmlLocation:String;
if ( !_root.recmReqUrl ) {
trace("There is no network address for the XML file. Defaulting to local settings.")
xmlLocation = './localBannerData.xml';
} else {
xmlLocation = _recommendRequestURL.concat( '&spec=', 'specInfo', 'getCatInfo()', 'getXCatInfo()', '&t=', new Date().getTime() );
}
if ( _rawXML.load( xmlLocation ) ) {
trace('Loading XML file: ' + xmlLocation);
} else {
trace('I\'m having difficulty finding the XML. You might want to check your data source.')
}
}
public function getXML():XML {
return _rawXML;
}
}
问题是当调用 getXML 函数时,XML 还没有加载。所以该方法将一个空的 XML 对象返回给 XMLItems 类,即使我这样做了:
_loader = new XMLLoader();
_itemData = _loader.getXML();
尽管我的意思是构造函数必须在评估下一条语句之前完成运行。显然它没有。
我尝试创建一个由 onLoad 函数设置的布尔值,并在 getXML 方法中(在方法返回之前)放置一个 while (true) 循环,以检查该布尔值并在它返回 true 时中断,但它从未返回 true,所以它只是永远循环。
我真的不明白这里发生了什么。为什么我不能让班级同步请求 XML 并在 XML 进来之前冷静下来?
谢谢,SS