PULL解析XML文件

来源:互联网 发布:mac比较好用的浏览器 编辑:程序博客网 时间:2024/06/07 07:59

PULL解析XML文件的步骤:

1,  导包
 2,  创建pull解析器工厂
 3,  创建解析器对象
 4,  设置解析的数据源(要解析的内容)
 5,   获取事件的类型(int)  
 6,  循环解析, 直到文档解析完成

解析实例:

XML文件:

<?xml version="1.0" encoding="UTF-8"?><students><student ><id>1</id><name>zhangsan</name><age>20</age><sex>male</sex></student><student ><id>2</id><name>lisi</name><age>21</age><sex>female</sex></student></students>

Student类:

public class Student {private int id;private String name;private String age;private String sex;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";}}

public static void main(String[] args) throws XmlPullParserException, IOException {//1, 导包//2, 得到Pull解析器工厂XmlPullParserFactory  factory = XmlPullParserFactory.newInstance();//3, 得到Pull解析器XmlPullParser parser = factory.newPullParser();//4, 指定要解析的文件parser.setInput(new FileReader("XML文件路径"));//5, 获取事件的状态类型int type = parser.getEventType();//获取当前解析标签的名称String tag = null;//数据集合ArrayList<Student> list = null;//当前"组装"数据的对象Student student = null;//6, 循环解析, 直到文档结束while (type!=XmlPullParser.END_DOCUMENT) {//获取标签名称tag = parser.getName();switch(type){case XmlPullParser.START_DOCUMENT://文档的开始list = new ArrayList<>();break;case XmlPullParser.START_TAG://标签的开始 if("student".equals(tag)){student = new Student();}else if("id".equals(tag)){String str = parser.nextText();student.setId(Integer.parseInt(str));}else if("name".equals(tag)){String str = parser.nextText();student.setName(str);}else if("age".equals(tag)){String str  = parser.nextText();student.setAge(str);}else if("sex".equals(tag)){String str = parser.nextText();student.setSex(str);}break;case XmlPullParser.END_TAG:if("student".equals(tag))//</students>{list.add(student);}break;}//获取下一个事件的类型, 不写就死循环了!!  一定要写的type = parser.next();}for(Student s:list){System.out.println(s);}}}

但是XML文件:

<?xml version="1.0" encoding="UTF-8"?><students><student id="1"><name>zhangsan</name><age>20</age><sex>male</sex></student><student id="2"><name>lisi</name><age>21</age><sex>female</sex></student></students>

修改为:

public class DemoPull02 {/** * @param args * @throws XmlPullParserException  * @throws IOException  */public static void main(String[] args) throws XmlPullParserException, IOException {// 解析器工厂XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//解析器XmlPullParser parser = factory.newPullParser();//设置数据源parser.setInput(new FileReader("XML文件路径"));//获取事件的类型int type = parser.getEventType();String tag = null;ArrayList<Student> list = null;Student student = null;//循环解析, 直到文档结束while (type!=XmlPullParser.END_DOCUMENT) {//值为: 1tag = parser.getName();switch (type) {case XmlPullParser.START_DOCUMENT://值为: 0list = new ArrayList<>();break;case XmlPullParser.START_TAG://值为: 2if("student".equals(tag)){//实例化studentstudent = new Student();//获取属性int count  = parser.getAttributeCount();for(int i=0;i<count;i++){String attName = parser.getAttributeName(i);String attValue = parser.getAttributeValue(i);if("id".equals(attName))//如果属性名称为id   , 那么需要在student中设置id{student.setId(Integer.parseInt(attValue));}}//如果确定只要一个id//student.setId(Integer.parseInt(parser.getAttributeValue(0)));}else if("name".equals(tag)){String str = parser.nextText();student.setName(str);}else if("age".equals(tag)){String str = parser.nextText();student.setAge(str);}else if("sex".equals(tag)){String str = parser.nextText();student.setSex(str);}break;case XmlPullParser.END_TAG://值为: 3if("student".equals(tag)){list.add(student);}break;}//获取下一个事件, 防止死循环type = parser.next();}for(Student s:list){System.out.println(s);}}}


0 0