Androidアプリから、任意フォーマットのxmlを作成してみた。
使用するのは、XmlSerializer。
XmlSerializer って?
XMLの作成には、XmlSerializerを使用しなくても行える。
しかし、XML規格に沿って作成するには、それなりの知識も必要だし、ヘッダー等を整備するのも面倒くさい。
XmlSerializer はそこらへんの面倒を引き受けて、XML の編集を行えるものらしい。
また、書き込みの他に、読み込みmethod も用意されているようだ。
ここでは書き込みのみXmlSerializer で行い、読み込みはXmlPullParser で行った。
XMLの書き出し
書き出す内容は、以下の内容とすることにした。
<xml? …> <gdat id="1"> <Int> 0 </Int> <key> Kanon </key> </gdat>
※.xmlヘッダーは面倒なので略している。
ソースでは以下のようになる。
//====================
// save method
//====================
public void save( String fPath ){
int i = 0;
String key = "Kanon";
//--
XmlSerializer serializer = Xml.newSerializer();
try {
FileOutputStream os = new FileOutputStream( fPath );
serializer.setOutput( os, "UTF-8" );
serializer.startDocument("UTF-8", true); // ヘッダー
//<gdat id="1">
serializer.startTag("", "gdat");
serializer.attribute("", "id", "1" );
//--
//
serializer.startTag("", "Int"); //<Int>
serializer.text( ""+i );
serializer.endTag("", "Int"); //</Int>
serializer.startTag("", "key"); //<key>
serializer.text( key );
serializer.endTag("", "key"); //</key>
//--
serializer.endTag("", "gdat"); //</gdat>
serializer.endDocument(); // フッター
serializer.flush(); // 出力
os.close();
} catch (Exception e) {
}
}
XmlSerializer は、それ自身でファイルにする能力はないようだ。
そのため、FileOutputStream を出力先として指定している。( setOutput )
また、出力先には、StringWriter 等も指定できる。
編集自体は単純なので、ソースからわかるかと思う。
編集が終われば、flush() で出力。
FileOutputStream の出力先にファイルが作られる。
なお、出力されたファイルを見てみると、改行コードが一切省かれていた。
それでも機能するし、データも小さくなるからいいんだけど。(^_^;
XMLの読み込み
読み込み方は、それぞれの効率性などから、色々とやり方が考えられる。
サンプルでは、単純な順番読み込みをやってみた。
//====================
// load method
//====================
public void load( String fPath ){
try{
FileInputStream is = new FileInputStream( fPath );
XmlPullParser xmlPullParser = Xml.newPullParser();
xmlPullParser.setInput( is, "UTF-8" );
String buf_s = "";
int buf_i = 0;
Log.d( "TEST", "---- load start ----" );
int i = xmlPullParser.next();
if( i == XmlPullParser.START_TAG ){
Log.d( "TEST", "Parser.getName : " +xmlPullParser.getName() ); // gat
if ( xmlPullParser.getName().equals("gdat") ){
buf_s = xmlPullParser.getAttributeValue( null, "id" ); // idの値
buf_i = Integer.parseInt( buf_s );
Log.d( "TEST", "" +buf_i );
}
xmlPullParser.next();
if ( xmlPullParser.getName().equals("Int") ){ //Int
buf_s = xmlPullParser.nextText();
buf_i = Integer.parseInt( buf_s );
Log.d( "TEST", "" +buf_i );
}
xmlPullParser.nextTag(); // -><END_TAG>
xmlPullParser.nextTag(); // -><START_TAG>
if ( xmlPullParser.getName().equals("key") ){ //key
buf_s = xmlPullParser.nextText();
Log.d( "TEST", "" +buf_s );
}
}
Log.d( "TEST", "---- load over ----" );
is.close();
}catch( Exception ex ){
Log.d( "Deb", "load error...(game data)" );
}
//--
}
非常にお莫迦なサンプルなので、実用的ではないね。(笑
XmlPullParser は一行ごとに読み込みを行うようだ。
next…とついているmethod は、「行送りをする」と考えていい。
next() … 一行送り。 nextText() … タグのtextを読み込み、一行送る。 nextTag() … 次の START_TAG か END_TAG まで送る
getAttributeValue でタグのパラメータの値を取り出せる。
パラメータ名の他にも、要素位置で読む方法もある。
getAttributeValue(0)
getName でタグの名前を取得。
.equals で、文字列の比較を行える。
.equals(“gdat”) だとしたら、==”gdat” と読み替えると理解しやすい。
ここで取り上げた使用方法はほんの一例。
他にも色々なmethod ややり方があるので、それぞれ調べてみてほしい。


![著作権フリー背景素材集[家]](http://img.dlsite.jp/modpub/images2/work/doujin/RJ089000/RJ088095_img_mini.jpg)





migimaki.com











![著作権フリー背景素材集[家]](http://img.dlsite.jp/modpub/images2/work/doujin/RJ089000/RJ088095_img_sam.jpg)
右巻きソフトウェア
