android 或者java SAX解析XML

标签: android java sax | 发表时间:2012-09-26 11:19 | 作者:
出处:http://www.iteye.com

本实例解析xml使用的是继承DefaultHandler类,此类就是java中封装好的xml解析器类,下面看代码详细说明:

第一步:首先说明下xml文件,Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode。如下面的这段people.xml,其中,像<people>、<person>这种节点就属于ElementNode,而张三这种就属于TextNode,001属于Attributes的值。

<?xml version="1.0" encoding="UTF-8"?>
<people> 
  <person personid="001"> 
    <name>张三</name> 
    <tel>12345</tel> 
  </person> 
    
  <person personid="002"> 
    <name>李四</name> 
    <tel>678910</tel> 
  </person> 
</people> 
 

第二步:我们为了代码的复用性高点我们先继承DefaultHandler创建一个BaseHandler基础的解析器抽象类,详细说明和代码如下:

import java.io.File;
import java.io.InputStream;
import java.io.StringReader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public abstract class BaseHandler extends DefaultHandler {
// 解析时导入的是xml字符串
public boolean parse(String xmlString) {
return false;
};
// 解析时导入的是xml流
public boolean parse(InputStream xmlInputStream) {
return false;
};
// 解析时导入的是xml的File类型数据
public boolean parse(File file) {
return false;
};
public void parserXml(BaseHandler baseHandler, String xmlString)
throws Exception {
if (xmlString == null || xmlString.length() == 0)
return;
//注册baseHandler事件并获取XMLReader实例
XMLReader xmlReader = xmlReader(baseHandler);
//将字符串转换成StringReader对象
StringReader read = new StringReader(xmlString);
//将字StringReader对象转换成InputSource对象
InputSource source = new InputSource(read);
//将一个xml字符串变成一个java可以处理的InputSource对象载入xmlReader的parse方法中,解析正式开始
xmlReader.parse(source);
read.close();
}
//把自己写的baseHandler注册到XMLReader中并返回XMLReader对象
private XMLReader xmlReader(BaseHandler baseHandler) {
//获得解析工厂的实例 
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser;
XMLReader xmlReader = null;
try {
//获得工厂解析器  
parser = factory.newSAXParser();
//从SAXPsrser中得到一个XMLReader实例
xmlReader = parser.getXMLReader();
//把自己写的baseHandler注册到XMLReader中(注册处理XML文档解析事件ContentHandler)
xmlReader.setContentHandler(baseHandler);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return xmlReader;
}
public void parserXml(BaseHandler baseHandler,
InputStream xmlInputStream) throws Exception {
if (xmlInputStream == null)
return;
//获得解析工厂的实例 
SAXParserFactory factory = SAXParserFactory.newInstance();
//获得工厂解析器  
SAXParser parser = factory.newSAXParser();
//将一个xml流载入parse方法中,解析正式开始
parser.parse(xmlInputStream, baseHandler);
}
public void parserXml(BaseHandler baseHandler,
File file) throws Exception {
if (file == null)
return;
//获得解析工厂的实例 
SAXParserFactory factory = SAXParserFactory.newInstance();
//获得工厂解析器  
SAXParser parser = factory.newSAXParser();
//将一个xml文件对象File载入parse方法中,解析正式开始
parser.parse(file, baseHandler);
}
/*
 * 读取标签里的值,ch用来存放某行的xml的字符数据,包括标签,初始大小是2048, 每解释到新的字符会把它添加到char[]里。 *
 * 注意,这个char字符会自己管理存储的字符, 并不是每一行就会刷新一次char,start,length是由xml的元素数据确定的,
 * 这里一个正标签,反标签都会被执行一次characters,所以在反标签时不用获得其中的值
 * 这里获取的值是标签之间的值如:<item>*********</item>表示星号部分的值
 */
public abstract void characters(char[] ch, int start, int length)
throws SAXException;
// 用户处理文档解析结束事件
public void endDocument() throws SAXException{};
// 用于处理元素结束事件
public abstract void endElement(String uri, String localName, String qName)
throws SAXException;
// 用于处理文档解析开始事件
public void startDocument() throws SAXException{};
/*
 * 用于处理元素开始事件, 
 * 在解释到一个开始元素时会调用此方法.但是当元素有重复时可以自己写算法来区分 这些重复的元素.qName是什么?
 * <name:page ll=""></name:page>这样写就会抛出SAXException错误 通常情况下qName等于localName
 */
public abstract void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException;
}
 

第三步:我们针对自己编写的people.xml文件作为本例解析文件做一个对应的PeopleHandler类继承基础类BaseHandler,实现如下:

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
public class PeopleHandler extends BaseHandler {
private Person mPerson;
//实例化一个栈用于存放标签
private Stack<String> tagStack = new Stack<String>();
//实例化一个集合存储Person对象
private List<Person> list = new ArrayList<Person>();
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String chars = new String(ch, start, length).trim();
if (chars != null) {
String tagName = (String) tagStack.peek();//从栈中获取一个标签元素
if (tagName.equals("name")) {
mPerson.setName(chars);
} else if (tagName.equals("tel")) {
mPerson.setTel(chars);
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
tagStack.pop();//当一个标签把他弹出栈
if (qName.equals("person")) {//当一个person标签结束时将mPerson对象添加到list集合中
list.add(mPerson);
}
}
@Override
public boolean parse(String xmlString) {
try {
super.parserXml(this, xmlString);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
public boolean parse(InputStream xmlInputStream) {
try {
super.parserXml(this, xmlInputStream);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
public boolean parse(File file) {
try {
super.parserXml(this, file);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equals("person")) {//当一个person标签开始时实例化一个Person对象
mPerson = new Person();
String personId = attributes.getValue("personid");//获取person标签中的属性值personId
mPerson.setPersonID(personId);
} 
tagStack.push(qName);
}
public List<Person> getResult(){
return list;
}
public void clear(){
list.clear();
}
}
 

第四步:编写一个测试类main进行测试验证:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Mian {
public static void main(String[] args) {
// 实例化自定义的解析类
PeopleHandler mHandler = new PeopleHandler();
// 载入解析对象这里使用三种方式
// 第一种:载入xml的File类型进行解析
String filename = "src/people.xml";
File file = new File(filename);
mHandler.parse(file);
System.out.println("第一种方式实现输出结果:" + mHandler.getResult());
mHandler.clear();
// 第二种:载入xml流的方式进行解析
try {
InputStream is = new FileInputStream(file);
mHandler.parse(is);
System.out.println("第二种方式实现输出结果:" + mHandler.getResult());
mHandler.clear();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 第三种:载入xml字符串的方式进行解析
try {
InputStreamReader insReader = new InputStreamReader(
new FileInputStream(file), "UTF-8");
BufferedReader bufReader = new BufferedReader(insReader);
StringBuffer str = new StringBuffer();
String line;
while ((line = bufReader.readLine()) != null) {
str.append(line);
}
bufReader.close();
insReader.close();
mHandler.parse(str.toString());
System.out.println("第三种方式实现输出结果:" + mHandler.getResult());
mHandler.clear();
} catch (IOException e) {
e.getStackTrace();
}
}
}
 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [android java sax] 推荐:

android 或者java SAX解析XML

- - ITeye博客
本实例解析xml使用的是继承DefaultHandler类,此类就是java中封装好的xml解析器类,下面看代码详细说明:. 第一步:首先说明下xml文件,Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode.

java解析xml数据---sax解析器

- - ITeye博客
下面是handler解析数据的方法. private HashMap map = null;// 存储单个解析的完整对象. private List> list = null;// 存储全部的解析对象. private String currentTag = null; // 正在解析的元素的标签.

Android XML文档解析(一)——SAX解析

- - CSDN博客移动开发推荐文章
       此文章仅作为学习交流所用.        转载或引用请务必注明原文地址:.        或联系作者:[email protected] .     XML:extensible markup language,可扩展标记语言. 与HTML(超文本标记语言,即Hypertext Markup Language)一样,XML也是 标准通用标记语言 (SGML) 的子集,非常适合 Web 传输.

用java sax处理xml文件(DBLP数据集)

- - CSDN博客综合推荐文章
在java中,可以用多种方式处理xml文件. 前一段时间因为要使用到dblp数据集,而且这个数据集比较大无法一次性加载到内存中解析成文档树再处理. 所以只能用sax的方式边读边处理. 下面是dblp数据集的简介,在处理xml文件之前,对xml的结构的了解很重要:. DBLP是计算机领域内对研究的成果以作者为核心的一个计算机类英文文献的集成数据库系统,按年代列出了作者的科研成果.

android解析XML总结-SAX、Pull、Dom三种方式

- - CSDN博客移动开发推荐文章
     在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式. 最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下:.

xml sax解析

- - 移动开发 - ITeye博客
最近一直在做接口,主要用对xml的解析用的是sax,下面我对sax的几种写法做了一个测试:. System.out.println("耗时:"+(end-start));. System.out.println("当前 Java 虚拟机中的使用内存量:" + (freeMemory01-freeMemory02) + " 字节");.

Java/Android编码规范

- - CSDN博客推荐文章
1.        为什么需要编码规范?. 编码规范对于程序员而言尤为重要,有以下几个原因:. l        一个软件的生命周期中,80%的花费在于维护. l        几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护. l        编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码.

Android中Java和JavaScript交互

- - 极客521 | 极客521
Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本. 本文将介绍如何实现Java代码和Javascript代码的相互调用. 实现Java和js交互十分便捷. WebView开启JavaScript脚本执行. WebView设置供JavaScript调用的交互接口.

使用SAX 解析XMl 通用哟

- - CSDN博客推荐文章
} /** * 设计的数据对象结构 * @author liboliu * */ class Data{. //包含的数据 此数据应该与son互斥. //初始化 root linklist. //获取父对象这里应该 出栈后 在入栈 但是用 linkedList 直接获取栈顶数据 就不用 进行出入栈操作了.

SAX和DOM解析XML区别

- - 移动开发 - ITeye博客
本文转载自: http://blog.csdn.net/zhangxinrun/article/details/5678118. 还有一篇文章总结的也不错: http://www.kaifajie.cn/kecheng/java/7625.html借鉴一下,学习学习. 当你需要处理XML文档时,你的首要选择是使用DOM(文档对象模型)还是使用SAX(用于XML的简单API),即当前使用的两个主要的XML API.