手机
当前位置:查字典教程网 >编程开发 >安卓软件开发 >Android开发之XML文件解析的使用
Android开发之XML文件解析的使用
摘要:前言本文主要介绍在Android中怎样来解析XML文件。主要采用的是SAX机制,SAX全称为SimpleAPIforXML,它既是一种接口,...

前言

本文主要介绍在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文件解析的使用1

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

}

}

【Android开发之XML文件解析的使用】相关文章:

android之自定义Toast使用方法

Android之网络通信案例分析

Android变形(Transform)之Camera使用介绍

Android 开发中怎么使用自定义字体

Android开发中比较耗时的一些操作小结

android实现获取正在运行的应用程序

Android控件系列之XML静态资源使用介绍

Android开发之BroadcastReceiver用法实例分析

Android开发之文件操作模式深入理解

Android开发: fragment解析及案例

精品推荐
分类导航