views:

4125

answers:

4

Hi,

var xml:XML = ;

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

Is it possible to save in as3 itself. ?

A: 

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

Rick J
A: 

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!

HanClinto
+4  A: 

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.

Brian Hodge
blog.hodgedev.comhodgedev.com

Brian Hodge
A: 

So this helped me get to create an xml file from my as3. But I want to do more!

1) How do I set the location of the file in the fileRef.save(ba, "filename.xml"); so that the user has no choice where to save the file?

2) how do I write to the file without overwriting the whole thing? Essentially I have an xml file that had a bunch of node of type . I want to be able to change the order of these card nodes, as well as add in new nodes. Is this possible?

Thanks so much in advance for your answer!

n00b
This should be an update to your current question, or perhaps even a separate question altogether; this is not an answer. In any case, 1) You can't, the user is ultimately allowed to choose where to put the file. 2) You _must_ overwrite the whole thing each time; however you can keep a copy of the file in memory, manipulate that, and write that out to the file each time. It sounds like a [shared object](http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/net/SharedObject.html) is more in line with your needs, though.
Cameron