PULL解析xml数据

xml解析常用的三种方式:dom、sax、xmlpull

dom、sax、xmlpull比较

SAX是一个用于处理XML事件驱动的“推”模型,
优点是一种解析速度快并且占用内存少的xml解析器,它需要哪些数据再加载和解析哪些内容。
缺点是它不会记录标签的关系,而要让你的应用程序自己处理,这样就增加了你程序的负担。

DOM是一种文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。
**优点:**Dom技术使得用户页面可以动态地变化,如可以动态地显示或隐藏一个元素,改变它们的属性,增加一个元素等,Dom技术使得页面的交互性大大地增强。
缺点:是DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中。

Pull解析和Sax解析很相似,Pull解析和Sax解析不一样的地方是pull读取xml文件后触发相应的事件调用方法返回的是数字,还有pull可以在程序中控制想解析到哪里就可以停止解析。

DOM方式最直观和容易理解,但是只适合XML文档较小的时候使用,而SAX方式更适合在移动终端系统中使用,因为相比DOM占用内存少,适合处理比较大的XML文档,最后的Pull方式使用场合和SAX类似,但是更适合需要提前结束XML文档解析的场合。

项目中主要用到PULL解析

  private void readXMLFromUDisk(UsbFile usbFile) {
        //读取文件内容
        InputStream is = new UsbFileInputStream(usbFile);
        XmlPullParser parser = Xml.newPullParser();
        //解析文件输入流
        try {
            parser.setInput(is, "UTF-8");
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        //解析开始的时候初始化list
                        xmlModels = new ArrayList<>();
                        break;
                    case XmlPullParser.START_TAG:
                        //获得解析器当前指向的元素的名字
                        //当指向元素的名字和id,name,sex这些属性重合时可以返回他们的值
                        String XPPname = parser.getName();
                        if ("Substation".equals(XPPname)) {
                            //通过解析器获取id的元素值,并设置一个新的Student对象的id
                            xmlModel = new XmlModel();
                            xmlModel.SubstationName = parser.getAttributeValue(0);
                        }
                        if (xmlModel != null) {
                            if ("Area".equals(XPPname)) {
                                xmlModel.AreaId = parser.getAttributeValue(0);
                                xmlModel.AreaName = parser.getAttributeValue(1);
                            }
                            if ("Equipment".equals(XPPname)) {
                                xmlModel.EquipmentId = parser.getAttributeValue(0);
                                xmlModel.EquipmentName = parser.getAttributeValue(1);
                            }
                            if ("VoltageLevel".equals(XPPname)) {
                                xmlModel.VoltageLevelName = parser.getAttributeValue(0);
                            }
                            if ("Lock".equals(XPPname)) {
                                xmlModel.LockRFID = parser.getAttributeValue(0);
                            }
                        }
                        break;
                    //出发结束元素事件
                    case XmlPullParser.END_TAG:
                        if ("Substation".equals(parser.getName())) {
                            xmlModels.add(xmlModel);
                            MyApplication.getInstance().getDaoSession().getXmlModelDao().insert(xmlModel);
                            xmlModel = null;
                        }
                        break;
                    default:
                        break;
                }
                eventType = parser.next();
            }
            setXMLToList(xmlModels, false, 2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你丶快乐吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值