如何编写已在as3中使用URLLoader打开的XML文件?

时间:2016-04-08 07:37:37

标签: xml actionscript-3 xml-parsing air flex4.5

我有一个XML,它位于我需要修改该XML文件的应用程序目录中。首先,我使用以下代码使用URLLoder加载该XML,然后修改XML,当我尝试在同一位置编写XML文件时相同的名称,它不工作。如果我将文件名更改为其他东西,那么它工作正常。所以我的问题是,我想修改XML文件,并将其保存在同名的同一位置。我怎么能实现这个?

        private var ldr:URLLoader;
        private function changeAppID():void
        {
            var FolderPath = File.applicationDirectory.nativePath+"\\assets"
            var tempFile:File = File.userDirectory.resolvePath(FolderPath);

            if(tempFile.exists)
            {
                ldr = new URLLoader();
                ldr.addEventListener(Event.COMPLETE, onLoad);
                ldr.load(new URLRequest(FolderPath + "\\data\\application.xml"));
            }
            else
            {
                trace("Assets Folder Does Not Exists !"); 
            }
        }


        protected function onLoad(event:Event):void
        {
            var bytearray:ByteArray = new ByteArray();
            var loadedXml:XML = new XML((event.target).data);
            loadedXml.children()[0] = "Riaxe"+getCurrentTime();
            bytearray = getXMLToByteArray( loadedXml );

            var path:String = File.applicationDirectory.nativePath + "\\assets\\data\\application.xml";
            var file:File = new File(path);
            var fileStream:FileStream = new FileStream();
            fileStream.open( file, FileMode.WRITE );
            fileStream.writeBytes( bytearray , 0 , bytearray.length );
            fileStream.close();
        }

3 个答案:

答案 0 :(得分:2)

要避免此问题,您必须使用FileStream.openAsync()异步打开文件,因此您的代码可以是这样的:

var fileStream:FileStream = new FileStream();
    fileStream.openAsync(file, FileMode.WRITE);

    // here you can write your XML content as string, you dont need a ByteArray object
    fileStream.writeUTFBytes(loadedXml.toXMLString());
    fileStream.close();

希望可以提供帮助。

答案 1 :(得分:0)

为什么用URLRequest而不是FileStream打开文件?您可以使用FileMode.UPDATE同步执行这两项操作。

例如:

var assetsDir:File = File.applicationDirectory.resolvePath("assets");
var applicationFile:File = assetsDir.resolvePath("data/application.xml");

// open the file for read/write
var fileStream:FileStream = new FileStream();
fileStream.open(applicationFile, FileMode.UPDATE);

// load the XML and change it
var xml:XML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
xml.id = (Math.random() * int.MAX_VALUE).toString(36);
xml.date = new Date().toDateString();

// replace contents of file with modified XML
fileStream.position = 0;
fileStream.truncate();
fileStream.writeUTFBytes(xml.toXMLString());
fileStream.close();

注意:

  • 您正在检查tempFile.exists但未对其进行任何操作。我不确定你在那里做什么,所以我省略了它。
  • 您可以使用readUTFBytes()writeUTFBytes()直接读取和写入XML字符串。
  • 使用nativePath + "\\assets"等字符串文字构建原生文件路径网址不是一个好习惯,而是使用resolvePath代替see docs)。
  • 我不确定你要对application.xml做些什么。它看起来有点像你试图allow multiple instances of your app to be started,但据我所知,applicationDirectory/assets/data/application.xml不是正确的路径,那就是你可能包含自己的XML文件的地方。也许您正在制作AIR应用程序构建器实用程序?

答案 2 :(得分:0)

问题是应用程序目录位于沙箱中,其中的文件不应以任何方式进行修改。即使有一些已知的hacky工作,任何技术都是如此。

解决方案是始终使用始终可用且专用于此目的的应用程序存储目录。你是不是使用那个目录,那么你就是那个通过尝试在一个文件夹中工作的人来创建你自己的问题,该文件夹是按照定义受保护的,并且沙箱对任何类型的修改都是如此。

如果您坚持这一点,那么您可能会找到一些像我说的那样的工作,但您永远不会保证您的工作将适用于每个操作系统或未来的操作系统更新。

您的应用可能会在操作系统更新后中断,或者已经在某些具有更高安全性设置的操作系统上,因为您有明确的决定违反规则。

我再次建议使用应用程序存储目录,而不是专门用于此目的的沙盒,在这种情况下,这是唯一正确的答案。