XML解析

      XML 与Json是常用的数据传输格式,在 json解析工具jackson中已介绍了Json的解析,本文介绍XML的解析。XML常用的解析方式有三种:

  一:DOM
         在处理XML文件时,将XML文件解析成树状结构并放入内存中进行处理。当XML文件较小时,我们可以选DOM,因为它简单、直观。 XML文档比较大时,构建DOM树将花费大量的时间和内存。

 二: SAX

        SAX是以事件作为解析XML文件的模式,它将XML文件转化成一系列的事件,由不同的事件处理器来决定如何处理。XML文件较大时,选择SAX技术是比较合理的。虽然代码量有些大,但是它不需要将所有的XML文件加载到内存中。这样对于有限的Android内存更有效,而且Android提供了一种传统的SAX使用方法以及一个便捷的SAX包装器。 使用Android.util.Xml类(具体代码在frameworks\base\core\java\android\util\Xml.java),从示例中可以看出,会比使用 SAX来得简单。


  三: PULL

        PULL与SAX 相似,也是以事件驱动,但解析并未像SAX解析那样监听元素的结束,而是在开始处完成了大部分处理。这有利于提早读取XML文件,可以极大的减少解析时间,这种优化对于连接速度较漫的移动设备而言尤为重要。对于XML文档较大但只需要文档的一部分时,XML Pull解析器则是更为有效的方法。

       PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。本文通过一实例来介绍PULL解析方法。


update.xml 数据如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<update>
  <command isForced = "1"  isPartion ="0">
    <url>http://www.update.com</url>
    <version>150</version>
    <description>增加本地播放功能</description>
  </command>
</update>

解析实现:

public class VersionDetail implements Serializable {

    private static final long serialVersionUID = -5300069855777601666L;
    public String Is_Forced;
    public String Is_Partional;
    public String Software_Version;
    public String Filepath;
    public String Discription;

    @Override
    public String toString() {
        return "Software_Version = " + Software_Version + " Is_Forced = " + Is_Forced + " Is_Partional =" +Is_Partional+" Filepath = "
                + Filepath + " Discription = " + Discription;
    }

}

public class PullParserXml {

    private static final String TAG = "PullParserXml";
    public VersionDetail parse(InputStream is) throws Exception {
      
        VersionDetail mVersionDetail = null;
        try {
        
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(is, "UTF-8");
            int eventType = parser.getEventType();

            try {
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        mVersionDetail = new VersionDetail();
                        break;
                    case XmlPullParser.START_TAG:
                        Log.d(TAG, "parser.getName() = " + parser.getName());
                        if (parser.getName().equals("command")) {
                            mVersionDetail.Is_Forced = parser.getAttributeValue(0);
                            mVersionDetail.Is_Partional =parser.getAttributeValue(1);
                        } else if (parser.getName().equals("url")) {
                            mVersionDetail.Filepath = parser.getText();
                        } else if (parser.getName().equals("version")) {
                            mVersionDetail.Software_Version = parser.getText();
                        } else if (parser.getName().equals("description")) {
                           mVersionDetail.Discription = parser.getText();
                        }
                        break;

                    case XmlPullParser.END_TAG:
                        if (parser.getName().equals("command")) {
                            VersionDetails.add(versionDetail);
                            versionDetail = null;
                        }
                        break;
                    }
                    eventType = parser.next();
                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return mVersionDetail;
    }
}


InputStream input = this.getClass().getClassLoader().getResourceAsStream("update.xml"); 
mVersionDetails = new VersionDetail();
try {
    mVersionDetails = new PullParserXml().parse(input);
} catch (Exception e) {
    Log.e(TAG, "parse xml Exception", e);
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值