服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android开发之XML文件解析的使用

Android开发之XML文件解析的使用

2021-01-12 15:08Android开发网 Android

本篇文章介绍了,Android开发之XML文件解析的使用。需要的朋友参考下

  前言 

  本文主要介绍在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模型示意图如下所示:

  Android开发之XML文件解析的使用

  如果要用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);
    }

}

 

延伸 · 阅读

精彩推荐
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9592022-03-02
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6182021-03-27
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7432021-03-11
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810042021-05-03
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8332021-03-31
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4622021-03-09
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4652021-01-03