老罗视频学习笔记。
sax和pull是android常用的两种解析xml文件的方式,但是pull更常用,以为代码量小很多。
pull有五个常用的属性:
START_DOCUMENT:文档开始,相当于<persons>
START_TAG:节点开始,相当于<person>
TEXT:
END_TAG:节点结束,相当于</person>
END_DOCUMENT:文档结束,相当于</persons>
要解析的服务器端的xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李老师</name>
<age>23</age>
</person>
<person id = "24">
<name>张老师</name>
<age>26</age>
</person>
</persons>
一.客户端。
新建一个java project。
因为pull不是系统自带的,要使用pull解析,需要网上下载第三方pull解析器,本例使用kxml2-2.2.2.jar包
1)新建一个person类,用来存储person属性。
2)新建一个PullXmlParser类,添加parserXML函数,用来解析xml文件,并存入到list中,list中存入的是person类对象。
3)HttpUtils类,使用http的get方式从服务器获取xml的IO流。具体使用上一节sax方式解析xml的httpUtils文件即可。
4)测试类。
person.java内容如下:
public class person {
public person() {
// TODO Auto-generated constructor stub
}
//成员变量
private String name = null;
private int id = 0;
private int age = 0;
//有参构造函数
public person(String name, int id, int age) {
super();
this.name = name;
this.id = id;
this.age = age;
}
//get函数
public String getName() {
return name;
}
//set函数
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//toString()函数
@Override
public String toString() {
return "person [name=" + name + ", id=" + id + ", age=" + age + "]";
}
}
PullXmlParser.java内容如下,pull核心:
public class PullXmlTools {
public PullXmlTools() {
// TODO Auto-generated constructor stub
}
/**
* 想要给函数添加类似于这样的注释,可以在上方输入“/**”,然后点击回车即可
* @param inputStream从服务器获取xml,以流的方式返回
* @param encode
* @return
*/
public static List<person> parseXML(InputStream inputStream,String encode){
List<person>list = null;
//装载解析每一个person节点的内容
person personPerson = null;
//创建一个xml解析的工厂
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//获得xml解析类的引用
XmlPullParser parser = factory.newPullParser();
parser.setInput(inputStream, encode);
//获得事件的类型
int eventType = parser.getEventType();
//如果当前节点获得的事件类型不是文件结束符时
//END_DECUMENT类似于</persons>
while (eventType!=XmlPullParser.END_DOCUMENT) {
switch (eventType) {
//相当于<persons>
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<person>();
break;
//相当于<person>
case XmlPullParser.START_TAG:
if("person".equals(parser.getName())){
personPerson = new person();
//取出属性值
//getAttributeName(0)意思是第一个属性值
//System.out.print(parser.getAttributeName(0));这个获取的是"id"
int id = Integer.parseInt(parser.getAttributeValue(0));
personPerson.setId(id);
}else if ("name".equals(parser.getName())) {
String name = parser.nextText();
personPerson.setName(name);
}else if ("age".equals(parser.getName())) {
int age = Integer.parseInt(parser.nextText());
personPerson.setAge(age);
}
break;
//相当于</person>
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){
list.add(personPerson);
//解析到</person>后,要重新执行下一个<person>,在START_TAG下会重新new一个person对象出来
personPerson = null;
}
break;
}
eventType = parser.next();
}
return list;
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}
HttpUtils.java从上一节sax解析xml文件拷贝即可。
test.java文件内容如下:和上一节内容类似:
public static void main(String[] args) {
String pathString = "http://localhost:8080/myhttp/person.xml";
//从服务器中获取InputStream流
InputStream inputStream = HttpUtils.getXML(pathString);
try {
//把获取到的inputstream流存入list中
List<person> list = PullXmlTools.parseXML(inputStream, "utf-8");
//循环输出
for(person person : list) {
System.out.println(person.toString());
}
} catch (Exception e) {
// TODO: handle exception
}
}
输出结果如下: