使用Pull解析器读取XML文件:
除了可以使用 SAX或DOM解析XML文件之外,也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
使用Pull解析器生成XML文件:
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐使用Pull解析器。
使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件,代码在下方
public static String writeXML(List<Person> persons, Writer writer){
XmlSerializer serializer = Xml.newSerializer();try {serializer.setOutput(writer);serializer.startDocument("UTF-8", true);//第一个参数为命名空间,如果不使用命名空间,可以设置为nullserializer.startTag("", "persons");for (Person person : persons){serializer.startTag("", "person");serializer.attribute("", "id", person.getId().toString());serializer.startTag("", "name");serializer.text(person.getName());serializer.endTag("", "name");serializer.startTag("", "age");serializer.text(person.getAge().toString());serializer.endTag("", "age");serializer.endTag("", "person");}serializer.endTag("", "persons");serializer.endDocument();return writer.toString();} catch (Exception e) {e.printStackTrace();}return nul;}示例代码: package fu.dao.li.test.dao; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.os.Environment; import android.util.Xml; import fu.dao.li.test.domain.Sms; public class XmlFile { //自定义将数据以xml文件的形式写到sd卡中 public static boolean fileXml(List<Sms> list){ StringBuilder sb=new StringBuilder(); sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); sb.append("<Smss>"); for(Sms s:list){ sb.append("<sms>"); sb.append("<id>").append(s.getId()).append("</id>"); sb.append("<data>").append(s.getData()).append("</data>"); sb.append("<time>").append(s.getTime()).append("</time>"); sb.append("<name>").append(s.getName()).append("</name>"); sb.append("</sms>"); } sb.append("</Smss>"); try { File file=new File(Environment.getExternalStorageDirectory(),"sms.xml"); System.out.println(file); OutputStream out=new FileOutputStream(file); out.write(sb.toString().getBytes()); out.close(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } //Xml文件序列化 public static boolean SerialzalXml(List<Sms> list){ //创建一个xml文件的序列化 XmlSerializer serializer=Xml.newSerializer(); //创建一个文件 File file=new File(Environment.getExternalStorageDirectory(),"sms2.xml"); try { OutputStream out=new FileOutputStream(file); //初始化序列化器以什么编码写出数据 serializer.setOutput(out, "utf-8"); //设置xml文件以什么编码解析 serializer.startDocument("utf-8", true); //设置xml文件开头标签 serializer.startTag(null, "smss"); for(Sms s:list){ serializer.startTag(null, "id"); serializer.text(s.getId()+""); serializer.endTag(null,"id"); serializer.startTag(null, "data"); serializer.text(s.getData()); serializer.endTag(null,"data"); serializer.startTag(null, "time"); serializer.text(s.getTime()); serializer.endTag(null,"time"); serializer.startTag(null, "name"); serializer.text(s.getName()); serializer.endTag(null,"name"); } serializer.endTag(null, "smss"); serializer.endDocument(); out.close(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } //解析Xml文件 public static List<Sms> PullXml() throws Exception{ File file=new File(Environment.getExternalStorageDirectory(),"sms.xml"); InputStream in=new FileInputStream(file); //创建一个xmlpull解析器 XmlPullParser parser=Xml.newPullParser(); //设置xml解析器的解码格式 parser.setInput(in,"utf-8"); Sms s=null; //创建一个集合存储解析到的数据 List<Sms> list=null; //获取解析到的节点类型,pull解析将解析到的不同节点类型用不同的int数据来表示,如文档开始标签用1来表示 int type=parser.getEventType(); //遍历xml,如果解析到的标签类型不是xml结束标志则继续 while(type!=XmlPullParser.END_DOCUMENT){ switch(type){ //判断是否是开始标签 case XmlPullParser.START_TAG: if("Smss".equals(parser.getName())){ list=new ArrayList<Sms>(); }else if("sms".equals(parser.getName())){ s=new Sms(); }else if("id".equals(parser.getName())){ //获取下一个节点的文本数据,如果没有文本数据则返回null int id=Integer.parseInt(parser.nextText()); //返回当前节点的文本,(在xml文件中空白区域也被当成文本数据) //System.out.println("-----"+parser.getText()); s.setId(id); }else if("data".equals(parser.getName())){ String data=parser.nextText(); s.setData(data); }else if("time".equals(parser.getName())){ String time=parser.nextText(); s.setTime(time); }else if("name".equals(parser.getName())){ String name=parser.nextText(); s.setName(name); } break; //判断是否是结束标签 case XmlPullParser.END_TAG: if("sms".equals(parser.getName())){ list.add(s); s=null; } break; } //在解析中这句很重要,返回解析到的下一个节点类型 type=parser.next(); } return list; } }