加載大量的xml數據 使用壓縮方法解決(當然較小時也可以壓縮)


如果你的應該程序必須在運行期間加載一個外部大且冗長的XML文件時,這個方案可能是有用的,通過將XML保存為二進制,你可以壓縮數據得到一個較小的文件,當然,你可以得到的壓縮的數量取決於數據的復雜性,但它通常超過50%(保守估計)。
  無可否認的,經壓縮的二進制格式的XML數據違背了擺在首位采用XML的初衷——數據可讀性。因此,在程序進行前你將必須先決擇哪一種更為重要。也許真實的外部數據才是你想要的——允許數據被具體化,可以改變數據而無需重新編譯SWF,然而,或許你更喜歡數據不可編輯。
將XML轉換為二進制數據(ByteArray)
首先,我們看看XML數據如何存儲在ByteArray中。下面的代碼假定您已經有名為“xmlData”字符串值變量存儲XML數據:
  1. var data:ByteArray = new ByteArray();
  2. data.writeUTFBytes(xmlData); // xmlData is original XML string
  3. data.compress();
保存文件
現在,您已經有二進制數據ByteArray對象,可以將該對象作為原始數據保存為文件。你可以以下任意一種方式實現。
(一)發送到服務器腳本; 
(二)用AIR API保存到本地存儲;或
(三)使用Flash Player 10 API保存到本地存儲。 
我 們會用(三),因為是這是每一個Flash開發人員最容易的方案。這個類將會使用flash.net.FileReference。FileReference.save()方法只有在Flash Player 10時才可用。它允許你保存FileReference對象中的數據至本地。
  1. function on_buttonClick(evt:MouseEvent):void
  2. {
  3.         var data:ByteArray = new ByteArray();
  4.         data.writeUTFBytes(xmlData); // xmlData is original XML string
  5.         data.compress();
  6.         new FileReference().save(data, "bindata.xml"); // default name "bindata.xml"
  7. }

 

save()方法將打一個本地對話框——輸入文件名選擇存放位置后將會把XML數據存儲至本地。注意保存的文件須以“.xml”作為后綴,但是該文件不是可讀地——用文本編輯器打開該文件你看到的是些垃圾數據。
加載二進制XML
加載二進制文件同正常的文本XML文件加載方式一樣:

  1. var ldr:URLLoader        = new URLLoader();
  2. ldr.dataFormat        = URLLoaderDataFormat.BINARY; // ** make sure you do this **
  3. ldr.addEventListener(Event.COMPLETE, on_XML);
  4. ldr.addEventListener(IOErrorEvent.IO_ERROR, on_XML);
  5. ldr.load(new URLRequest(pathToXMLFile));
復制代碼
因此,代碼同正常的文本XML文件加載方式一樣,除了需要將dataFormat設置為URLLoaderDataFormat.BINARY。即使你加載一個普通的文本XML文件,上面的代碼也會工作得很好。
將二進制數據轉換為XML
二進制XML文件加載成功后,將二進制數據轉換為文本XML。
  1. var xmlData:XML;
  2. function on_XML(evt:Event):void
  3. {
  4.         if (evt.type == Event.COMPLETE)
  5.         {
  6.                 var data:* = URLLoader(evt.target).data;
  7.                 if (data is ByteArray)
  8.                 {
  9.                         try
  10.                         {
  11.                                 ByteArray(data).uncompress();
  12.                         }
  13.                         catch(e:Error)
  14.                         {
  15.                         }
  16.                 }
  17.                 xmlData = XML(data);
  18.         }
  19. }
上面的代碼,你的應用程序將能夠同時處理文本XML和二進制XML文件。因此,此代碼你仍可以使用,即使您目前沒有使用XML存儲為壓縮的二進制數據。如果在以后您決定將XML采用二進制壓縮格式,該應用程序也能很好的處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM