1

我正在创建一个项目,该项目允许我在 XML 文档中定义对象并让 flash 创建所需的项目并在运行时显示。毋庸置疑,这是缓慢的进步,我一直在学习。

我现在遇到了一个障碍,相比之下应该很容易。但我正在画一个空白。尽管与我的好朋友 Google 一起度过了几个小时,但我似乎无法用这样的方式来表达这一点,以便找到其他想要实现相同目标的人。

描述

目前我有一个菜单处理类,这就是问题所在。menuHandler 类的一个实例被创建。它通过调用传递两个字符串的类(LoadFramework)来使用。一个是 XML 文件的地址,另一个是 XML 文档中的标签,用于指定需要读取的部分。

XML 文档由一个类加载,然后解析为一个变量。然后根据传递的第二个字符串(XML 标记的值),将该 XML 文档的适当部分翻译到屏幕上。这一切都很好,但这里有一个问题......

我设法让这个工作的唯一方法是使用一个 switch 语句,每个潜在标签都有一个 case。然后我编写了一个适当的 for-each-in 循环。以下是其中一种 case 语句的示例(除了“event.dat.XYZ.element”部分之外,它们都是相同的)。“event.dat”是一个自定义处理程序传递的变量,它包含 XML 数据。XYZ 是标签的名称(在本例中为“home”),每个“元素”都是一个包含属性的标签。

case "home":
    for each (var menuField:XML in event.datPass.home.element) {
        mnDataHold.push(menuFieldHome);
        loopCount ++;
    } // for each (var menuField:XML in event.datPass.home)
    ActionMenu(loopCount);
break;

event.datPass 中保存的 XML 示例。

<home label="home">
    <element label="menuType">HomeScreen</element>
    <element label="screenType">Game.assets.menuScreens.homeScreen</element>
    <element label="buttonCoords">400,50,400,100,400,150,400,200</element>
    <element label="buttonNames">baseButton,baseButton,baseButton,baseButton</element>
    <element label="labelCoords">440,51,425,101,430,151,438,201</element>
    <element label="labelTexts">Play,Options,Credits,More</element>
    <element label="labelColors">0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF</element>
    <element label="labelSizes">22,22,22,22</element>
    <element label="labelBolds">true,true,true,true</element>
    <element label="buttonCommands">startGame,diplaysMnuOptions,displayMnuCredits,displayMnuMoreGames</element>
</home>

想要做的是用变量替换 for-each-in 循环中的部分或全部对象,然后将字符串作为引用而不是使用它作为值。

这样我就可以最终放弃开关,而只需要有类似的东西:

for each (var menuField:XML in [mnVariable]) {

mnVariable 将包含字符串,例如“event.datPass.home.element”。或者:

for each (var menuField:XML in event.dat.[mnVariable].element) {

mnVariable 将包含字符串,例如“home”。

但是,按照第一种方式编写,所发生的只是 for-each-in 循环在 mnVariable 中查找以查找 menuField 中的值,但它不会找到。用第二种方式写它只会抛出一个错误。我需要 [mnVariable] 用于评估“查看此字符串命名的对象”的含义

任何指针都非常高兴地收到。

4

1 回答 1

2

通常不喜欢在 XML 中使用数据定义元素名称,但是 - 假设event.dat它实际上是一个XMLobject,而不是您手动将 XML 解析成的任意对象(无法从问题中看出) - 这确实是一个关于 ECMAScript for XML (E4X) 而不是一般变量的问题。

如果是这样,这应该工作:

for each (var menuField:XML in event.dat.child(mnVariable).element)
{
   // Do something
}

目前无法测试,但这也可能有效(它是 E4X 标准的一部分,但不确定 Adob​​e 是否实现了它):

// Note, no dot before the indexer:
for each (var menuField:XML in event.dat[mnVariable].element)
{
   // Do something
}

后者通常也是使用字符串属性名称访问对象属性的方法,因此如果event.dat 手动解析 XML 的任意对象 - 与实际XML对象相反 - 第二个示例也应该有效。

于 2013-08-07T01:01:17.747 回答