android解析xml的方式
2015-08-11 09:19
483 查看
分为3种,分别是dom解析,sax解析,pull解析
dom:在内存中生成dom对象,加载整个xml文档进行解析,其暂用内存资源过大,在android中一般不会采用dom解析的方式,所以不做过多的介绍。
pull:
理论:
在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开始解析之后,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。
代码:
sax解析:
原理:
这种方式解析是一种基于事件驱动的api,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源),事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理。
另外SAX解析器提供了一个工厂类:SAXParserFactory,SAX的解析类为SAXParser 可以调用它的parser方法进行解析。
看了些基础以后开始上代码吧(核心代码,下载代码在附件)
大家可以参考这篇博主的文章,很清楚:
/article/6971075.html
dom:在内存中生成dom对象,加载整个xml文档进行解析,其暂用内存资源过大,在android中一般不会采用dom解析的方式,所以不做过多的介绍。
pull:
理论:
在android系统中,很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样(个人感觉要比sax简单点),也是采用事件驱动进行解析的,当pull解析器,开始解析之后,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。
代码:
private List<Map<String, String>> getData() { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); XmlResourceParser xrp = getResources().getXml(R.xml.channels); try { // 直到文档的结尾处 while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) { // 如果遇到了开始标签 if (xrp.getEventType() == XmlResourceParser.START_TAG) { String tagName = xrp.getName();// 获取标签的名字 if (tagName.equals("item")) { Map<String, String> map = new HashMap<String, String>(); String id = xrp.getAttributeValue(null, "id");// 通过属性名来获取属性值 map.put("id", id); String url = xrp.getAttributeValue(1);// 通过属性索引来获取属性值 map.put("url", url); map.put("name", xrp.nextText()); list.add(map); } } xrp.next();// 获取解析下一个事件 } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }
sax解析:
原理:
这种方式解析是一种基于事件驱动的api,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源),事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理。
下面是ContentHandler接口的常用方法 public abstract void characters (char[] ch, int start, int length) 这个方法来接收字符块通知,解析器通过这个方法来报告字符数据块,解析器为了提高解析效率把读到的所有字符串放到一个字符数组(ch)中,作为参数传递给character的方法中,如果想获取本次事件中读取到的字符数据,需要使用start和length属性。 public abstract void startDocument () 接收文档开始的通知 public abstract void endDocument () 接收文档结束的通知 public abstract void startElement (String uri, String localName, String qName, Attributes atts) 接收文档开始的标签 public abstract void endElement (String uri, String localName, String qName) 接收文档结束的标签 在一般使用中为了简化开发,在org.xml.sax.helpers提供了一个DefaultHandler类,它实现了ContentHandler的方法,我们只想继承DefaultHandler方法即可。
另外SAX解析器提供了一个工厂类:SAXParserFactory,SAX的解析类为SAXParser 可以调用它的parser方法进行解析。
看了些基础以后开始上代码吧(核心代码,下载代码在附件)
public class SAXPraserHelper extends DefaultHandler { final int ITEM = 0x0005; List<channel> list; channel chann; int currentState = 0; public List<channel> getList() { return list; } /* * 接口字符块通知 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub // super.characters(ch, start, length); String theString = String.valueOf(ch, start, length); if (currentState != 0) { chann.setName(theString); currentState = 0; } return; } /* * 接收文档结束通知 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } /* * 接收标签结束通知 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub if (localName.equals("item")) list.add(chann); } /* * 文档开始通知 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub list = new ArrayList<channel>(); } /* * 标签开始通知 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub chann = new channel(); if (localName.equals("item")) { for (int i = 0; i < attributes.getLength(); i++) { if (attributes.getLocalName(i).equals("id")) { chann.setId(attributes.getValue(i)); } else if (attributes.getLocalName(i).equals("url")) { chann.setUrl(attributes.getValue(i)); } } currentState = ITEM; return; } currentState = 0; return; } }
大家可以参考这篇博主的文章,很清楚:
/article/6971075.html
相关文章推荐
- Android利用Intent与其他应用交互
- 将Eclipse代码导入到AndroidStudio的两种方式
- android实现跑马灯效果
- android动画开发
- Android屏幕适配全攻略(最权威的官方适配指导)
- Github 优质android 项目demo
- Android开发学习笔记:Intent的简介以及属性的详解
- 调用webservice时,产生android.os.NetworkOnMainThreadException错误
- Android 第三方应用广告拦截实现
- 让Android Support V4中的SwipeRefreshLayout支持上拉加载更多
- android ContentProvider的使用
- A006-AndroidManifest.xml解析
- Android研究之手PullToRefresh(ListView GridView 下拉刷新)使用详解
- Android Api Demos登顶之路(二十九)Share Action Provider
- CodingTipsAndTricks android ksoap2
- Android调用相册或相机拍照选取照片并裁剪
- Android Device Policy Administration Tutorial
- Android数据库 之 SQLite数据库
- Android中proc/meminfo的详解(原)
- Android中显示和隐式Intent的使用