1.摘要
android中通过URL获取的数据中JSON格式和Xml格式是两种非常常见的响应返回格式 。这篇文章主要讲解通过Pull解析的方式来解析xml格式的文档
2.实例讲解
2.1 Xml 文本
例如我们通过URL访问网络,返回的是以下的xml格式文本。 在xml文档中 整个文档内容称之为一个Document.
<xxx>为一个开始标签,</xxx> 为一个结束标签;
<?xml version = "1.0" encoding = "GB2312"?>
<Users>
<User >
<id>1</id>
<name>张三</name>
<password>zhangsan</password>
<sex>男</sex>
<age>10</age>
</User>
<User>
<id>2</id>
<name>李四</name>
<password>lisi</password>
<sex>女</sex>
<age>11</age>
</User>
</Users>
2.2 下面是封装类代码和解析代码(把整个文档内容作为一个 xml 字符串)
我们最终的目的是要获得user的 id 、name、 password、 sex、 age,所以我们可以把它们作为user的属性封装起来,下面是封装类的代码:
/**
* User封装类
*/
public class User {
private String id;
private String name;
private String password;
private String sex;
private String age;
public User(String id, String name, String password, String sex, String age) {
this.id = id;
this.name = name;
this.password = password;
this.sex = sex;
this.age = age;
}
public User() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
'}';
}
}
Pull解析代码
public static List<User> parseNewsOfXml(String xml){
try {
//获得xml的解析工厂
XmlPullParserFactory pullParserFactory=XmlPullParserFactory.newInstance();
//根据工厂获取实例
XmlPullParser pullParser=pullParserFactory.newPullParser();
//设置需要解析的数据
//new ByteArrayInputStream(xml.getBytes("UTF-8")) 相当于把xml字符串转化为字符数组,然后
//再转化为输入流
pullParser.setInput(new ByteArrayInputStream(xml.getBytes("UTF-8")),"UTF-8");
//取得事件
int event=pullParser.getEventType();
List<User>users=null;
User user=null;
/**
* 判断如果文档不是处于结束位置,执行循环,获得数据
*/
while (event!=XmlPullParser.END_DOCUMENT){
//节点:<xxx>或</xxxx>
//获取节点名称:即时里面的 “xxx”
String nodeName=pullParser.getName();
switch (event){
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG: //标签的开始: <xxx>
if ("users".equals(nodeName)){ //集合
users=new ArrayList<>();
}else if ("user".equals(nodeName)){//封装对象
user=new User();
}else if ("id".equals(nodeName)){//对象属性
user.setId(pullParser.nextText());
}else if ("name".equals(nodeName)){//对象属性
user.setName(pullParser.nextText());
}else if ("password".equals(nodeName)){//对象属性
user.setPassword(pullParser.nextText());
}else if ("sex".equals(nodeName)){//对象属性
user.setSex(pullParser.nextText());
}else if ("age".equals(nodeName)){//对象属性
user.setAge(pullParser.nextText());
}
break;
case XmlPullParser.END_TAG:// 标签的结束: </xxx> 这里代码第一个 </user>
if ("user".equals(nodeName)){ //往集合中添加元素
users.add(user);
}
break;
}
event=pullParser.next();//执行下一个
}
return users;
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
当解析代码执行完毕,整个Xml文本就解析完毕了,所有的内容均被放在一个 List 集合中。