XML文件解析
XML:可扩展标记语言。
有DOM和SAX两种解析方式,下面介绍SAX解析方式

SAX:
一、什么是SAX
全称:Simple API for XML,既是指一种接口,又是指一个软件包。
作为接口,SAX是事件驱动型XML解析的一个标准接口。
它是一个标准,用来解析XML文档。基于这项标准有各种各样的实现方法,有C++版本d 实现、JAVA版本的实现。
优点:
1、逐行扫描文档,一边扫描一边解析
2、可以在解析文档的任意时刻来停止解析

缺点:
1、操作复杂
2、添加或删除内容比较麻烦

二、SAX基本原理

SAX的工作原理简单地说是对文档的顺序扫描,当扫描到文档开始与结束、元素开始与结束、文档结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件:
a)、在文档的开始和结束时触发文档处理事件。
b)、在文档内每一XML元素接受解析的前后触发元素事件
c)、任何元数据通常都由单独的事件交付
d)、在处理文档的DTD或Schema时产生DTD或Schema事件
e)、产生错误事件用来通知主机应用程序解析错误


三、SAX常用接口
每次产生一个事件都会触发相应的函数,我们要做的事情就是在这些函数里面写上处理元素的代码。
最常用的接口有ContentHandler。
ContentHandler是Java类包中一个特殊SAX接口,位于org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素的开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
ContentHandler接口的方法有以下几种:
返回值、方法名 描述 备注
void startDocument() 当开始读取文档时调用
void endDocument() 当文档读取结束时调用
void startElement(String uri,String localName,String qName,Attributes atts) 当开始读取一个元素(标签)时调用
void endElement(String uri,String localName,String qName) 当读取完一个元素时调用
void characters(char ch[],int start,int length) 当读取标签中间的内容时调用

二、SAX解析示例
示例1:解析一个从网上下载下来的.xml文件,并在控制台输出解析出来的内容。
布局文件:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>

<Button
android:id="@+id/parseButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="paresButton"
/>
</LinearLayout>

package eoe.Demo;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyContentHandler extends DefaultHandler {

private String name,sex,age,tagName;

@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("---------startDocument---------");
}

@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("---------endDocument---------");
}


@Override
/**
* 开始解析元素
* String uri:URI的名称空间URI
* String localName:不带前缀的元素(标签)名称
* String name:带前缀的元素(标签)名称
* Attributes attributes:标签的属性
*/
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
System.out.println("name: "+name);
tagName = localName;
if (tagName.equals("wroker")){
for(int i =0;i<attributes.getLength();i++){
//第i个属性的名字,和第i个属性的值
System.out.println(attributes.getLocalName(i) + "=" + attributes.getValue(i));
}
}
}

@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
// 在worker解析完之后,会打印出所有得到的数据
if (localName.equals("worker")){
printout();
}
}

@Override
/**
* 得到标签中间的内容
* char[] ch:标签里的内容(标签内读取出来的内容都会放在这个数组里面)
* int start:字符数组的起始位置(从数组的哪一位开始)
* int length:字符数组的起始位置(到后面多少位)
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
if (tagName.equals("name"))
name = new String(ch,start,length);
else if (tagName.endsWith("sex"))
sex = new String(ch,start,length);
else
age = new String(ch,start,length);
}

public void printout(){
System.out.println("name: "+name);
System.out.println("sex: "+sex);
System.out.println("age: "+age);
}
}

package eoe.Demo;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import android.app.Activity;
import android.os.Bundle;
import android.utils.HttpDownloader;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class XMLSAXTest extends Activity {
/** Called when the activity is first created. */

private Button parseButton = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

parseButton = (Button)findViewById(R.id.parseButton);
parseButton.setOnClickListener(new ParesButtonOnClickListener());
}

class ParesButtonOnClickListener implements OnClickListener{
public void onClick(View v) {
// TODO Auto-generated method stub
HttpDownloader hd = new HttpDownloader();
String resultStr = hd.download("http://dl5.csdn.net/fd.php?i=768128918158274&s=5a92e2d55af5561a2bb3c16216cc2771");
System.out.println("resultStr: "+resultStr);
try {
//创建一个SAXParesFactory工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//创建一个XMLReader对象
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
//为XMLReader设置内容处理器
xmlReader.setContentHandler(new MyContentHandler());
//开始解析文件
xmlReader.parse(new InputSource(new StringReader(resultStr)));
} catch (Exception e) {
e.printStackTrace();
}

}
}
}

更多相关文章

  1. RecyclerView 中 item 点击事件的优化
  2. Android使用SimpleAdapter
  3. java中采用Pull解析器对XML文件进行解析
  4. Android(安卓)-- 使用OKhttp获取response时遇到的坑
  5. Android(安卓)ConstraintLayout 布局解析
  6. Android(安卓)XML 三种解析方式
  7. Android(安卓)RIL 架构学习总结
  8. Android官方文档之App Resources(下)
  9. ListView的行中加了按钮的注意事项

随机推荐

  1. 移动应用开发:如何创建自定义Android代码
  2. Android应用程序消息处理机制(Looper、Han
  3. 关于Android横竖屏的设置和使用
  4. Android(安卓)用代码动态添加View(ViewGro
  5. Android推送通知指南
  6. apk反编译
  7. Android调用系统自带的文件管理器进行文
  8. Android开发规范,性能优化
  9. 关于小机器人
  10. Delphi在Android下通过WiFI进行调试