Pull解析
【原理】:Pull解析的原理跟SAX解析的原理很相似。
【优点】:除了有了SAX的优点之外,Pull还多另外一个优点。Pull解析器的工作方式允许你在应用程序代码中主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需求的条件后不再获取事件,结束解析。(SAX是不能控制事件的处理主动结束)
【缺点】:跟SAX类似,我就不再多说了。
直接看代码,看看Pull到底怎么解析XML文件的。
一,准备好的xml格式的文件(person.xml)
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>jack</name>
<age>30</age>
</person>
<person id="20">
<name>rose</name>
<age>25</age>
</person>
</persons>
二,准备好相关jar包。
jar包的下载地址是 http://kxml.sourceforge.net/
三,就是解析xml的类了(PullXML)。
package com.pull.parser;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import com.pull.domain.Person;
/**
* 主要是使用PULL解析XML
* @author Sym
*/
public class PullXML {
/**
* @param inputStream 获取xml文件,以流的形式返回
* @param encode 编码格式
* @return
*/
public static List<Person> parseXML(InputStream inputStream, String encode){
List<Person> list = null;
Person person = null;//装载解析每一个person节点的内容
//创建一个xml解析的工厂
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//获得xml解析类的引用
XmlPullParser parser = factory.newPullParser();
parser.setInput(inputStream,encode);
//获得事件的类型
int eventType = parser.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if("person".equals(parser.getName())){
person = new Person();
int id = Integer.parseInt(parser.getAttributeValue(0));
person.setId(id);
}else if("name".equals(parser.getName())){
String name = parser.nextText();//获取该节点的内容
person.setName(name);
}else if("age".equals(parser.getName())){
int age = Integer.parseInt(parser.nextText());
person.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){
list.add(person);
person = null;
}
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
这个Person实体类。
package com.pull.domain;
public class Person {
private int id;
private String name;
private int age;
public Person() {}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
这个是测试类
package com.pull.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
import com.pull.domain.Person;
import com.pull.parser.PullXML;
public class Test {
public Test() {}
public static void main(String[] args) {
InputStream inputStream;
try {
inputStream = new FileInputStream(new File("d:/person.xml"));
List<Person> list = PullXML.parseXML(inputStream, "utf-8");
for(Person person:list){
System.out.println(person.toString());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
四,就是console的输出结果