Pull 解析xml

来源:互联网 发布:javac 知乎 编辑:程序博客网 时间:2024/06/06 19:10

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包,导入工程

导入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文件内容及运行结果

运行结果

0 0