除了可以使用SAX的方式解析XML外,也可以是用java自带的PULL来解析文件。
PULL 解析器的运行方式和sax解析器很相似,它提供了类似的事件。
如开始元素和结束元素,使用parser.next ()可以进行下一个元素,并且触发相应的事件,事件将作为代码被发送,因此可以使用一个switch来对事件进项选择,然后进行选择,然后进行响应的处理,当开始解析元素的时候,调用parser.next ()方法法可以获得下一个Text类型的元素。
PULL 解析的特点:
简单的结构:一个接口,一个异常,一个工厂做成的PULL 解析器。
简单易用,PULL解析器只有一个重要的方法next 方法,他被用来检索下一个事件,
其包含5个常用的属性:
START DOCUMENT :
START_TAG :开始节点
TEXT : 节点的内容
END_TAG :结束节点
EDN_DOCUMENT :没有其他事件可用
实例如下:
解析如下文件 person.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>杨跟超</name>
<tel>188290974</tel>
<age>18</age>
</person>
<person id="2">
<name>王建</name>
<tel>18829290900</tel>
<age>18</age>
</person>
<person id = "3">
<name>Jack</name>
<tel>13673234578</tel>
<age>18</age>
</person>
</persons>
创建一个person类实现set与get与toString 方法 (元素应包括 (id, name, age,tel)) 这里不给出。
创建业务类:
public class pullXmlTools {
public pullXmlTools() {
}
/* inputStream 从服务器获取xml文件,以流的形式返回
* encode : 编码格式
*/
public static List <Person> parseXML (InputStream inputStream , String encode) throws XmlPullParserException, IOException{
List <Person > list = null;
Person person = null; // 装载解析每一个person节点的内容
// 创建以个解析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:
// 如果是文档开始 (创建以个集合装载内容)
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //如果是开始节点
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.nextText());
person.setAge(age);
}
else if ("tel".equals(parser.getName())){
String tel = parser.nextText();
person.setTel(tel);
}
break;
case XmlPullParser.END_TAG :
if("person".equals(parser.getName())){
list.add(person);
person= null;
}
break;
}
eventType = parser.next();
}
return list;
}
}
工具类从服务器读xml文档并以流的形式返回 HttpUtils.java:
public class HttpUtils {
public HttpUtils() {
}
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.setDoOutput(true);
connection.setRequestMethod("GET");
int code = connection.getResponseCode();
if (code==200){
inputStream =connection.getInputStream();
}
}
}catch (Exception e){
}
return inputStream;
}
}
测试类:Test .java
public class Test {
public Test() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) throws XmlPullParserException, IOException {
String path = "http://192.168.97.2:8080/HelloServlet/Person.xml";
InputStream inputStream = HttpUtils.getXML(path);
List <Person> list = pullXmlTools.parseXML(inputStream,"utf-8");
for (Person person :list){
System.out.println(person.toString().trim());
}
}
}