Pull 解析xml

Pull 解析xml

xmlpull方式解析xml是android开发中解析xml的推荐方式。

XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。

Java实现

在这里我们使用KXML来实现解析.

KXML实现下面三个接口:
    org.xmlpull.v1.XmlPullParser;
    org.xmlpull.v1.XmlPullParserException;
    org.xmlpull.v1.XmlPullParserFactory;

1.导入KXML包

从官网下载jar包,导入工程

2.pullXmlService.java

package com.kanbujian.xmlservice;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import com.kanbujian.model.User;

/** * 以pull的方式解析xml * * @author QT * */
public class pullXmlService {

    /** * * @param is 读取网络上xml文件的输入流 * @param encode 字符编码格式 * @return 元素集合 */
    public static List<User> pullXml(InputStream is,String encode) {
        List<User> list = null;
        User u = null;

        try {
            // 得到解析器工厂,通过静态方法获取一个解析工程对象的引用
            XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();
            // 通过解析器工厂的得到一个XmlPullParser解析器对象
            XmlPullParser parser = xpf.newPullParser();
            //獲得時間類型
            int eventType = parser.getEventType();

            // 解析器设置输入流和编码格式
            // 把这一句漏了还搞个毛呀
            parser.setInput(is,encode);

            // while 遍历 ,只要事件类型不等于文档结束标志
            while (eventType != XmlPullParser.END_DOCUMENT) {

                switch (eventType) {
                // 如果事件类型为START_DOCUMENT,即读取文档开头
                case XmlPullParser.START_DOCUMENT:

                    list = new ArrayList<User>();

                    break;
                // 元素标记开头标志
                // 运用pull方式解析xml需要知道节点标签名称
                case XmlPullParser.START_TAG:
                    /* 如果在此處聲明 u = new User(); * 輸出 User [id=0,username=null,age=0,password=12345] * 每次循環都會新建一個對象 * */

                    if ("user".equals(parser.getName())) {
                        //衹有當標簽名稱爲user時,新建一個對象
                        u = new User();
                        int id = Integer.parseInt(parser.getAttributeValue(0));
                        //System.out.println("標簽名爲User ,設置ID "+id);
                        u.setId(id);
                    } else if ("username".equals(parser.getName())) {

                        String username = parser.nextText();// 获取该节点内容
                        //System.out.println("設置username "+username);
                        u.setUsername(username);
                    } else if ("age".equals(parser.getName())) {

                        int age = Integer.parseInt(parser.nextText());// 获取该节点内容
                        //System.out.println("設置age "+age);
                        u.setAge(age);
                    } else if ("password".equals(parser.getName())) {
                        //System.out.println("設置password");
                        String password = parser.nextText();// 获取该节点内容
                        u.setPassword(password);
                    }

                    break;

                case XmlPullParser.END_TAG:
                    if ("user".equals(parser.getName())) {

                        list.add(u);
                        u = null;

                    }

                    break;

                }
                // 每次switch选择后跳转到下一标签,事件类型
                eventType = parser.next();
            }

        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            System.out.println("nikan 出错了吧");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return list;
    }

}

3.User实体类

package com.kanbujian.model;

public class User {
    private int id;
    private String username;
    private int age;
    private String password;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ",username=" + username + ",age=" + age
                + ",password=" + password + "]";
    }


}

4.Http工具类

package com.kanbujian.http;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/** * http工具類 * @author QT * */
public class HttpUtils {
    public HttpUtils() {
        // TODO Auto-generated constructor stub
    }
    /** * 通過URL獲取輸入流 * @param path * @return */
    public static InputStream getXml(String path){
        InputStream is=null;
     try {
        URL url=new URL(path);
        if(url!=null){
            //獲得HttpURLConnnection
            HttpURLConnection connection =(HttpURLConnection)url.openConnection();
            //設置屬性
            connection.setConnectTimeout(3000);
            connection.setDoInput(true);
            connection.setRequestMethod("GET");
            int code=connection.getResponseCode();
            //GET請求成功
            if(code==200){
                is=connection.getInputStream();
            }
        }

    } catch (Exception e) {
        // TODO: handle exception
    }
     return is;

    }
}

5.测试类

package com.kanbujian.text;

import java.io.InputStream;
import java.util.List;

import com.kanbujian.http.HttpUtils;
import com.kanbujian.model.User;
import com.kanbujian.xmlservice.pullXmlService;

public class pullXmlTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
          String path="http://localhost:8080/jay01/user.xml";

          InputStream is=HttpUtils.getXml(path);

          List<User> list=pullXmlService.pullXml(is,"UTF-8");

          for(User u: list){
              System.out.println(u);
          }

    }

}

6.xml文件内容及运行结果

相关文章

引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满...
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原文”,可查看...
一、xml与xslt 相信所有人对xml都不陌生,其被广泛的应用于数据数据传输、保存与序列化中,是一种极为强...