将Flash(AS3)数据保存到XML

5

我在整个互联网,包括Stack Overflow上花了几个小时,试图寻找一个可靠、可行的将信息保存在Flash中并导出到XML文件的示例。

我想要获取两种不同类型对象的位置,并将每个列表导出到XML。我们称这些对象为

所以,我希望XML看起来像这样:

<objects>
    <ball xPos=34 yPos=43/>
    <ball xPos=12 yPos=94/>
    <bat xPos=1 yPos=39/>
</objects>

听起来很简单,但我找不到一个好的例子来演示AS3代码可以实现什么。数据在两个MovieClips向量中,所以我将使用bats[i].x和bats[i].y作为输入值。

我如何创建这个XML,并保存在本地以查看?非常感谢任何帮助,这已经证明极其令人沮丧。

4个回答

18

在AS3中处理XML非常容易,以下是一些代码来扩展TheDarkIn1978的回答:

创建一个XML对象:

var objs:XML = new XML( <objects /> ); // create the <objects /> node

// for your objects
var ball1:XML = new XML ( <ball /> ); // create the <ball /> node
ball1.@xPos = 12; // add 12 as an attribute named "xPos"
ball1.@yPos = 42; // add 42 as an attribute named "yPos"
objs.appendChild( ball1 ); // add the <ball> node to <objects>

// an example of using variables in your xml
var name:String = "something";
var sx:XML = new XML( <{name} /> ); // creates a node <something />

使用AS3中的TheDarkIn1978's XML类来了解更多相关信息。

保存您的文件:

// saving out a file
var f:FileReference = new FileReference;
f.save( sx, "myXML.xml" ); // saves under the name myXML.xml, "sx" being your root XML node

在保存XML文件之前进行压缩(对于大型XML文件,这可以节省很多空间):

// compressing before saving
var f:FileReference = new FileReference;

var bytes:ByteArray = new ByteArray;
bytes.writeUTFBytes( myXML ); // "myXML" being your root XML node
bytes.compress(); // compress it

f.save( bytes, "myXML.xml" );

加载压缩的XML,解压它并检索XML对象:

// uncompressing a compressed xml
var loader = new URLLoader;
loader.dataFormat = URLLoaderDataFormat.BINARY;

// listen for our events
loader.addEventListener( Event.COMPLETE, this._onLoad );
loader.addEventListener( IOErrorEvent.IO_ERROR, this._onFail ); // not shown
loader.addEventListener( SecurityErrorEvent.SECURITY_ERROR, this._onSecurityError ); // not shown

private function _onLoad( e:Event ):void
{
    var loader:URLLoader = e.target as URLLoader;

    // get the data as a bytearray
    var ba:ByteArray = loader.data as ByteArray;

    // uncompress it
    try
    {
        ba.uncompress();
    }
    catch ( e:Error )
    {
        trace( "The ByteArray wasn't compressed!" );
    }

    // get our xml data
    myXML = XML( ba );
}

我创建了一个简单的工具,用于压缩/解压缩XML文件。如果您感兴趣,可以在http://divillysausages.com/blog/xml_compressor_uncompressor获取SWF和源代码。

那真是太棒了,感谢您详尽的解释! - Befall
用户@Lional的评论:“我看到了这个关于保存为XML的页面。它完美地工作了。但是页面上有一个小错误。它们是var 'f':FileReference = new FileReference; file.save( 'myXML', "myXML.xml" ); // saves under the name myXML.xml, "myXML" being y请将f更改为file。并且将“myXML”更改为“sx”。其中我引用了 'f','myXML'”。(从即将删除的答案中复制)。 - Craig Ringer
@CraigRinger 哈哈,真不敢相信我没看到那个。已经修改了,谢谢! - divillysausages

2
ActionScript 3.0是使用E4X构建的,因此您可以在运行时创建XML对象,然后将它们作为文本文件写入磁盘(当然要使用.xml扩展名)。
如果您正在为驻留在浏览器中的Flash编写程序,则可以使用flash.net.FileReference,但这种方法会弹出一个对话框窗口以加载/保存文件。如果您正在AIR中编程,则可以使用flash.fileSystem.File作为后台进程加载/保存文件。
我假设您正在为浏览器编程,并希望在后台处理数据。在这种情况下,您还可以使用“本地共享对象”来存储和检索XML数据对象(这是非常常见的选项)。
更多内容请查看(包括示例代码):flash.net.SharedObject

太棒了,我最终使用文件引用并使其正常工作。但是,它没有真正的XML间距,只是标签之间有两个空格。有什么办法可以在AS3中强制换行/缩进XML吗?或者这是必要的吗? - Befall
尝试使用 myXML.toXMLString(); - Chunky Chunk

1
我认为在某些情况下,直接在AS3中创建字符串,然后在最后将其转换为XML可能更容易:
import flash.geom.Point;   
var cordiantes = [new Point(34,12),new Point(14,2), new Point(10,15)];

var objects = ["ball","ball","bat"];

// starting the object node.    
var myXmlStr = "<objects>";

for(var i = 0; i < objects.length; i++)
{

  // adding things to the string between the object nodes.
  myXmlStr += "<" + objects[i] +  " xPos= '" + cordiantes[i].x + "' yPos='" + cordiantes[i].y + "' />";
}

// closing the objects node. 
myXmlStr += "</objects>";


// turning the string into xml.
var xmlfinal:XML = XML(myXmlStr);

trace(xmlfinal);

输出结果为:

<objects>
  <ball xPos="34" yPos="12"/>
  <ball xPos="14" yPos="2"/>
  <bat xPos="10" yPos="15"/>
</objects>

这将使以后更改和添加对象属性变得容易。
而且,如果您正在使用MovieClip数组,那么它会变得更加容易。

0

这是对divillysausages答案的补充(我已经点赞了)。

如果你想给XML标签添加一个值,比如:

<ball>red ball</ball>

您可以使用:

var ball:XML = <ball />.appendChild("red ball");

显然,您可以将一个字符串变量传递给appendChild。


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