0

XML を作成し、データを追加して保存するための現在のコードは次のとおりです。

import flash.events.MouseEvent;
import flash.net.FileReference;
import flash.events.Event;

stop();

btn_exit.addEventListener(MouseEvent.CLICK, exitConfirm);  //IGNORE THIS
btn_submit.addEventListener(MouseEvent.CLICK, submitData);   //Submit data event

//IGNORE THIS
function exitConfirm(e:MouseEvent):void {
    gotoAndPlay(5);
}


//On "CLICK", Submit data event
function submitData(e:MouseEvent):void {
    var loader:URLLoader = new URLLoader();
    loader.addEventListener(Event.COMPLETE, loadXML);
    loader.load(new URLRequest("events.xml"));

    function loadXML(e:Event):void {
        xml = new XML(e.target.data);
        trace(xml);
    }

    var file:FileReference = new FileReference;
    var app:XML = <app/>; 

    app.titles = comp_title.text;
    app.titles.category = comp_category.text;
    app.titles.place = comp_place.text;
    app.titles.dateDay = null;
    app.titles.dateMonth = null;
    app.titles.dateYear = null;
    app.titles.gear = null;

    file.save(app, "events.xml");
}

私の問題は、このコードが XML ファイルにしか作成されないことです。これにさらにコードを追加して、最初に既存の XML のデータを見つけ、それを取得して新しいデータを追加しようとしましたが、うまくいかないようです。それが可能かどうかさえわからないので、ここに来ました。どんな助けも良い助けです!

PS AS3 は私にとってまだかなり新しいものです。私はそれがひどいわけではありませんが、どちらも得意ではありません:)

乾杯!:D

4

1 に答える 1

1

更新された XML 全体をファイルシステムに保存する前に、既存の XML をロードして新しいデータを追加する必要があります。

  1. ActionScript 3.0 での XML の読み込み
  2. ActionScript 3.0 での XML の操作

編集:

以下はうまくいくはずです。特定の決定を説明するコメントを含めました。

import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.FileReference;
import flash.events.MouseEvent;

btn_exit.addEventListener(MouseEvent.CLICK, exitConfirm);  //IGNORE THIS
btn_submit.addEventListener(MouseEvent.CLICK, submitData);   //Submit data event

// store path in a variable so we don't need to write it out each time we need it
var xmlPath:String = "events.xml";
var xml:XML;

var loader:URLLoader;

//IGNORE THIS
function exitConfirm(e:MouseEvent):void {
   gotoAndPlay(5);
}

loadXML();

// Best bet is to load the existing XML up-front because you can only trigger the 
// FileReference save method from a handler invoked directly from a user interaction. 
// See: http://stackoverflow.com/questions/3301839/flexs-filereference-save-can-only-be-called-in-a-user-event-handler-how-ca
function loadXML():void {
    loader = new URLLoader();
    loader.addEventListener(IOErrorEvent.IO_ERROR, xmlLoadErrorHandler);
    loader.addEventListener(Event.COMPLETE, xmlLoadHandler);
    loader.load(new URLRequest(xmlPath));
}

function xmlLoadHandler(e:Event):void {
    xml = new XML(e.target.data);
    removeListeners();
    trace("Loaded XML", xml);
}

// Handle the possibility of path not existing
function xmlLoadErrorHandler(e:IOErrorEvent):void {
    xml = <app></app>;
    removeListeners();
    trace("Error, XML did not exist, creating new empty XML");
}

// Process the data and save to file system
function submitData(e:MouseEvent):void {
    var file:FileReference = new FileReference();

    // Append the new title node to the existing XML. 
    // From now on, XML in memory matches exactly what is on file-system
    xml.appendChild(getTitle()); 

    file.save(xml, xmlPath);
}

// Returns a populated title node
function getTitle():XML {
    var xml:XML = <title></title>

    //replace hardcoded strings with your variables
    xml.category = "category"; 
    xml.place = "place";
    xml.dateDay = "day";
    xml.dateMonth = "month";
    xml.dateYear = "year";
    xml.gear = "gear";

    return xml;
}

// It's good practice to remove event listeners when you're finished with them
function removeListeners() {
    loader.removeEventListener(Event.COMPLETE, xmlLoadHandler);
    loader.removeEventListener(IOErrorEvent.IO_ERROR, xmlLoadErrorHandler);
}
于 2012-06-22T02:01:32.327 に答える