XML解析方式:SAX与DOM简介

DOM是W3School提供的XML解析方式,其解析方式是将整个XML加载如内存,可以方便的对XML进行增删改工作。其特点是,功能强大,性能消耗也强大

SAX是一种流式解析,简单的从上到下,从父往子。将兄长极其子节点解析完成,回调赋值之后,删掉内容,开始解析弟节点极其子节点,如此直到XML被解析完。特点是,性能消耗小,特别是内存消耗,但没法做随机存取操作,只能等他从上到下的走完。

Android XML解析

    Android是无线手机平台,虽说硬件性能越来越强大,但为了让所有用户都有较好的体验,总归是没有必要进行不必要的浪费的。这里只讲解SAX解析XML文件。

    解析方式,就是简单的从上到下,从外往里,个人感觉没有赘述的必要。直接看代码

XMl内容

<sidebar>
  <item img="" title="回到首页" type="0" show="true" description="必须显示"/>
  <item img="" title="消息中心" type="1" show="true" description="必须显示">
    <param page="" model="" type=""></param>
  </item>
  <item img="" title="我的收藏" type="2" show="true" description="默认显示">
    <param type="myctrip" model="0x005" page="H5MyCtripURLType_My_Favorite"></param>
  </item>
  <item img="" title="我的订单" type="2" show="true" description="默认显示">
    <param type="myctrip" model="0x005" page=""></param>
  </item>
</sidebar>

解析代码

/**
     * 从Xml配置文件加载
     * @return
     */
    private static void loadItem(Context context)
    {
        if(sideBarItems != null) return;
        sideBarItems = new ArrayList<SideBarItemModel>();
        try {
            InputStream is = context.getResources().openRawResource(R.raw.sidebarconfig);
            getSideBarItems(is);
            is.close();
        } catch (Resources.NotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
/**
     * 从配置XML中读取Item默认配置
     * @param input
     */
    private static void getSideBarItems(InputStream input)
    {
        String sidebar_tag = "sidebar";
        String item_tag = "item";
        final String img_att = "img";
        final String title_att = "title";
        final String type_att = "type";
        final String show_att = "show";
        String param_tag = "param";
        final String param_type_att = "type";
        final String param_model_att = "model";
        final String param_page_att = "page";
        
        RootElement root = new RootElement(sidebar_tag);
        Element item = root.getChild(item_tag);
        item.setStartElementListener(new StartElementListener() {
            
            @Override
            public void start(Attributes attributes) {
                sideBarItem = new SideBarItemModel();
                sideBarItem.img = getId(getValueIgnoreCase(attributes, img_att));
                sideBarItem.title = getValueIgnoreCase(attributes, title_att);
                sideBarItem.type = Integer.parseInt(getValueIgnoreCase(attributes, type_att));
                sideBarItem.show = "true".equals(getValueIgnoreCase(attributes, show_att))? true:false;
            }
        });
        item.setEndElementListener(new EndElementListener() {
            
            @Override
            public void end() {
                if(sideBarItem != null)
                    sideBarItems.add(sideBarItem);
            }
        });
        
        Element param = item.getChild(param_tag);
        param.setStartElementListener(new StartElementListener() {
            
            @Override
            public void start(Attributes attributes) {
                if(sideBarItem != null)
                {
                    sideBarItem.param_type = getValueIgnoreCase(attributes, param_type_att);
                    sideBarItem.param_model = Integer.parseInt(getValueIgnoreCase(attributes, param_model_att));
                    sideBarItem.param_page = getValueIgnoreCase(attributes, param_page_att);
                }
                
            }
        });
        
        try {
            Xml.parse(input, Xml.Encoding.UTF_8, root.getContentHandler());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 辅助方法
     * @param attributes
     * @param qName
     * @return
     */
    private static String getValueIgnoreCase(Attributes attributes, String qName) {
        for (int i = 0; i < attributes.getLength(); i++) {
            String qn = attributes.getQName(i);
            if (qn.equalsIgnoreCase(qName)) {
                return attributes.getValue(i);
            }
        }
        return "";
    }