繁体   English   中英

AS3-合并XML文件

[英]AS3 - Merging XML Files

我正在创建具有两个类别的Flash(AS3)琐事游戏。 玩家可以选择一个类别,或另一个,或同时选择两个类别。 在下面的代码中,如果有人选择两个类别,我将尝试将两个xml文件合并到一个新的xml文件中。 我收到“对于myLoader和myLoader2的未定义属性访问错误,我不知道为什么。

// 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);
}

谢谢你的尽心帮助。

丰富

在第三个选项中,您可能没有两个加载器,并且每个加载器完成时,结果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);

您可以像下面这样简单地使用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

[更新]

您还可以将两个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM