java解析xml之PULL解析

除了可以使用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类实现setgettoString 方法 (元素应包括 (id, name, agetel)) 这里不给出。

创建业务类:

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());

      }

 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值