明确地。
读取 XML
var myLoader:URLLoader = new URLLoader();
myLoader.load(new URLRequest("ui.xml"));
myLoader.addEventListener(Event.COMPLETE, processXML);
function processXML(e:Event):void {
var xml:XML = new XML(e.target.data);
trace(xml.layout.widget[2].attribute.@value); // traces "picker.swf"
}
读取 xml 对象很像读取任何其他层次结构,使用 dot.notation、bracket[indexes],但添加了一个 @attribute 标识符来访问节点上的属性。这也有点奇怪,因为只是识别(通常)xml.layout.widget
实际上会将小部件的每个实例及其内容作为字符串返回。
阅读这些以获得完整的文档:
代码共和国:AS3 XML
Adobe Actionscript 3 参考:XML
渲染
渲染这些小部件取决于您如何解释数据。从技术上讲,您可以尝试通过htmlwrapper或htmlText进行有限数量的 HTML 渲染,但我怀疑您是否愿意这样做。更有可能的是,您将在 Flash 中创建自己的小部件表示,并在 XML 中定义这些小部件的一般偏差。
考虑以下 XML:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<widget
kind="Spinner"
name="Alpha"
color="0xFF0000"
x="100"
y="100"
width="50"
height="50"
file="foo.jpg" />
<widget
kind="Slider"
name="Beta"
color="0x0000FF"
file="bar.swf" />
</layout>
然后我们可以实现两个类:它们具有预定义的属性Spinner
和Slider
事件监听器。
package {
import flash.display.*;
public class Spinner extends Sprite {
private var defaults:Object = {
"x":10,
"y":10,
"width":50,
"height":50,
"color":0x000000
};
public function Spinner(settings:Object = null) {
// Store the settings passed for any present defaults
for (var attribute:String in settings) {
if (defaults.hasOwnProperty(attribute)) {
defaults[attribute] = settings[attribute];
}
}
// Update the appearance to match the settings.
with (defaults) {
graphics.beginFill(color, 1);
graphics.drawRect(x, y, width, height);
graphics.endFill();
}
if (settings.hasOwnProperty("name")) {
this.name = settings.name
}
}
}
}
当我们读取 XML 时,我们会遍历每个节点并提取该节点的属性并将其应用于类构造函数......
function processXML(e:Event):void {
var layout:XML = new XML(e.target.data);
for each (var widget:Object in layout) {
switch (widget.kind) {
case "Spinner":
addChild(new Spinner(widget))
break;
case "Slider":
addChild(new Slider(widget))
break;
}
}
}
免责声明:以这种方式访问 xml 节点可能不正确。将其视为伪代码。在使用它们之前,我总是将我的 xml 清理为嵌套对象/数组层次结构,所以我有点不习惯。
简而言之,XML 规定了我们对象的外观,但 Actionscript 规定了这些对象是什么以及我们何时/如何将它们添加到屏幕上。