java解析XML——Pull解析

来源:互联网 发布:数据字典怎么用 编辑:程序博客网 时间:2024/06/06 01:34
除了可以使用SAX或DOM解析XML文件之外,在Android中可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值    
Pull XML解析器早已经被google集成到Android sdk当中,它是google官方推荐的解析器。如果我们要在Java桌面、J2ME等当中使用Pull方式生成xml文件和
解析xml文件,需要用到kxml2;KXML解析器是基于普通XML PULL解析器的一个小巧的解析器,官网是http://kxml.org/,普通XML PULL解析器的官网是http://xmlpull.org/    
    
XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。

具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
<students>    <student>        <name sex="man">小明</name>        <nickName>明明</nickName>        <age>20</age>        <address>北京</address>    </student>    <student>        <name sex="woman">小红</name>        <nickName>红红</nickName>        <age>20</age>        <address>上海</address>    </student>    <student>        <name sex="man">小亮</name>        <nickName>亮亮</nickName>        <age>30</age>        <address>广州</address>    </student>    <student-0>        <name sex="man">小亮-0</name>        <nickName>亮亮-0</nickName>        <age>200</age>        <address>广州-0</address>    </student-0></students>



(2)    解析:
   
private void parseXml() {        long startTime = System.currentTimeMillis();        System.out.println("开始解析:" + startTime);        Bean1 bean = null;        // XmlPullParser是android自带的,Java中默认不支持,因此需要下载kxml2.jar包        XmlPullParserFactory factory;        try {            factory = XmlPullParserFactory.newInstance();            factory.setNamespaceAware(true);            XmlPullParser parser = factory.newPullParser();            // 初始化xmlPull解析器            parser.setInput(new FileInputStream(xmlFile), "utf-8");                        int type = parser.getEventType();            // 无限判断文件类型进行读取            while (type != XmlPullParser.END_DOCUMENT) {                switch (type) {                case XmlPullParser.START_TAG:                    if (parser.getName().equals("students")) {                        datas = new ArrayList<>();                    } else if (parser.getName().equals("student")) {                        bean = new Bean1();                    } else if (parser.getName().equals("name")) {                        bean.setSex(parser.getAttributeValue(null, "sex"));                        bean.setName(parser.nextText());                    } else if (parser.getName().equals("address")) {                        bean.setAddress(parser.nextText());                    }else if(parser.getName().equals("age")){                        bean.setAge(parser.nextText());                    }else if (parser.getName().equals("nickName")) {                        bean.setNickName(parser.nextText());                    }                    break;                case XmlPullParser.END_TAG:                    if (parser.getName().equals("student")) {                        datas.add(bean);                    }                    break;                default:                    break;                }                                type = parser.next();            }        } catch (XmlPullParserException e) {            e.printStackTrace();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }                        long finishTime = System.currentTimeMillis();        long time = finishTime - startTime;        System.out.println("结束解析: " + finishTime + "\nPull解析耗时:" + time);                for(Bean1 student : datas){            System.out.println(student.toString());        }    }


    
    以上的代码在Java项目或Android项目中都可以使用。在Android中还提供了另一个类:XmlResourceParser,XmlResourceParser是XmlPullParser的子类,使用如下:(在Androiddemo中,xml文件存放在手机存储的根目录下:data1.xml)
  
 private void resPullParseXml() {        try {            Bean1 bean = null;            // XmlResourceParser是XMPullParser的子类            XmlResourceParser xrp = getResources().getXml(R.xml.data1);            while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {                // 如果遇到开始标签                switch (xrp.getEventType()) {                case XmlResourceParser.START_TAG:                    // 获取该标签的标签名                    String tagName = xrp.getName();                    if (tagName.equals("students")) {                        // datas = new ArrayList<Bean1>();                    } else if (tagName.equals("student")) {                        bean = new Bean1();                    } else if (tagName.equals("name")) {// 根据属性名来获取属性值                        bean.setSex(xrp.getAttributeValue(null, "sex"));                        bean.setName(xrp.nextText());                    } else if (tagName.equals("nickName")) {                        bean.setNickName(xrp.nextText());                    } else if (tagName.equals("age")) {                        bean.setAge(xrp.nextText());                    } else if (tagName.equals("address")) {                        bean.setAddress(xrp.nextText());                    }                    break;                case XmlResourceParser.END_TAG:                    if (xrp.getName().equals("student")) {                        datas.add(bean);                    }                    break;                }                xrp.next();            }        } catch (XmlPullParserException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }


    
    
demo传送门:
https://github.com/215836017/ParseXML_java

https://github.com/215836017/ParserXML_android

注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
    Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。