import java.io.IOException; import java.io.StringWriter; import java.util.List; import org.xmlpull.v1.XmlSerializer; import android.util.Xml; public class PullXML { public static String writeXML(List<String> persons) throws IllegalArgumentException, IllegalStateException ,IOException{ XmlSerializer serializer = Xml.newSerializer(); StringWriter writer = new StringWriter(); serializer.setOutput(writer); //开始文档 serializer.startDocument("UTF-8", true); //设置开始标签 serializer.startTag(null, "persons"); for(String person:persons){ serializer.startTag(null,"person"); serializer.startTag("", "name"); serializer.attribute("", "id", person); serializer.text(person); serializer.endTag("", "name"); serializer.startTag("", "age"); serializer.text(person); serializer.endTag("", "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); return writer.toString(); } } Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析 xml <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>小明</name> <age>23</age> </person> <person id="2"> <name>小李</name> <age>25</age> </person> </persons> public static List<Person> ReadXmlByPull (InputStream inputStream)throws Exception { List <Person> personList = null; /** * android给我们提供了xml 用来得到xmlpull解析器 */ XmlPullParser xmlpull = Xml.newPullParser(); /** * 将输入流传入 设定编码方式 * */ xmlpull.setInput(inputStream, "utf-8"); /** * pull读到xml后 返回数字 * 读取到xml的声明返回数字0 START_DOCUMENT; 读取到xml的结束返回数字1 END_DOCUMENT ; 读取到xml的开始标签返回数字2 START_TAG 读取到xml的结束标签返回数字3 END_TAG 读取到xml的文本返回数字4 TEXT */ int eventCode = xmlpull.getEventType(); /** * 只要这个事件返回的不是1 我们就一直读取xml文件 */ Person person = null; while(eventCode!=XmlPullParser.END_DOCUMENT) { switch (eventCode) { case XmlPullParser.START_DOCUMENT: {//开始文档 new数组 personList =new ArrayList<Person>(); break; } case XmlPullParser.START_TAG: { if("person".equals(xmlpull.getName())) { person = new Person(); person.setId(xmlpull.getAttributeValue(0)); }else if (person!=null) { if(("name".equals(xmlpull.getName()))) { /** * 如果当前元素的下一个元素是文本节点 就可以直接用nextText()这个方法来得到文本节点的内容 */ person.setName(xmlpull.nextText()); }else if ("age".equals(xmlpull.getName())) { /** * 如果当前元素的下一个元素是文本节点 就可以直接用nextText()这个方法来得到文本节点的内容 */ person.setAge(xmlpull.nextText()); } } break; } case XmlPullParser.END_TAG: { if("person".equals(xmlpull.getName())&&person!=null) { personList.add(person); person = null; } break; } } eventCode = xmlpull.next();//没有结束xml文件就推到下个进行解析 } return personList; } 通过pull写XML文件