サンプルプログラム工場

AAKAKA Appで使われているプログラムのサンプルコードをそのまま公開!

サンプルプログラム工場 > android > AndroidでXMLの保存/読み込み/追加書き込みサンプル#tryXml00
Google Play AAKAKAxSOFTへ

AndroidでXMLの保存/読み込み/追加書き込みサンプル#tryXml00

実行ファイル(APK)やサンプル(zip)をダウンロードする
tryXml00の実行イメージtryXml00の実行イメージ

ローカルファイルにXML形式でデータを保存する。
読み込んだデータにそのまま追加書き込みみたいなことはできないみたいなので、読み込んだデータに新しく追加したデータを加えてあたらしくXMLファイルに書き出している。
やっぱしSQLite使った方が楽だし使い勝手もいいんだろうか…。

検索した事
 SharedPreferences
 android ローカルファイル 削除
 java 今の時間 文字列
 XmlPullParser next

開発環境
 Eclipse IDE バージョン: 3.7 Indigo Service Release 2
 ターゲットプラットフォーム: 2.1
 API レベル: 7

package junkcode.sample.tryxml00;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import android.net.NetworkInfo.DetailedState;
import android.os.Bundle;
import android.app.Activity;
import android.util.Xml;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.support.v4.app.NavUtils;

public class MainActivity extends Activity {

	// ファイル名はパスなすで指定する。パスはOSが勝手にアプリごとに勝手に決めてくるので指定することはできない。
	private static final String FILE_NAME = "trylocalfile00.txt";
	
	private ArrayList<XmlItem> mItemList = new ArrayList<XmlItem>();
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 保存されたデータの最初の読み込み
        this.readXml();
        
        this.printXmlData();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    // ////////////////////////////////////////////////////////////
    // 書き込みが押されたときに呼ばれる
    public void onClick_buttonWrite(View view) {
    	// 入力されたモノを取り出す
    	EditText editText = (EditText)this.findViewById(R.id.editText_input);
    	String text = editText.getText().toString().trim();
    	
    	// 何か値が入ってるときは書き込む
    	if (0 < text.length()) {
    		
    		// テキストを追加する
    		XmlItem item = new XmlItem();
    		item.no = this.mItemList.size();
    		item.text = text;
    		this.mItemList.add(item);
    		
    		// XMLファイルに書き出す
    		this.writeXml();
    		
    		// 内容を再読込する
    		this.readXml();

    		this.printXmlData();
    	}
    }
    
    
    // ////////////////////////////////////////////////////////////
    // ファイルに書き込む
    public void writeXml() {
    	try {

		// ファイル出力ストリームを作る
    		BufferedWriter bufferWriter = new BufferedWriter(new OutputStreamWriter(
			new FileOutputStream(FILE_NAME, false)));
			
    		// ストリームを作って保存する
    		// 下のやり方だとパスに"/"が入ってる時にエラー吐いて落ちるから↑のようにストリームを
    		// 作ってやるほうが落ちなくていい。
    		//OutputStream out = this.openFileOutput(FILE_NAME, MODE_PRIVATE);
    		//BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
    		XmlSerializer xmlse = Xml.newSerializer();
    		xmlse.setOutput(bufferWriter);

    		OutputStream out = this.openFileOutput(FILE_NAME, MODE_PRIVATE);
    		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
    		XmlSerializer xmlse = Xml.newSerializer();
    		xmlse.setOutput(writer);
    		
    		// ドキュメントのスタート
    		xmlse.startDocument(null, Boolean.TRUE);
    		xmlse.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
    		
    		// ここらへんで好きなモノ入力する
    		xmlse.startTag(null, "rootNode");

    		
    		// バッファにためてあるモノを書き込む
    		for (int i = 0; i < this.mItemList.size(); i++) {
    			XmlItem curr = this.mItemList.get(i);
    			
    			// Itemノードを書き出す
    			xmlse.startTag(null, "item");
    			xmlse.attribute(null, "no", curr.no + "");
    			xmlse.text(curr.text);
    			xmlse.endTag(null, "item");
    		}
    		
    		
    		xmlse.endTag(null, "rootNode");
    		
    		// タグの終了と書き出し
    		xmlse.endDocument();
    		xmlse.flush();
    		
    		out.close();
    		
    	} catch (FileNotFoundException e) {
    		e.printStackTrace();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }
    
    // ////////////////////////////////////////////////////////////
    // EditTextにXMLのデータを表示する
    public void printXmlData() {
    	// 読み込まれた内容で、EditTextを更新する
		EditText editTextLocalfile = (EditText)this.findViewById(R.id.editText_localfile);
		
		// ファイル内の内容を表示する
		editTextLocalfile.setText("");

		XmlItem item;
		// バッファにためてあるモノを書き込む
		for (int i = 0; i < this.mItemList.size(); i++) {
			item = this.mItemList.get(i);
			editTextLocalfile.append("no:" + item.no + " text: " + item.text + "\n");
		}
    }
    
    // ////////////////////////////////////////////////////////////
    // ファイルから読み込む
    public void readXml() {
    	
    	mItemList.clear();
    	
    	try {
    		InputStream is = this.openFileInput(FILE_NAME);
    		BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    		
    		/*
    		// 内容を確認するときここを使う
    		StringBuffer buf = new StringBuffer();
		    String str;
		    while ((str = reader.readLine()) != null) {
		            buf.append(str);
		            buf.append("\n");
		    }
		    String s = buf.toString();
		    */
    		
    		// XMLの読み込みの開始
    		XmlPullParser xmlpl = Xml.newPullParser();
    		xmlpl.setInput(reader);
    		String name = "";
    		
    		// ドキュメントの最後まで順番に
    		int eventType = xmlpl.getEventType();
    		while (eventType != XmlPullParser.END_DOCUMENT) {
    			eventType = xmlpl.getEventType();
    			name = xmlpl.getName();
    			
    			// タグが開いたり閉じたりのイベントごとに処理を分ける
    			switch (eventType) {
    			// XMLドキュメントの開始
    			case XmlPullParser.START_DOCUMENT:
    				break;
    			// 何かタグが開かれた
    			case XmlPullParser.START_TAG:
    				
    				// itemノードの始まり
    				if (name.equals("item")) {
    					
    					// 読み込む
    					XmlItem newItem = new XmlItem();
    					
    					newItem.no = Integer.parseInt(xmlpl.getAttributeValue(null, "no"));
    					newItem.text = xmlpl.nextText();
    					this.mItemList.add(newItem);
    				}
    				break;
    			// 何かタグが閉じられた
    			case XmlPullParser.END_TAG:
    				break;
    			// タグに挟まれたテキスト
    			case XmlPullParser.TEXT:
    				break;
    			// ドキュメントが終了した
    			case XmlPullParser.END_DOCUMENT:
    				break;
    			}
    			
    			// 次のイベントタイプへ
    			// コレを呼び出すと1行下へ下がっていくイメージ
    			xmlpl.next();
    		}
    		
    	} catch (IOException e) {
    		e.printStackTrace();
    		
    		// ↓setInput使うのにコレがいるみたい。
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		}
    }
}

// ////////////////////////////////////////////////////////////
// XMLに書き込まれたモノ
class XmlItem {
	public int no;
	public String text;
}

APKファイルをダウンロード サンプルプロジェクトをダウンロード

, , , , , ,

Androidでローカルファイルにデータを保存するサンプル#tryLocalFile00 AndroidでSQLiteのデータベースで読み書きサンプル#trySqLite00

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>