我正在创建一个项目,它允许我在XML文档中定义对象,并让flash创建所需的项目并在运行时显示。毋庸置疑,随着时间的推移,这是一个缓慢的进展。
我现在已经达到了一个障碍,相比之下应该非常容易。但我画了一个空白。尽管与我的好朋友谷歌花了几个小时,但我似乎无法用这句话来表达其他想要达到同样目标的人。
描述
目前我有一个菜单处理类,这是问题所在。将创建menuHandler类的实例。它通过调用一个传递两个字符串的类(LoadFramework)来使用。一个是XML文件的地址,另一个是XML文档中的标记,用于指定需要读取的部分。
XML文档由类加载,然后解析为变量。然后,根据传递的第二个字符串(XML标记的值),该XML文档的相应部分将被转换到屏幕上。这一切都很好,但这是抓住......
我设法使其工作的唯一方法是使用带有每个潜在标记的case的switch语句。然后我写了一个适当的for-each-in循环。以下是其中一个案例陈述的示例(除了" 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将包含字符串,例如&#34; event.datPass.home.element&#34;。 或者:
for each (var menuField:XML in event.dat.[mnVariable].element) {
mnVariable将包含字符串,例如&#34; home&#34;。
然而,从第一种方式开始,所有发生的事情都是for-each-in循环在mnVariable中查找找到menuField中的值,它不会找到它。写第二种方式它只会抛出一个错误。我需要[mnVariable]用于评估意义&#39;查看由此字符串命名的对象&#39;
很高兴收到任何指示。
答案 0 :(得分:2)
通常不喜欢在XML中使用数据定义元素名称,但是 - 假设event.dat
实际上是XML
object,而不是您手动将XML解析为的任意对象(可以从问题中讲出来 - 这实际上是一个关于ECMAScript for XML(E4X)的问题,而不是一般的变量。
如果是这样,这应该有效:
for each (var menuField:XML in event.dat.child(mnVariable).element)
{
// Do something
}
目前无法测试,但这也可能有效(它是E4X标准的一部分,但不确定Adobe是否实现了它):
// Note, no dot before the indexer:
for each (var menuField:XML in event.dat[mnVariable].element)
{
// Do something
}
后者通常也是使用字符串属性名访问对象属性的方法,因此如果event.dat
是手动解析XML的任意对象 - 而不是实际的XML
对象 - 第二个例子也应该有用。