• 加载大量的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采用二进制压缩格式,该应用程序也能很好的处理。
  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/lancidie/p/5092439.html
Copyright © 2020-2023  润新知