在AS3中保存XML文件是可行的。

8
var xml:XML = <myXml>
                    <item prop="1" />
                    <item prop="2" />
                </myXml>;

我需要将文件保存为XML格式到本地硬盘(项目目录)。

是否可以在AS3中直接保存?


你的问题表述不够清晰,但是答案正是我所需要的。谢谢! - Martin
3个回答

17

我匆匆忙忙写了这个,确实可以使用以下最简化的示例将数据保存为 .XML 文件。

package com.hodgedev.xmlcreator
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.utils.ByteArray;
    import flash.net.FileReference;

/**
 * ...
 * @author Brian Hodge (brian@hodgedev.com)
 */
public class Main extends Sprite 
{
    private var _xml:XML;

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

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

        //Calling the save method requires user interaction and Flash Player 10
        stage.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseDown);

        _xml= <xml>
              <test>data</test>
              </xml>;
    }
    private function _onMouseDown(e:MouseEvent):void
    {
        var ba:ByteArray = new ByteArray();
        ba.writeUTFBytes(_xml);
        //ba.

        var fr:FileReference = new FileReference();
        fr.addEventListener(Event.SELECT, _onRefSelect);
        fr.addEventListener(Event.CANCEL, _onRefCancel);

        fr.save(ba, "filename.xml");
    }
    private function _onRefSelect(e:Event):void
    {
        trace('select');
    }
    private function _onRefCancel(e:Event):void
    {
        trace('cancel');
    }
}

}

需要注意以下几点:

  • 使用FileReference类的保存方法需要Flash Player 10。
  • 为了执行任何触发提示的操作,Flash需要用户交互,例如键盘或鼠标输入。

在上述代码中,我监听舞台上的MouseEvent.MOUSE_DOWN事件以作为必须的用户交互,以调用保存提示框。

我在代码中设置了一个基本的XML结构(通常从外部来源获取),并且两种方式都可以正常工作。

创建了一个ByteArray并将XML写入其中。

FileReference类的保存方法要求传递两个参数:一个是ByteArray,另一个是默认的保存名称。

希望这有所帮助。


我知道这篇文章很旧了,但这正是我需要的答案,除了如何使用for循环编写xml?例如,我有一个包含纹理数据的二维数组。我想基于纹理xml地图创建碰撞xml地图。比如说,你怎么做: var xml:XML = <data> /*for loop*/ <data> - Davina Leong
使用for循环构建实际的XML,然后将其发送! var s:String; //如果您愿意,可以省略以下内容,Flash不使用它,但如果文件在前端和后端之间共享,则可能希望拥有该标记。 - Brian Hodge
1
s = "<?xml version="1.0" encoding="utf-8">";s.appendText("<data>");//随意循环,例如 for(var i:int; i < someValue; i++); 我会使用 for each for each(var someObj in SomeOtherObj) { s.appendText("<collision id=" + someObj.id + " />"); }s.appendText("</data>");这显然是通用的,但应该能让你开始工作。 var xml:XML = s; - Brian Hodge
有没有办法在不弹出对话框的情况下保存 XML 文件? - Sergey Senkov

3

如果您想将其本地存储(在客户端计算机上),可以使用本地共享对象。请参阅此教程


1

很抱歉,您的问题不是很清楚。

您是在问是否可以从AS3编写的编译SWF中保存文件到硬盘吗?

还是在问是否可以在AS3项目中包含原始XML文件而无需将其写成变量?

如果您指的是前者,则不行——除非使用Adobe AIR。您可以将数据保存在本地作为SharedObject,但不能作为文件系统中的任意文件。

如果是后者,则是的——您必须像嵌入其他资源(如图像或声音)一样嵌入该文件。然而,看起来Flash中可能存在一个错误,使得这个过程不容易理解。

此链接可能对您有所帮助。

[Embed(source='../../../../assets/levels/test.xml', mimeType="application/octet-stream")]
public static const Level_Test:Class;

然后解析XML:

var ba:ByteArray = (new Levels.Level_Test()) as ByteArray;
var s:String = ba.readUTFBytes( ba.length );
xml = new XML( s );

如果这两个问题都不是你实际想问的,那我很抱歉。

谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接