Android数据存储——2.文件存储_E_Pull解析XML文档
今天学习Android数据存储——文件存储_Pull解析XML文档
如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式或DOM方式会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。使用PULL方式正合适。
XMLPULL解析就相当于是Android中的JDOM和DOM4J
PULL方式比较简单,而且可以根据判断停止解析(DOM和SAX都需要对文件的文章解析中途不能停止)。
XmlPullParserFactory类的常用方法
XmlPullParser的事件代码及常用方法
XmlSerializer接口的常用方法
实例:Pull读取\mnt\sdcard\mldndata\member.xml
XML布局:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MyDOMDemo" > <TableRow > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:text="姓名:"/> <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content"/> </TableRow> <TableRow > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:text="邮箱:"/> <TextView android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content"/> </TableRow> <TableRow > <Button android:id="@+id/but" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="读取"/> </TableRow> </TableLayout>Java代码:
保存数据的类:
/** * LinkMan保存数据的类 */ public class LinkMan { private String name; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }Pull解析工具类:
/** * XMLPull工具类 */ public class MyXMLPullUtil { private InputStream input = null; public MyXMLPullUtil(InputStream input){ this.input = input; } /** * 接收一个XML文件输入流, 从输入流中读所有LinkMan节点, 将数据封装成对象装入List返回 * @param input XML文件的输入流 * @return LinkMan对象的集合 * @throws Exception */ public List<LinkMan> getAllLinkMan() throws Exception{ List<LinkMan> all = null; //保存多条数据 LinkMan man = null; //保存一条数据 String elementName = null; //保存节点的名称 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(this.input, "UTF-8"); //设置输入流以及编码 int eventType = xpp.getEventType(); //取得事件码 while(eventType!=XmlPullParser.END_DOCUMENT){ //不是文档底部 if(eventType==XmlPullParser.START_DOCUMENT){ //文档开始 all = new ArrayList<LinkMan>(); //初始化LinkMan集合 } else if(eventType==XmlPullParser.START_TAG){ //元素标记开始 elementName=xpp.getName(); //取得元素名称 if("linkman".equals(elementName)){ man = new LinkMan(); } } else if(eventType==XmlPullParser.END_TAG){ //结束元素 elementName=xpp.getName(); //取得节点名称 if("linkman".equals(elementName)){ all.add(man); man=null; } } else if(eventType==XmlPullParser.TEXT){ //数据 if("name".equals(elementName)){ man.setName(xpp.getText()); } else if("email".equals(elementName)){ man.setEmail(xpp.getText()); } } eventType=xpp.next(); //取得下一个事件码 } return all; } }Pull解析XML测试:
public class MyXMLPullDemo extends Activity { private TextView name = null; private TextView email = null; private Button but = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.name=(TextView)super.findViewById(R.id.name); this.email=(TextView)super.findViewById(R.id.email); this.but=(Button)super.findViewById(R.id.but); this.but.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener{ @Override public void onClick(View v) { /** * Pull读取xml文件 */ if(!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)){//SD卡不存在则不操作 return;//返回到程序的被调用处 } File file = new File(Environment.getExternalStorageDirectory() +File.separator+"mldndata"+File.separator +"member.xml");//要输出的文件路径 if(!file.exists()){//文件不存在 return; } try { InputStream input = new FileInputStream(file); MyXMLPullUtil util = new MyXMLPullUtil(input); List<LinkMan> all = util.getAllLinkMan(); MyXMLPullDemo.this.name.setText(all.get(0).getName()); MyXMLPullDemo.this.email.setText(all.get(0).getEmail()); } catch (Exception e) { e.printStackTrace(); } } } }读取结果:
![](http://img-my.csdn.net/uploads/201304/16/1366107935_4360.png)
实例:Pull输出\mnt\sdcard\mldndata\member.xml
Java代码:
Pull输出XML工具类:
/** * Pull输出XML工具类,是将所有要保存的数据都使用List集合定义。 */ public class MyXMLPullUtil { private List<LinkMan> all = null; private OutputStream output = null; public MyXMLPullUtil(OutputStream output, List<LinkMan> all){ this.output = output; this.all = all; } public void save() throws Exception{ XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlSerializer xs = factory.newSerializer(); xs.setOutput(this.output, "UTF-8"); xs.startDocument("UTF-8", true); //开始文档 xs.startTag(null, "addresslist"); //开始根元素 Iterator<LinkMan> iter = this.all.iterator(); while(iter.hasNext()){ //用迭代器Iterator遍历List集合 LinkMan man = iter.next(); //开始写内部元素 xs.startTag(null, "linkman"); xs.startTag(null, "name"); xs.text(man.getName()); xs.endTag(null, "name"); xs.startTag(null, "email"); xs.text(man.getEmail()); xs.endTag(null, "email"); xs.endTag(null, "linkman"); } xs.endTag(null, "addresslist"); //结束根元素 xs.endDocument(); //结束文档 xs.flush(); //刷新 输出 } }Pull输出XML测试:
public class MyXMLPullDemo extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); /** * Pull输出xml文件 */ if(!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)){//SD卡不存在则不操作 return;//返回到程序的被调用处 } File file = new File(Environment.getExternalStorageDirectory() +File.separator+"mldndata"+File.separator +"member.xml");//要输出的文件路径 if(!file.getParentFile().exists()){//文件不存在 file.getParentFile().mkdirs();//创建文件夹 } List<LinkMan> all = new ArrayList<LinkMan>(); for(int x= 0;x < 3;x++){ LinkMan man = new LinkMan(); man.setName("李兴华 - "+x); man.setEmail("mldnqa@163.com"); all.add(man); } OutputStream output = null; try{ output = new FileOutputStream(file); new MyXMLPullUtil(output, all).save(); } catch (Exception e) { e.printStackTrace(); } finally{ if(output!=null){ try { output.close(); } catch (IOException e) { e.printStackTrace(); } } } }
查看生成文件:
![](http://img-my.csdn.net/uploads/201304/16/1366114351_6237.png)