前言

  本文主要介绍在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;    @Override    public 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();            }            }            }    @Override    public 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;        //当解析到标签的属性栏时调用该方法    @Override    public void characters(char[] ch, int start, int length)            throws SAXException {        // TODO Auto-generated method stub        if(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);    }    //解析文档结束调用    @Override    public void endDocument() throws SAXException {        // TODO Auto-generated method stub        System.out.println("........end.......");        super.endDocument();    }    //解析标签结束时调用    @Override    public void endElement(String uri, String localName, String qName)            throws SAXException {        // TODO Auto-generated method stub        if(tagname.equals("Button")) {            this.printout();        }        super.endElement(uri, localName, qName);    }    //解析文档开始时调用    @Override    public void startDocument() throws SAXException {        // TODO Auto-generated method stub        System.out.println("........begin.......");        super.startDocument();    }    //标签开始时执行    @Override    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {        // TODO Auto-generated method stub        tagname = 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);    }    }

更多相关文章

  1. Android(安卓)Unity3D 相互交互,及退出继承UnityPlayerActivity的
  2. android 解析并显示dicom文件的数据和图像
  3. Android(安卓)Quantity Strings 的 getQuantityString方法取值问
  4. Android报表解决方案 使用开源组件iChartjs(二)
  5. Android(安卓)AOP实现原理全解析
  6. Android(安卓)3.0七大特性全解析
  7. Android:Service生命周期方法与Service启动方式bindService与Star
  8. Android(安卓)图片压缩策略详解,有效解决 Android(安卓)程序 OOM
  9. android 自定义View(一) View的事件分发与绘制

随机推荐

  1. android 横竖屏切换 分辨率大小设置的模
  2. Android Manifest merger failed:×××
  3. removeAllViews()和removeAllViewsInLayo
  4. Android: 浅论虚拟SD卡的实现
  5. Android按钮样式(dmytrodanylyk)使用
  6. android 打开软键盘 关闭软键盘
  7. 帧布局
  8. Android获得系统时间(24小时制)
  9. Android中常用的函数
  10. android canvas中的save()和restore()的