将XML数据转换为对象数组AS3

时间:2015-06-17 20:17:36

标签: actionscript-3

我正在使用Flash AS4和Ive创建的数组,它包含xml数据,可以通过以下循环正常工作

for(var i:int = 0; i < uNavXML.length(); i++){
    navArray.push(uNavXML..navRef.text()[i]);

XML数据实际上是我在舞台上的影片剪辑的名称:

    xmlLIST :<uNav>
  <unavNavID>1</unavNavID>
  <navRef>navBtns.nav01</navRef>
</uNav>
<uNav>
  <unavNavID>2</unavNavID>
  <navRef>navBtns.nav02</navRef>
</uNav>
<uNav>
  <unavNavID>3</unavNavID>
  <navRef>navBtns.nav03</navRef>
</uNav>
<uNav>
  <unavNavID>4</unavNavID>
  <navRef>navBtns.nav04</navRef>
</uNav>
<uNav>
  <unavNavID>5</unavNavID>
  <navRef>navBtns.nav05</navRef>
</uNav>
<uNav>
  <unavNavID>7</unavNavID>
  <navRef>navBtns.nav07</navRef>
</uNav>
<uNav>
  <unavNavID>8</unavNavID>
  <navRef>navBtns.nav08</navRef>
</uNav>
<uNav>
  <unavNavID>10</unavNavID>
  <navRef>navBtns.nav10</navRef>
</uNav>
<uNav>
  <unavNavID>12</unavNavID>
  <navRef>navBtns.nav12</navRef>
</uNav>
<uNav>
  <unavNavID>13</unavNavID>
  <navRef>navBtns.nav13</navRef>
</uNav>
<uNav>
  <unavNavID>14</unavNavID>
  <navRef>navBtns.nav14</navRef>
</uNav>
<uNav>
  <unavNavID>15</unavNavID>
  <navRef>navBtns.nav15</navRef>
</uNav>

所以,我想要做的是获取这些xml值,在for循环中使它们成为对象,以便我可以像这样为它们分配eventlisteners

navObj [i] .addEventListener(MouseEvent.MOUSE_OVER,mOvNav); navObj [I] - 阅读进度 - (的MouseEvent.MOUSE_OUT,mOuNav); navObj [I] - 阅读进度 - (MouseEvent.CLICK,goPage);

有没有办法在Flash ActionScript中执行此操作?我对AS3没有太多的经验,我从来没有必要将数组从String转换为Object,所以我才挣扎。如果有人可以提供帮助,那将会受到热烈的欢迎......

通过此以及之前的SO quesiotn找到答案 Converting String values to MovieClip in AS 3.0

对于我的问题,这里是删除“navBtns”的答案。 prfix并通过navShort提供navButton实例名称

for each (var nav:String in navShrt) {
    var navInst:MovieClip = navBtns[nav] as MovieClip;

然后我可以通过navInst.addEventListener ....等参考

1 个答案:

答案 0 :(得分:0)

假设您有一个名为&#34; testMC&#34;一个名为&#34; test2MC&#34;。在您的XML中,您以某种方式存储了这些名称。

您迭代XML并检查其内容,每个内容都包含您的一个MovieClip的名称。

然后,您只需检查XML的内容是否符合您的条件。

有些事情如下:

for(var i:int=0;i<uNavXML.length();i++){
    var mcname:String = uNavXML..navRef.text()[i];
    switch(mcname){
        case "testMC":
            //do whatever you need with your testMC Object
        break;
        case "test2MC":
            //do whatever you need with your test2MC Object
        break;
    }
}

现在,我不太明白你的意思&#34;将xml文本值转换为对象&#34;。如果您打算创建XML中定义的特定类型的 new MovieClip。我建议的方法可行,但您需要有MovieClips in your Library and give them all AS Linkage.

例如,您可以使用名为&#34; testMC&#34;的MovieClip。在您的图书馆中,它有一个名为&#34;测试&#34;。

的AS Linkage类

在上面的代码中,您可以执行以下操作:

case "testMC":
    var newMC:Test = new Test();
    addChild(newMC);
break;

因此,您可以在XML中定义您选择的Object的多个实例。

好的,现在第二次尝试我更好地理解你的问题了。

  • 在您的舞台上,您有一个名为navBtns的MovieClip,其中包含Button MovieClips的命名实例。

  • 在您的XML中,您通过其父级引用这些按钮,例如navBtns.nav01

这意味着XML中的每个节点实际上都指的是2个对象,而不是一个。一个用于navBtns,另一个用于实际按钮。

我提出这个解决方案,虽然应该有更好的解决方案:

  • 迭代XML

  • 拆分XML节点中包含的字符串,将其拆分为&#34;。&#34;

  • 通过括号表示法直接修改已定义的实例

看起来像这样:

for(var i:int=0;i<uNavXML.length();i++){
    //obtain the entire string
    var nodeTxt:String = uNavXML..navRef.text()[i];
    //split the string at the dot
    var split:Array = nodeTxt.split(".");
    //not necessary, just for better understanding, create two helper  variables
    var prnt:String = split[0];
    var btn:String = split[1];
    //obtain MovieClip instance through bracket notation
    var obj:MovieClip = this[prnt][btn];
    //do what you need with the MovieClip
}

请记住,这是未经测试的。