前言 

  本文主要介绍在Android中怎样来解析XML文件。主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包。作为接口,SAX是事件驱动型XML解析的一个标准接口。XML文件解析一般有2种方法,DOM和SAX。其中DOM需要先将xml文档全部读入到电脑内存中,当文档内容太大时,该方法并不适用。SAX就比较好的解决了该问题,它是逐行解析的,可以随时中断。但是SAX的操作比较复杂。因此,这2种方法各有优缺点,看具体应用情况。在前面的文章Qt学习之路_12(简易数据管理系统)中使用的是Qt中的DOM方法。

  实验说明

  大多数SAX实现都会产生类似下面的事件:

  在文档的开始和结束处触发文档处理事件;在文档内每一XML元素结束解析的前后触发元素事件;任何元数据通常豆油单独的事件交付;在处理文档的DTD或者Schema时产生DTD 或者Schema事件;产生错误事件用来通知主机应用程序解析错误。

  SAX模型示意图如下所示:

  

  如果要用SAX来解析xml文档,则需要一个类来继承android系统提供的ContentHandler类。但是如果继承ContentHandler这个类, 即使你不使用这个类提供的所有方法,你也必须实现其内部的所有方法(一般情况下没有使用的方法可以直接用空方法代替),但是这样开发起来不是很方便。因此我们可以改为继承DefaultHandler这个类,这样的话我们只需要实现程序中所需要的方法即可,其它的方法这个类内部其实已经用空方法代替了。

  ContentHandler接口的方法有以下几种:

  void startDocument();//文档解析开始时执行

  void endDocument();//文档解析结束时执行

  void startElement(String uri, String localName, String qName, Attributes atts);//标签开始解析时执行

  void endElement(String uri, String localName, String qName, Attributes atts);//标签解析结束时执行

  void characters(char[] ch, int start, int length );//解析标签属性时执行

  android中使用SAX来解析xml文件,需先建立一个SAX工厂,即SAXParserFactory对象,还需建立一个XMLReader对象,该类绑定ContentHandler子类,且与xml源文件结合在一起。即其处理过程为创建事件处理程序,创建SAX解析器,键事件处理程序分配给解析器,对文档进行解析,将每个事件发送给处理程序。

  判断String类型的值是否相等采用的是String类的equal方法。

  本实验是解析一段xml代码,然后在上面每个解析函数中打印一些内容。主要是学会怎么使用SAX模型来来创建解析器,怎样使用ContentHandler子类的函数来进行解析。

  实验主要部分代码:

Mainactivity.java:

package com.example.xml;import java.io.StringReader;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity {private Button start  = null;private TextView display = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);start = (Button)findViewById(R.id.start);start.setOnClickListener(new StartOnClickListener());}public class StartOnClickListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//注意2点,第1:字符串中如果要换行写,则应该用引号和加号来相加得到,不能直接换行写//第2点:如果字符串中有字符,则用括号里面的符合(\")代替引号。//我这里用的xml文件直接为该程序layout的布局xml文件
//            String result_str =
//            "<RelativeLayout " +
//              "  xmlns:tools=\"http://schemas.android.com/tools\" " +
//              "  android:layout_width=\"match_parent\" " +
//              "  android:layout_height=\"match_parent\" > " +
//
//             "   <Button  " +
//               "     android:id=\"@+id/start\"    " +
//                 "   android:layout_width=\"fill_parent\"    " +
//                  "  android:layout_height=\"wrap_content\"    " +
//                 "   android:layout_alignParentBottom=\"true\"    " +
//                  "  android:text=\"Start XML Parse\"    "    +
//                "    /> " +
//              "  <TextView " +
//                "    android:id=\"@+id/display\" " +
//               "     android:layout_width=\"fill_parent\"    " +
//                "    android:layout_height=\"fill_parent\"    " +
//                "    android:gravity=\"center\"    " +
//                "     android:layout_alignParentLeft=\"true\"    "    +
//                "     android:layout_above=\"@+id/start\"    "    +
//                "     android:text=\"The XML Parse Example!!\"    " +
//                "    />    " +
//        "    </RelativeLayout>";
            String result_str =         "   <Button  " +"     id=\"@+id/start\"    " +"   layoutwidth=\"fillparent\"    " +"  layoutheight=\"wrapcontent\"    " +"   layoutalignParentBottom=\"true\"    " +"  text=\"Start XML Parse\"    "    +"    </Button> " ;System.out.println(result_str);try{//创建SAX工厂SAXParserFactory factory = SAXParserFactory.newInstance();XMLReader reader = factory.newSAXParser().getXMLReader();reader.setContentHandler(new MyContentHandler());reader.parse(new InputSource(new StringReader(result_str)));}catch(Exception e) {e.printStackTrace();}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}
}

MyContentHandler.java:

package com.example.xml;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class MyContentHandler extends DefaultHandler {String tagname, sid, swidth, sheight, text, salign;//当解析到标签的属性栏时调用该方法
    @Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubif(tagname.equals("id"))sid = new String(ch, start, length);else if(tagname.equals("layoutwidth"))swidth = new String(ch, start, length);else if(tagname.equals("layoutheight"))sheight = new String(ch, start, length);else if(tagname.equals("layoutalignParentBottom"))salign = new String(ch, start, length);else if(tagname.equals("text"))text = new String(ch, start, length);super.characters(ch, start, length);}//解析文档结束调用
    @Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("........end.......");super.endDocument();}//解析标签结束时调用
    @Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// TODO Auto-generated method stubif(tagname.equals("Button")) {this.printout();}super.endElement(uri, localName, qName);}//解析文档开始时调用
    @Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("........begin.......");super.startDocument();}//标签开始时执行
    @Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {// TODO Auto-generated method stubtagname = localName;if(tagname.equals("Button")) {for(int i = 0; i < attributes.getLength(); i++) {        //得到第i个属性的名字和值System.out.println(attributes.getLocalName(i) + "=" + attributes.getValue(i));}}super.startElement(uri, localName, qName, attributes);}//输出标签属性解析结果private void printout() {System.out.print("id: ");System.out.println(sid);System.out.print("layout_width: ");System.out.println(swidth);System.out.print("layout_height: ");System.out.println(sheight);System.out.print("layout_alignParentBottom: ");System.out.println(salign);System.out.print("text: ");System.out.println(text);}}

  参考资料:

http://www.mars-droid.com/bbs/forum.php

转载于:https://www.cnblogs.com/tornadomeet/archive/2012/09/24/2699648.html

Android开发历程_18(XML文件解析)相关推荐

  1. android的xml解析方式,Android中对xml文件解析的3种方式总结

    前言 xml 是数据传输的一种格式,Android 中的布局文件.设置文件等都采用它来表示.Android 中对 xml 文件的解析也有多种方式,下面介绍常用的 3 种方式: Dom . SAX 和 ...

  2. 【Android开发】XML文件解析

    最近在做一个项目,涉及到XML文件的解析,废话不多说,如下: 读取 1 private ArrayList<Data> readXMLLocked() { 2 File file = ne ...

  3. Android之 AndroidManifest.xml 文件解析

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  4. Android之 AndroidManifest xml 文件解析

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  5. Android学习----AndroidManifest.xml文件解析

    一个Android应用程序的结构: 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了pack ...

  6. Android之AndroidManifest.xml文件解析和权限集合

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  7. xml 和android脚本之家,Android开发之XML文件解析的使用

    package com.example.xml; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org. ...

  8. Android逆向:二进制xml文件解析 之 Start Tag Chunk

    目录 1.xml结构 2.Start Tag Chunk Header 3.Start Tag Chunk Body 4.Atrributes 5.总结 在Android中,xml文件经过编译后都是不 ...

  9. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)

    Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它 ...

最新文章

  1. JFreeChart DateAxis用法
  2. 常考数据结构与算法:两个链表生成相加链表
  3. 很详细的Nginx配置说明
  4. Android 不同View ID相同
  5. pyqt讲解7:表格和树
  6. Python视频编辑库:MoviePy
  7. asp.net WebForm页面间传值方法
  8. 应用机器学习视频教程,哥伦比亚大学 2020版
  9. 再谈.NET Micro Framework移植
  10. 本周进步要点(第3周1.9--1.15)
  11. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
  12. c++ 多线程 垃圾回收器_新一代垃圾回收器ZGC的探索与实践
  13. [学习笔记] [数据分析] 01.Python入门
  14. matlab高数同步教程,高等数学及其MATLAB实现 上册
  15. 微软服务器打补丁步骤,自己手动制作 Windows 系统补丁包全过程
  16. SpringCloud-Learning -作者:翟永超
  17. 项目整体流程及项目经理工作职责
  18. [Linux]在Ubuntu下虚拟机的安装以及在Ubuntu中进行UDP套接口通信
  19. 精品基于Uniapp+SSM实现的公园植物介绍APP
  20. 男人要象狗 女人要象猫

热门文章

  1. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
  2. GT Transceiver的总体架构梳理
  3. Virtex-6器件的时钟资源、混合模式时钟管理器(MMCM)
  4. TypeScript的推介与应用
  5. CBAC ftp测试
  6. 4702: 分糖果系列一
  7. 赚钱的这些年(上)苦逼
  8. 系统管理工具top、glances、dstat比较
  9. 外文翻译 《How we decide》赛场上的四分卫 第三节
  10. 伟大的密码胜于利剑——RSA2012成都站掠影