java解析XML——Pull解析

本文介绍了Java中使用Pull解析器解析XML文件的方法,特别提到了在Android中的应用。Pull解析器与SAX类似,基于事件驱动,但更简洁。文章通过示例代码展示了如何读取和解析XML文件,适用于Java和Android项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

除了可以使用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文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值