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