关于 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
等:我的下篇博客、、、