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 ややり方があるので、それぞれ調べてみてほしい。