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 "";
}