2011-06-25 65 views
4

我已經遍佈包括堆棧溢出在內的數十個小時試圖識別將Flash中的信息保存到XML文件的可靠實例。將Flash(AS3)數據保存爲XML

我想取兩種不同類型的對象的位置,並將每個對象的列表導出爲XML。我們將打電話給對象ball and bat

所以,我很想有XML看起來像這樣:

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

聽起來很簡單,但我一直沒能找到什麼AS3代碼可以完成此單體面的例子。數據有兩個動畫片段矢量,所以我會使用bats [i] .x和bats [i] .y作爲輸入值。

如何創建這個XML,並將其保存在本地查看?謝謝你的幫助,事實證明這是非常令人沮喪的。

回答

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 
[email protected] = 12; // add 12 as an attribute named "xPos" 
[email protected] = 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 /> 

使用TheDarkIn7878到AS3中的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文件LES。如果你有興趣,你可以得到SWF和來源http://divillysausages.com/blog/xml_compressor_uncompressor

+0

這絕對是太棒了,謝謝你的詳細解釋! – Befall

+0

+1表示壓縮程序。從用戶@Lional – TheDarkIn1978

+0

評論:「我看到這個頁面有關保存爲XML它完美 不過有點錯誤是在頁 他們 VAR‘F’:一個FileReference =新的FileReference; 文件。 .save('myXML',「myXML.xml」); //以名稱myXML.xml保存,「myXML」爲y 請將f改爲文件 並且''myXML「爲」sx「'。我在哪裏引用''f','myXML''「。 (*從即將刪除的答案*複製)。 –

2

ActionScript 3.0使用E4X構建,因此您可以在運行時創建XML對象,然後將它們作爲文本文件(當然帶有.xml擴展名)寫入磁盤。

如果您正在爲瀏覽器駐留的Flash編程,您可以使用flash.net.FileReference,但此方法提供了一個用於加載/保存文件的對話窗口。如果您在AIR中進行編程,則可以使用flash.fileSystem.File將文件加載/保存爲後臺進程。

我假設你是爲瀏覽器編程,並想在後臺處理數據。在這種情況下,您也有使用本地共享對象來存儲和檢索您的XML數據對象的(非常常見的)選項。

更多在這裏(包括示例代碼):flash.net.SharedObject

+0

太棒了,我結束了使用文件參考並獲得它的工作。但是,它沒有真正的XML間距,只是標籤之間有兩個空格的標籤。任何想法如何我可以強制在AS3的新行/ tabbing該XML?或者甚至有必要? – Befall

+0

嘗試使用'myXML.toXMLString();' – TheDarkIn1978

0

只是除了divillysausages的答案(我upvoted)。

如果你想添加一個值到XML標籤,如:

<ball>red ball</ball> 

您可以使用:

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

很明顯,你可以傳遞給一個的appendChild字符串變量。

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> 

這將使以後很容易進行更改並向對象添加屬性。

此外,如果您使用的影片剪輯數組更容易。