Android使用Pull解析器解析XML文件


Pull简介

   1.常见的XML解析方式有三种,DOM、SAX、Pull,Android系统中推荐使用Pull

   2.Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目

   3.Android SDK中已经集成了Pull解析器,无需添加任何jar文件

   4.Pull解析器运行方式与SAX类似,提供各种事件的判断

   5.官方网站:http://xmlpull.org/

使用Pull解析器解析XML文件

  1.  Xml.newPullParser() 获得解析器

  2  parser.setInput(in, "UTF-8") 设置输入流以及编码

  3. parser.next() 获取下一个解析事件,得到一个事件代码

  4. XmlPullParser中定义了常量来标识各种解析事件

      START_DOCUMENT、END_DOCUMENT 、START_TAG 、END_TAG 、TEXT

示例:

  1. /**  
  2.  * 接收一个XML文件输入流, 从输入流中读所有User节点, 将数据封装成对象装入List返回  
  3.  * @param in XML文件的输入流  
  4.  * @return User对象的集合  
  5.  * @throws Exception   
  6.  */  
  7. public List<User> findAll(InputStream in) throws Exception {  
  8.     // 获取Pull解析器  
  9.     XmlPullParser parser = Xml.newPullParser();  
  10.     // 解析器加载输入流  
  11.     parser.setInput(in, "UTF-8");  
  12.   
  13.     List<User> list = new ArrayList<User>();  
  14.     User user = null;  
  15.     for (int event = parser.getEventType(); event != XmlPullParser.END_DOCUMENT; event = parser.next())  
  16.         switch (event) {  
  17.             case XmlPullParser.START_TAG:  
  18.                 if ("user".equals(parser.getName())) {  
  19.                     user = new User();  
  20.                     String id = parser.getAttributeValue(0);  
  21.                     user.setId(new Integer(id));  
  22.                     list.add(user);  
  23.                 } else if ("name".equals(parser.getName())) {  
  24.                     String name = parser.nextText();  
  25.                     user.setName(name);  
  26.                 } else if ("age".equals(parser.getName())) {  
  27.                     String age = parser.nextText();  
  28.                     user.setAge(new Integer(age));  
  29.                 }  
  30.         }  
  31.   
  32.     return list;  
  33. }  

使用XmlSerializer写出XML

    使用以下方法生成XML,和XML文档顺序类似

startDocument

startTag

attribute

text

endTag

endDocument

  1. /**  
  2.  * 使用XmlSerializer写出XML  
  3.  * @param users User集合  
  4.  * @param out 输出流  
  5.  * @throws IOException  
  6.  */  
  7. public void saveAllByXmlSerializer(List<User> users, OutputStream out) throws IOException {  
  8.     XmlSerializer serializer = Xml.newSerializer();  
  9.     serializer.setOutput(out, "UTF-8");  
  10.   
  11.     serializer.startDocument("UTF-8", true);  
  12.     serializer.startTag(null, "users");  
  13.   
  14.     for (User user : users) {  
  15.         serializer.startTag(null, "user");  
  16.         serializer.attribute(null, "id", user.getId().toString());  
  17.   
  18.         serializer.startTag(null, "name");  
  19.         serializer.text(user.getName());  
  20.         serializer.endTag(null, "name");  
  21.   
  22.         serializer.startTag(null, "age");  
  23.         serializer.text(user.getAge().toString());  
  24.         serializer.endTag(null, "age");  
  25.   
  26.         serializer.endTag(null, "user");  
  27.     }  
  28.   
  29.     serializer.endTag(null, "users");  
  30.     serializer.endDocument();  
  31. }  

用StringBuilder写出XML文件

以下是自己拼接的而成的,如果里边有特殊符号的话就不太好做

  1. /**  
  2.  * 将若干User用XML形式描述, 输出到指定输出流  
  3.  * @param users User集合  
  4.  * @param out 输出流  
  5.  * @throws IOException   
  6.  */  
  7. public void saveAll(List<User> users, OutputStream out) throws IOException {  
  8.     StringBuilder sb = new StringBuilder();  
  9.     sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");  
  10.     sb.append("<users>");  
  11.     for (User user : users) {  
  12.         sb.append("<user id=\"" + user.getId() + "\">");  
  13.         sb.append("<name>" + user.getName() + "</name>");  
  14.         sb.append("<age>" + user.getAge() + "</age>");  
  15.         sb.append("</user>");  
  16.     }  
  17.     sb.append("</users>");  
  18.     out.write(sb.toString().getBytes());  
  19.     out.close();  
  20. }  

相关内容