Android 使用pull的技术解析XML
1、我们可以使用java自带的PULL来解析XML文件(不是JDK自带的,需要导入包)
2、PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件,比如开始元素和结束元素,使用parser.next()可以进行下一个元素并且触发相应的事件,事件将作为代码被发送,因此可以使用一个switch来对事件进行选择,然后进行相应的处理。当开始解析元素的时候,调用parser.nextText()方法可以获得下一个Text类型的元素。
PULL技术的特点
简单的结构:一个接口,一个工厂组成的PULL解析器
简单易用:pull解析器只有一个重要的方法next方法,他被用来检索下一个事件,而它只有5个常用的属性
START DOCUMENT
START_TAG
TEXT
END_TAG
END_DOCUMENT
第五步:建立测试使用类
1、我们可以使用java自带的PULL来解析XML文件(不是JDK自带的,需要导入包)
2、PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件,比如开始元素和结束元素,使用parser.next()可以进行下一个元素并且触发相应的事件,事件将作为代码被发送,因此可以使用一个switch来对事件进行选择,然后进行相应的处理。当开始解析元素的时候,调用parser.nextText()方法可以获得下一个Text类型的元素。
PULL技术的特点
简单的结构:一个接口,一个工厂组成的PULL解析器
简单易用:pull解析器只有一个重要的方法next方法,他被用来检索下一个事件,而它只有5个常用的属性
START DOCUMENT
START_TAG
TEXT
END_TAG
END_DOCUMENT
缺点:必须要知道节点名称才能进行判断,但后期使用的时候只需要把节点名称改变下,就可以变成非常灵活的工具类了
第一步:新建一个包libs,导入第三方的包,kxml2.2.2, 再在导入的包上点击右键,build path,添加到class path目录。
第二步:建立一个工具类
/*
* 主要是使用PULL解析XML
* */
public class pullXMLTools {
public pullXMLTools() {
// TODO 自动生成的构造函数存根
}
//从服务器获取XML文件,以流的形式返回
//encode 编码格式,要和XML编码格式一致,UTL-8
public static List<Person> parserXML(InputStream inputStream, String encode){
List<Person> list = null;
Person person = null;//用来装载解析每一个节点的内容
//创建一个XML解析的工厂
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: //开始节点:<persons>
list = new ArrayList<Person>();//建立一个集合,准备装载内容
break;
case xmlPullParser.START_TAG: //开始解析<person id = "23">
if("person".equals(parser.getName())){
person = new Person();
//取出属性值
int id = Integer.parseInt(parser.getAttributeValue(0)){ //表示第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.next());
person.setAge(age);
}
break;
case xmlPullParser.END_TAG: //表示解析到了当前结束节点,也就是当前这个person解析完了
if("person".equals(parser.getName())){
list.add(person);
person = null; //置空,准备解析下一个节点
}
break;
}
eventType = parser.next();
}
return list;
}
}
第三步:创建一个Person的实例类
public class Person {
private int id;
private String name;
private int age;
public Person() {
// TODO 自动生成的构造函数存根
}
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;
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
//为了方便打印输出,生产一个toString 方法
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ "]";
}
}
public class httpUtils {
public httpUtils() {
// TODO 自动生成的构造函数存根
}
//从服务器获取文件返回流
public static InputStream getXML(String path){
InputStream inputStream = null;
try {
URL url = new URL(path);
if(url != null){
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(3000);
connection.setDoInput(true);
connection.setRequestMethod("GET");
int code = connection.getResponseCode();
if(code == 200){
inputStream = connection.getInputStream();
}
}
} catch (Exception e) {
// TODO: handle exception
}
return inputStream;
}
}
第五步:建立测试使用类
public class Test {
public Test() {
// TODO 自动生成的构造函数存根
}
public static void main(String[] args){
String path = "http://192.168.0.102/myHttp/person.xml";
InputStream inputStream = httpUtils.getXML(path);
List<Person> list = pullXMLTools.parserXML(inputStream, "utf-8");
//增强for循环,输出person内容
for(Person person : list){
System.out.print(person.toString());
}
}
}