2011-05-05 53 views
0

我正在創建一個瑣事遊戲,Flash(AS3)有兩個不同的類別。玩家可以選擇一個類別,或另一個或兩個類別。在下面的代碼中,我試圖將兩個XML文件合併到一個新的XML文件,如果人選擇這兩個類別。我得到myLoader和myLoader2一個「未定義的屬性錯誤的訪問,我不知道爲什麼。AS3 - 合併XML文件

// start loading of questions 
public function xmlImport() 
{ 
    var myLoader:URLLoader = new URLLoader(); 
    var myLoader2:URLLoader = new URLLoader(); 

    if (so.data.question_set == "BOTH") 
    { 
     myLoader.load(new URLRequest("category1.xml")); 
     myLoader2.load(new URLRequest("category2.xml")); 
     myLoader.addEventListener(Event.COMPLETE, loadXML2); 

     function loadXML2() 
     { 
      myLoader2.addEventListener(Event.COMPLETE, combineXML); 
     } 
    } 

    if (so.data.question_set == "ONE") 
    { 
     myLoader.load(new URLRequest("category1.xml")); 
     myLoader.addEventListener(Event.COMPLETE, xmlLoaded); 
    } 

    if (so.data.question_set == "TWO") 
    { 
     myLoader.load(new URLRequest("category2.xml")); 
     myLoader.addEventListener(Event.COMPLETE, xmlLoaded); 
    } 
} 

public function combineXML() 
{ 
    var xmlJoin:XML = <trivia></trivia>; 
    var i:XML; 

    for each(i in myLoader) 
    { 
     xmlJoin.appendChild(i); 
    } 

    for each(i in myLoader2) 
    { 
     xmlJoin.appendChild(i); 
    } 

    trace(xmlJoin); 
} 

感謝您可以提供任何幫助。

豐富

回答

0

在第三選擇你能不能有兩個裝載機和各完成時,結果XML被添加到一個預先定義的空XML值

一個粗略的例子:

var xml1:XML = 
<trivia> 
    <question>What is the difference between a duck?</question> 
    <answer>I have no idea</answer> 
</trivia>; 

var xml2:XML = 
<trivia> 
    <question>2+2</question> 
    <answer>4</answer> 
</trivia>; 


var xmlJoin:XML = <sheet></sheet>; 


var i:XML; 
for each(i in xml1) 
{ 
    xmlJoin.appendChild(i); 
} 

for each(i in xml2) 
{ 
    xmlJoin.appendChild(i); 
} 

trace(xmlJoin); 
+0

我想我明白你要什麼,但我很新的這個XML的東西。我會試試這個。謝謝。 – Rich 2011-05-06 01:45:47

+0

我編輯了上面的代碼以包含您的建議,但現在我得到兩個「訪問未定義的屬性」錯誤myLoader和myLoader2,我不明白爲什麼。 – Rich 2011-05-06 10:35:32

0

可以簡單地使用一個XML對象的appendChild()方法如下所示:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var xml1:XML = <rootNode> 
           <parentNode> 
            <childNode>1</childNode> 
           </parentNode> 
          </rootNode>; 

      var xml2:XML = <rootNode> 
           <parentNode> 
            <childNode>2</childNode> 
           </parentNode> 
          </rootNode>; 

      xml1.parentNode.appendChild(xml2.parentNode.childNode); 

      trace(xml1); // output: <rootNode> 
         //    <parentNode> 
         //     <childNode>1</childNode> 
         //     <childNode>2</childNode> 
         //    </parentNode> 
         //   </rootNode> 

     }// end function 

    }// end class 

}// end package 

[UPDATE]

還可以簡單地既XML對象合併到一個XMLList對象像下面:

var xmlList:XMLList = XMLList(xml1.toString().concat(xml2.toString())); // XMLList(xml1 + xml2) 

trace(xmlList); // output: <rootNode> 
       //    <parentNode> 
       //     <childNode>1</childNode> 
       //    </parentNode> 
       //   </rootNode> 
       //   <rootNode> 
       //    <parentNode> 
       //     <childNode>2</childNode> 
       //    </parentNode> 
       //   </rootNode> 

[更新2]

我改寫了您的應用程序(以及您的應用程序發佈的部分),你可能想向你展示的方式採取:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.net.SharedObject; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 

    public class Main extends Sprite 
    { 
     private var _sharedObject:SharedObject; 
     private var _urls:Array; 
     private var _xmls:Vector.<XML>; 
     private var _xmlsLoaded:int; 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      _sharedObject = SharedObject.getLocal("questions"); 
      _sharedObject.data.category = Category.BOTH; 

      _xmls = new Vector.<XML>(); 

      switch(_sharedObject.data.category) 
      { 
       case Category.ONE: loadXml("xml/category1.xml");      break; 
       case Category.TWO: loadXml("xml/category2.xml");      break; 
       case Category.BOTH: loadXml("xml/category1.xml", "xml/category2.xml"); break; 

      }// end switch 

     }// end function 

     private function loadXml(...urls):void 
     { 
      _urls = urls; 

      for each(var url:String in urls) 
      { 
       var urlLoader:URLLoader = new URLLoader(new URLRequest(url)); 
       urlLoader.addEventListener(Event.COMPLETE, onUrlLoaderComplete); 

      }// end function 

     }// end function 

     private function onUrlLoaderComplete(e:Event):void 
     { 
      _xmls.push(XML(URLLoader(e.target).data)); 

      if (_urls.length == ++_xmlsLoaded) traceXMLList(); 

     }// end if 

     private function traceXMLList():void 
     { 
      trace(getXMLList(_xmls)); // output: <category1> 
             //    <question>question 1</question> 
             //    <question>question 2</question> 
             //   </category1> 
             //   <category2> 
             //    <question>question 1</question> 
             //    <question>question 2</question> 
             //   </category2> 


     }// end function 

     private function getXMLList(_xmls:Vector.<XML>):XMLList 
     { 
      var xmlList:XMLList = new XMLList(); 

      for (var i:uint = 0; i < _xmls.length; i++) 
      xmlList += _xmls[i]; 

      return xmlList; 

     }// end function 

    }// end class 

}// end package 

internal class Category 
{ 
    public static const ONE:String = "one"; 
    public static const TWO:String = "two"; 
    public static const BOTH:String = "both"; 

}// end class 
+0

謝謝。雖然這並不完全是我的意思。實際上我只需要將第二個xml中的問題追加到第一個xml結尾。我想我聽起來更難了。 – Rich 2011-05-07 11:18:47

+0

也許如果您發佈了您使用的xml示例,那麼向您展示如何合併xml會更容易。我的回答顯示瞭如何選擇將孩子從一個「XML」對象附加到另一個「XML」對象中的特定軸的位置。此外,我會重新考慮您在應用程序中使用的代碼。似乎有很多不必要的代碼,在我看來,使用'switch'語句而不是'if'語句會更好。我會爲你重寫應用程序,但不知道你的xml的結構(以及知道你的應用程序的其他方面),我不能。 – Taurayi 2011-05-07 12:50:49