`
zyoo005
  • 浏览: 19089 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

android XML积累

阅读更多

JAVA中如果URL中含有中文 需要用 java.net.URLEncoder 类对中文字符进行处理,

同理  URL中的中文字符需要用 java.net.URLDecoder 类进行反处理。

 

以下是转载  地址:http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.html

 

 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结。

     今天解析的xml示例(channels.xml)如下:

 

<?xml version="1.0" encoding="utf-8"?>
<channel>
<item id="0" url="http://www.baidu.com">百度</item>
<item id="1" url="http://www.qq.com">腾讯</item>
<item id="2" url="http://www.sina.com.cn">新浪</item>
<item id="3" url="http://www.taobao.com">淘宝</item>
</channel>

 一、使用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;
     }
 }

 

 

private List<channel> getChannelList() throws ParserConfigurationException, SAXException, IOException
     {
         //实例化一个SAXParserFactory对象
         SAXParserFactory factory=SAXParserFactory.newInstance();
         SAXParser parser;
         //实例化SAXParser对象,创建XMLReader对象,解析器
         parser=factory.newSAXParser();
         XMLReader xmlReader=parser.getXMLReader();
         //实例化handler,事件处理器
         SAXPraserHelper helperHandler=new SAXPraserHelper();
         //解析器注册事件
         xmlReader.setContentHandler(helperHandler);
         //读取文件流
         InputStream stream=getResources().openRawResource(R.raw.channels);
         InputSource is=new InputSource(stream);
         //解析文件
         xmlReader.parse(is);
         return helperHandler.getList();
     }

 

 

 

从第二部分代码,可以看出使用SAX解析XML的步骤:

1、实例化一个工厂SAXParserFactory

2、实例化SAXPraser对象,创建XMLReader 解析器

3、实例化handler,处理器

4、解析器注册一个事件

4、读取文件流

5、解析文件

二、使用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;
     }
 

 

 

 

三、使用Dom方式解析

基础知识:

     最后来看看Dom解析方式,这种方式解析自己之前也没有用过(在j2ee开发中比较常见,没有做过这方面的东西),在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式显然是一种比较消耗内存的方式,对于像手机这样的移动设备来讲,内存是非常有限的,所以对于比较大的XML文件,不推荐使用这种方式,但是Dom也有它的优点,它比较直观,在一些方面比SAX方式比较简单。在xml文档比较小的情况下也可以考虑使用dom方式。

Dom方式解析的核心代码如下:

 

 

 

public static List<channel> getChannelList(InputStream stream)
     {
         List<channel> list=new ArrayList<channel>();
         
         //得到 DocumentBuilderFactory 对象, 由该对象可以得到 DocumentBuilder 对象
         DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
         
         try {
             //得到DocumentBuilder对象
             DocumentBuilder builder=factory.newDocumentBuilder();
             //得到代表整个xml的Document对象
             Document document=builder.parse(stream);
             //得到 "根节点" 
             Element root=document.getDocumentElement();
             //获取根节点的所有items的节点
             NodeList items=root.getElementsByTagName("item");  
             //遍历所有节点
             for(int i=0;i<items.getLength();i++)
             {
                 channel chann=new channel();
                 Element item=(Element)items.item(i);
                 chann.setId(item.getAttribute("id"));
                 chann.setUrl(item.getAttribute("url"));
                 chann.setName(item.getFirstChild().getNodeValue());
                 list.add(chann);
             }
             
         } catch (ParserConfigurationException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (SAXException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         
         return list;
     }

 

 

总结一下Dom解析的步骤(和sax类似)

1、调用 DocumentBuilderFactory.newInstance() 方法得到 DOM 解析器工厂类实例。

2、调用解析器工厂实例类的 newDocumentBuilder() 方法得到 DOM 解析器对象

3、调用 DOM 解析器对象的 parse() 方法解析 XML 文档得到代表整个文档的 Document 对象。

四、总结

       除以上三种外还有很多解析xml的方法,比如DOM4J、JDOM等等。但其基本的解析方式包含两种,一种是事件驱动的(代表SAX),另一种方式是基于文档结构(代表DOM)。其他的只不过语法不一样而已。

附(本文示例运行截屏):

 

 

下载源码

分享到:
评论

相关推荐

    Android使用XML-RPC实现blog客户端源码

    总之,通过学习和使用这个Android XML-RPC博客客户端源码,开发者不仅可以掌握XML-RPC通信技术,还能了解到Android应用的网络编程、数据解析、界面设计等多个方面,为今后的Android开发积累宝贵经验。

    Android中使用sax解析xml文件的方法

    在Android开发中,处理XML数据是一项常见的任务,而SAX(Simple API for XML)解析器是一种高效的、基于事件驱动的解析方式,尤其适用于资源有限的移动设备,如Android。SAX解析器不会像DOM那样将整个XML文档加载到...

    Android, Android 开发中积累和总结。.zip

    Android中的XML布局文件用于定义用户界面。开发者可以使用各种视图(View)和视图组(ViewGroup)来构建界面,例如TextView、Button、ImageView等。Material Design是官方推荐的设计指南,提供了统一的视觉风格和...

    Android开发技术的搜集积累

    例如,在colors.xml文件中仅定义调色板,而在dimens.xml文件中定义通用尺寸常量。 - **UI组件**:推荐使用Fragments来构建UI组件。Fragments提供了一种灵活的方式来组合和重用界面组件,使得UI设计更加模块化。同时...

    工作积累(11)-android功耗分析

    Android系统提供了PowerProfile XML文件,包含了设备各个组件的功率模型,开发者可以利用这些数据来评估不同操作对电池的影响,并据此进行优化。 7. **数据分析**: 通过收集和分析设备的日志、电量报告,开发者...

    Android studio各地天气查询

    【Android Studio 地方天气查询】项目详解 ...随着经验的积累,你可以进一步扩展功能,比如添加更多天气指标、动画效果、多城市管理等,提升用户体验。记住,持续学习和实践是成为优秀Android开发者的关键。

    Android小项目集合100多个

    在Android开发领域,小项目是积累经验、提升技能的有效途径。"Android小项目集合100多个"这个资源包提供了一系列的学习和实践材料,旨在帮助开发者深入理解和掌握Android应用程序的开发技巧。以下将针对Android开发...

    android例子,android初学教程

    1. **基本布局**:Android应用通常由多个XML布局文件构成,用于定义用户界面的元素。例如,`activity_main.xml`可能是应用的主界面布局,包括按钮、文本视图等组件。 2. **Activity**:Activity是Android应用的基本...

    Android特效——数字滚动条

    在Android开发中,为了增强应用的用户体验和视觉吸引力,开发者经常需要实现各种特效。...通过实践这个项目,你不仅能掌握这些技能,还能提高解决复杂问题的能力,为今后的Android开发积累宝贵经验。

    arcgis for android 10.1

    “ArcGIS+API+for+Android+案例教程.pdf”包含了一系列实际应用场景的示例,帮助开发者理解如何将GIS技术应用于不同的业务场景,如交通导航、环境监测、公共安全等,这些案例能帮助开发者积累实践经验,提高问题...

    android 的简单应用

    在Android的简单应用中,初学者通常会遇到一系列的基础概念和技术。...随着经验的积累,可以进一步探索Android的高级特性,如Service、ContentProvider、通知系统、多线程处理以及各种第三方库的集成等。

    Android 移动应用开发技术.pdf

    在Android移动应用开发中,首先需要理解Android的发展历程和它的重要性。Android是由Andy Rubin创建的,最初并非由谷歌开发,但在2005年...随着经验的积累,开发者可以创建出功能丰富、用户体验优秀的Android应用程序。

    Android开发从零开始——Android开发环境搭建

    11. **理解Android开发基本概念**:了解AndroidManifest.xml文件的作用,它是应用的配置文件;学习使用Gradle构建系统,它负责编译、打包和依赖管理;熟悉XML布局文件和数据绑定,以构建用户界面。 12. **持续学习...

    Android APP开发入门

    在Android APP开发领域,入门是每位开发者必经的阶段。Android Studio作为官方推荐的集成开发环境(IDE),...随着经验积累,开发者可以进一步深入学习Android的更多高级特性和最佳实践,从而成为专业的Android开发者。

    android 常用控件全解

    通过上述内容,我们可以了解到Android应用的基本结构和核心组成部分,包括项目的文件夹结构、主要配置文件`AndroidManifest.xml`以及常用的资源文件如`strings.xml`和布局文件`main.xml`。理解这些基础知识对于深入...

    android简易的通讯录

    【Android简易通讯录项目解析】 在Android开发领域,创建一个简易的通讯录是学习基础知识的好方式。这个项目展示了如何在Android环境中实现一个...在实践中不断学习和积累经验,将有助于成为更熟练的Android开发者。

    androidの多种风格listview不同案例积累使用

    本教程将深入探讨“androidの多种风格listview不同案例积累使用”,旨在帮助开发者掌握ListView的各种使用技巧和样式设计,提升用户体验。 首先,我们要理解ListView的基本结构。ListView由多个ListView项...

    基于android的车辆管理系统源码.rar

    【基于Android的车辆管理系统...这个源码项目对于学习Android应用开发、数据库操作以及实战项目经验积累非常有价值。同时,开发者还可以在此基础上扩展功能,如添加GPS定位、报警通知等,以满足更复杂的车辆管理需求。

    Android 连连看源码

    通过研究这个"Android 连连看源码",开发者不仅可以提升Android应用开发的技能,还能深入学习到游戏开发的相关知识,如图形界面设计、算法实现、资源管理以及时间同步等,这对于个人技术成长和项目实践经验的积累都...

    搭建Android开发环境

    在后续的学习中,你将学习到如何编写XML布局文件、Java代码,以及如何使用Android Studio的各种功能,如代码自动补全、调试工具等。此外,还需要了解Android的四大组件(Activity、Service、BroadcastReceiver、...

Global site tag (gtag.js) - Google Analytics