前言
本文主要介绍在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,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 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,length);
else if(tagname.equals("layoutheight"))
sheight = new String(ch,length);
else if(tagname.equals("layoutalignParentBottom"))
salign = new String(ch,length);
else if(tagname.equals("text"))
text = new String(ch,length);
super.characters(ch,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 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,
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,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开发之XML文件解析的使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)