Pull解析器解析XML
除了可以使用SAX或DOM解析XML文件之外,也可以使用Pull解析器解析XML文件。Pull解析器是一个开源的
java项目,既可以用于android,Android已经内置了,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入
类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml
文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,
如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解
析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调
用parser.nextText()方法可以获取下一个Text类型节点的值。
现在看看是怎么具体进行解析的!,现在我们要解析服务器端的一个xml文件-----person.xml。person.xml的代码
结构如下:
<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?> <persons> <person> <name id="1">wangjing</name> <age>18</age> </person> <person> <name id="2">zahnsan</name> <age>19</age> </person> <person> <name id="3">lisi</name> <age>20</age> </person> </persons></span>
现在定义一个HttpUtils用来获取服务器端的person.xml文件的输入流
public class HttpUtils { public static InputStream getInputStream(String path) throws IOException{ URL url=new URL(path); HttpURLConnection coon=(HttpURLConnection) url.openConnection(); coon.setReadTimeout(50000); coon.setRequestMethod("POST"); if( coon.getResponseCode()==200){ return coon.getInputStream(); } return null; } }
对于person.xml解析的结果,我们用一个Person实体类进行封装起来
public class Person { private String name; private String age; private String id; public Person(String name,String age,String id) { super(); this.name = name; this.age = age; 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 getId() { return id; } public void setId(String id) { this.id = id; } public Person() { super(); } @Override public String toString() { return "Person [name=" + name + ",age=" + age + ",id=" + id + "]"; } }
public class PullParse { public List<Person> pullPersonXml(String path) throws Exception { List<Person> list = null; Person person = null; // 创建工厂类对象 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); // 创建解析器对象 XmlPullParser parser = factory.newPullParser(); InputStream stream = HttpUtils.getInputStream(path); BufferedReader bis = new BufferedReader(new InputStreamReader(stream,"UTF-8")); // 把被解析的文件的读取流给解析器 parser.setInput(bis); // 解析器在解析过程中会返回编号0,2,4,3,1 int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<>(); break; case XmlPullParser.START_TAG: // 得到标签名称 String tagName = parser.getName(); if ("person".equals(tagName)) { person = new Person(); } else if ("name".equals(tagName)) { //属性可能不止一个,所以我们先获取个数 int count = parser.getAttributeCount(); for (int i = 0; i <count; i++) { //获取属性名 String attrName=parser.getAttributeName(i); //获取属性值 String attrValue=parser.getAttributeValue(i); if("id".equals(attrName)){ person.setId(attrValue); } } person.setName(parser.nextText());// 直接得到标签后面的数据 } else if ("age".equals(tagName)) { person.setAge(parser.nextText()); } break; case XmlPullParser.END_TAG: // 得到标签名称 tagName = parser.getName(); if ("person".equals(tagName)) { list.add(person); } break; case XmlPullParser.END_DOCUMENT: break; default: break; } // 继续下一个编号 eventType = parser.next(); } return list; } }
测试类:
public class TestPullPerson { public static void main(String[] args) throws Exception { String path="http://wangjing-pc:8080/Day16/person.xml"; PullParse pp=new PullParse(); List<Person> list = pp.pullPersonXml(path); for (Person person : list) { System.out.println(person); } } }
解析结果:
Person [name=wangjing,age=18,id=1] Person [name=zahnsan,age=19,id=2] Person [name=lisi,age=20,id=3]