xml解析之pull

来源:互联网 发布:mac翻墙回国的软件 编辑:程序博客网 时间:2024/05/16 01:58

前几天看老罗视频的时候发现pull方式需要导入第三方的jar包,于是不了了之。后来想了想,既然pull比sax简单易用,而且google也推荐使用pull,那现在google现在是不是应该把pull的源代码整合到sdk里啊。进题啊试了下,果然不用导入第三方了!!!

OK,感觉pull确实比sax简单的多,不需要继承,只用一个方法就可以把解析的流程封装起来。下面是参考过官方文档之后的代码:

首先是PullHandler类:

package com.example.administrator.test.xml;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;public class PullHandler {    //只有一个静态方法,所以这里可以省略    public void PullHandler() {    }    /**     * @param inputStream 需要解析的流文件     * @param encode      编码格式,需要和xml文件里定义的一致     * @return     * @throws XmlPullParserException     * @throws IOException     */    public static List<Person> parseXML(InputStream inputStream, String encode) throws XmlPullParserException, IOException {        List<Person> list = null;        //装载每一个解析的节点,SAX那里我用的是Map来装载的        Person person = new Person(-1, "null", "null", -1);        //注意这里的实例化方式        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();        XmlPullParser pullParser = factory.newPullParser();        //这里也可以采用官方给出的方法,就是把xml转换成string再转换成reader        pullParser.setInput(inputStream, encode);        //获得事件的类型        int eventType = pullParser.getEventType();        while (eventType != XmlPullParser.END_DOCUMENT) {            if (eventType == XmlPullParser.START_DOCUMENT) {                System.out.println("Start document");                list = new ArrayList<>();            } else if (eventType == XmlPullParser.START_TAG) {                if ("person".equals(pullParser.getName())) {                    System.out.println("Start tag " + pullParser.getName());                    int id = Integer.parseInt(pullParser.getAttributeValue(0));                    person.setId(id);                    String sex = pullParser.getAttributeValue(1);                    person.setSex(sex);                } else if ("name".equals(pullParser.getName())) {                    System.out.println("Start tag " + pullParser.getName());                    //注意这里是获取text,获取属性的话会报空指针,切记属性不在text里面                    String name = pullParser.nextText();                    person.setName(name);                } else if ("age".equals(pullParser.getName())) {                    System.out.println("Start tag " + pullParser.getName());                    //注意这里不是获取属性了,是获取Text                    int age = Integer.parseInt(pullParser.nextText());                    person.setAge(age);                }            } else if (eventType == XmlPullParser.END_TAG) {                //这里表示一个节点就结束了                System.out.println("End tag " + pullParser.getName());                if ("person".equals(pullParser.getName())) {                    list.add(person);                    person = new Person(-1, "null", "null", -1);                }            } else if (eventType == XmlPullParser.TEXT) {                System.out.println("Text " + pullParser.getText());            }            eventType = pullParser.next();        }        return list;    }}
然后是单元测试里的代码:

    public void testPull() {        File file = new File(Environment.getExternalStorageDirectory(), "data.xml");        FileInputStream fileInputStream = null;        List<Person> list = null;        try {            fileInputStream = new FileInputStream(file);            list = PullHandler.parseXML(fileInputStream, "utf-8");        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (fileInputStream != null)                    fileInputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }        if (list != null)            for (Person person : list) {                System.out.println("person----------------------->" + person.toString());            }    }






0 0
原创粉丝点击