任意のXMLファイルの作成

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

Comments are closed.