pull xml(1): 创建xml文件

关于 xml 文件的解析,在android平台有很多方式,sax、dom、json以及pull。

主要说说 pull 技术吧。今天主要说说使用 pull 技术创建 xml 文件。

使用 Anroid 内置的 Pull 解析器来解析 XML 文件,Pull 解析器运行方式与SAX解析器类似,它提供了类似 ide 事件,如:开始元素和结束元素,使用 parser.next() 可以进入下一个元素并触发相应的事件。事件作为数值代码被发送,因此可以使用一个 switch 对感兴趣的事件进行处理。当元素开始解析时,调用 parser.nextText()方法获取一个 Text 类型的节点的值。jar 包集中在 android 系统中,直接就可以使用。
使用 pull 解析器生成 XML 文件,有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个 stringBuffer 组成 XML内容,然后把内容写入到文件中,但是这种方式看起来太山寨,或者使用 DOM API  生成 XML 文件,或者也可以 PULL 解析器生成 XML 文件,推荐使用 pull 解析器。

XML Pull Parsing是一个开源项目,详见:http://www.xmlpull.org/

在android平台,如果想保存一些数据,可以采用xml文件形式。今天模拟保存view状态,想生成的xml文件内容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<state>
	<view name="button">
		<text>send</text>
		<id>10</id>
	</view>
	
	<view name="textview">
		<text>this is a demo!</text>
		<id>11</id>
	</view>
</state>
那么,先构建一个ViewState类,定义一些属性,代码如下:

package mark.zhang;

public class ViewState {

	private String name;
	private int id;
	private String text;

	public ViewState() {
		// to do
	}

	public ViewState(String name, String text, int id) {
		this.name = name;
		this.id = id;
		this.text = text;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}

	public void setText(String text) {
		this.text = text;
	}

	public String getText() {
		return text;
	}
}
另外,构建一个生成xml文件的业务类,PullXMLUtils代码如下:

package mark.zhang;

import java.io.OutputStream;
import java.io.Writer;
import java.util.List;

import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

public class PullXMLUtils {

	/**
	 * 创建xml文件
	 * 
	 * @param items
	 *            存储view状态
	 * @param outStream
	 *            输出
	 * @throws Exception
	 */
	public static void createXML(List<ViewState> items, OutputStream outStream)
			throws Exception {
		XmlSerializer serializer = Xml.newSerializer();
		// 设置输出及编码
		serializer.setOutput(outStream, "utf-8");
		// 构建文档类似:<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
		serializer.startDocument("utf-8", true);
		// 开始Tag
		serializer.startTag(null, "state");

		for (ViewState vs : items) { // 增强for循环
			serializer.startTag(null, "view");
			serializer.attribute(null, "name", vs.getName());

			serializer.startTag(null, "text");
			serializer.text(vs.getText());
			serializer.endTag(null, "text");

			serializer.startTag(null, "id");
			serializer.text(String.valueOf(vs.getId()));
			serializer.endTag(null, "id");

			serializer.endTag(null, "view");
		}
		// 结束Tag
		serializer.endTag(null, "state");
		// 结束文档
		serializer.endDocument();
		// 关闭流
		outStream.flush();
		outStream.close();
	}

	/**
	 * 创建xml文件,过载方法
	 * 
	 * @param items
	 *            存储view状态
	 * @param writer
	 *            字符流
	 * @throws Exception
	 */
	public static void createXML(List<ViewState> items, Writer writer)
			throws Exception {
		XmlSerializer serializer = Xml.newSerializer();
		serializer.setOutput(writer);
		serializer.startDocument("utf-8", true);
		serializer.startTag(null, "state");

		for (ViewState vs : items) {
			serializer.startTag(null, "view");
			serializer.attribute(null, "name", vs.getName());

			serializer.startTag(null, "text");
			serializer.text(vs.getText());
			serializer.endTag(null, "text");

			serializer.startTag(null, "id");
			serializer.text(String.valueOf(vs.getId()));
			serializer.endTag(null, "id");

			serializer.endTag(null, "view");
		}
		serializer.endTag(null, "state");
		serializer.endDocument();
		// 关闭流
		writer.flush();
		writer.close();
	}
}
基本上完成一大半,接着看看Activity的代码:

package mark.zhang;

import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;

import mark.zhag.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

/**
 * @author mark
 *
 */
public class MasterActivity extends Activity {
	private Button btn_createXML = null;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViews();
        setEvens();
    }

	/**
	 * 设置监听
	 * 
	 */
	private void setEvens() {
		btn_createXML.setOnClickListener(new ListenerEven());
	}

	/**
	 * 创建控件对象
	 */
	private void findViews() {
		btn_createXML = (Button) findViewById(R.id.btn_createXML);
	}
	
	
	/**
	 * 创建xml文件
	 * @throws Exception
	 */
	public void createXML() throws Exception {
		// 创建文件保存路径:data/data/app/files/uistate.xml
		File file = new File(getFilesDir(), "uistate.xml");
		
		ArrayList<ViewState> vState = new ArrayList<ViewState>();
		// 添加数据
		vState.add(new ViewState("button", "send", 10));
		vState.add(new ViewState("textview", "this is a demo!", 11));
		
		// 方式1
		/*FileOutputStream outStream = new FileOutputStream(file);
		PullXMLUtils.createXML(vState, outStream);*/
		
		// 方式2
		FileWriter writer = new FileWriter(file);
		PullXMLUtils.createXML(vState, writer);
		
		// 方式3:可用于显示
		/*StringWriter sWriter = new StringWriter();
		Log.d("mark", sWriter.toString());*/
	}
	
	final class ListenerEven implements OnClickListener {
		
		@Override
		public void onClick(View v) {
			switch(v.getId()) {
			case R.id.btn_createXML:
				try {
					createXML();
				} catch (Exception e) {
					e.printStackTrace();
				}
				break;
			default:
				break;
			}
		}
	}
}
注意:getFileDir() 是 ContextWrapper 类的方法,该类是 Activity 的间接父类。getFileDir() 可以获取/data/data/app包名称/files。


好了,看看/data/data/app包名称/files目录下面,是不是这样:




打开看看,应该与预想一致(你需要重新排列一下该文件,使用eclipse的source/format吧!)。


如果,你是一个喜欢研究的人,想继续入门xml解析技术,有两种选择:
看:http://hi.baidu.com/chenjinbo1983/blog/item/5160b0f167478bb7a40f52b7.html
等:我的下篇博客、、、


你可能感兴趣的:(exception,xml,String,null,button,encoding)