Sunday, February 10, 2008

AIR - データグリッドのデータをXMLに書き出すサンプル

前回のサンプルを応用して、データグリッドに読み込んだXMLファイルのデータを編集した後、再びXMLファイルに書き出すサンプルです。ローカルファイルの読み込みもできれば、書き出しも可能です。

今回のポイントは、以下の2点になるかと思います。

  • IListを使用して、データグリッドのデータを抽出する
  • FileMode.WRITEでファイル書き出しをする


今回のコード:


<?xml version="1.0" encoding="utf-8"?>

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="appComplete()">

<mx:Script>

<![CDATA[



import mx.collections.IList;



public var sampleXML:File;

public var stream:FileStream;

public var XMLStr:String;





[Bindable]public var rXML:XML;



public function appComplete():void

{

dg.enabled = false;

nameTxt.enabled = false;

updateBtn.enabled = false;

saveBtn.enabled = false;

}



private function loadSampleXML():void

{



sampleXML = File.documentsDirectory;

sampleXML = sampleXML.resolvePath("sample.xml");





stream = new FileStream();



if(sampleXML.exists)

{

stream.open(sampleXML, FileMode.READ);



rXML = XML(stream.readUTFBytes(stream.bytesAvailable));

stream.close();

}

dg.enabled = true;

}



private function getName():void

{

nameTxt.text = dg.selectedItem.name;

nameTxt.enabled = true;

updateBtn.enabled = true;

}



private function updateName():void

{

dg.selectedItem.name = nameTxt.text;

nameTxt.enabled = false;

updateBtn.enabled = false;

saveBtn.enabled = true;

}

private function saveData():void

{

createXMLData();

writeXMLData();

saveBtn.enabled = false;

}



//-----------------------------------------

private function createXMLData():void

{



XMLStr = "";



var dgLength:Number = dg.dataProvider.length;

var i:Number = 0;

var dgList:IList = IList(dg.dataProvider);



for(i = 0; i<dgLength; i++)

{

XMLStr += "<sample>\n"

+ "<id>"+ dgList.getItemAt(i).id +"</id>\n"

+ "<name>"+ dgList.getItemAt(i).name+"</name>\n"

+ "<age>"+ dgList.getItemAt(i).age +"</age>\n"

+ "</sample>\n";

}

}



private function writeXMLData():void

{

var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n';

outputString += "<set>\n"

+ XMLStr

+ "</set>";

outputString = outputString.replace(/\n/g, File.lineEnding);



stream = new FileStream();



stream.open(sampleXML, FileMode.WRITE);

stream.writeUTFBytes(outputString);

stream.close();



}



//-----------------------------------------





]]>

</mx:Script>



<mx:VBox x="0" y="0" width="100%" height="100%">

<mx:Button label="Load" click="loadSampleXML();"/>

<mx:DataGrid dataProvider="{rXML.sample}" change="getName();" id="dg">

<mx:columns>

<mx:DataGridColumn headerText="ID" dataField="id"/>

<mx:DataGridColumn headerText="Name" dataField="name"/>

<mx:DataGridColumn headerText="Age" dataField="age"/>

</mx:columns>

</mx:DataGrid>

<mx:TextInput id="nameTxt"/>

<mx:Button label="Update" id="updateBtn" click="updateName();"/>

<mx:Button label="Save" click="saveData();" id="saveBtn"/>

</mx:VBox>



</mx:WindowedApplication>



今回のサンプルはこちらダウンロードできます。

XMLファイルの読み込みは、「File.documentsDirectory;」となっているので、サンプルを実行する前にsample.xmlは、マイドキュメントに保存して置いてください。

ファイルの読み込み、書き出しの基本的な説明は、AIR LiveDocsに記載されています。

No comments: