前回のサンプルを応用して、データグリッドに読み込んだ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:
Post a Comment