Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Saving XML file in AS3 is possible

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

I need to save as xml file in local harddisk(project directory).

Is it possible to save in as3 itself?

like image 906
vineth Avatar asked Jun 03 '09 14:06

vineth


3 Answers

I threw this together, and sure enough you can save to .XML using the following as a minimalist example.

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 ([email protected])
 */
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');
    }
}

}

There are some things to note.

  • You require Flash Player 10 to use the save method of the FileReference class.
  • In order to do anything that INVOKES a prompt, Flash requires user interaction like keyboard or mouse input.

In the above I listen for MouseEvent.MOUSE_DOWN on the stage to serve as the USER INTERACTION which is required to invoke the save prompt.

I setup a basic XML structure within the code (this will typically come from and external source and will work fine both ways.

A ByteArray is created and the XML is written to the ByteArray.

The save method of the FileReference class requires a ByteArray and default save name be passed as the two parameters.

I hope this helps.

like image 95
Brian Hodge Avatar answered Sep 28 '22 11:09

Brian Hodge


if you want to store it locally (on the client PC) , you can use a local shared object. Refer to this tutorial

like image 40
Rick J Avatar answered Sep 28 '22 10:09

Rick J


I'm sorry, your question isn't very clear.

Are you asking if you can save a file to the hard drive from within a compile SWF written in AS3?

Or are you asking if you can include a raw XML file in your AS3 project without needing to write it out as a variable?

If you meant the former, no -- not without Adobe AIR. You can save data locally as a SharedObject, but not as an arbitrary file in the file system.

If the latter, then yes -- you must embed the file just as you would embed another resource (such as an image or a sound). However, it looks like there might be a bug in Flash that makes this non-trivial to figure out how to do.

This link might be of help to you.

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

And then to parse the XML:

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

Apologies if neither of those questions are what you were actually asking.

Cheers!

like image 22
HanClinto Avatar answered Sep 28 '22 09:09

HanClinto