本实例解析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();
}
}
}
分享到:
相关推荐
总结,SAX解析XML在Android开发中是一个实用且高效的解决方案,尤其适用于处理大型XML文件。通过创建自定义的事件处理器,可以灵活地解析和处理XML数据,满足各种业务需求。不过,需要注意的是,由于SAX是基于事件的...
以下是一个使用SAX解析XML文件的基本步骤: 1. **创建解析器**: 首先,我们需要创建一个SAX解析器实例。在Java中,这通常通过`SAXParserFactory`类完成。设置解析器属性,然后调用`newSAXParser()`方法获取`...
"SAX解析String类型XML字符串"就是一种高效且节省内存的方式去解析XML数据,特别是当XML文件较大时,SAX解析器优于DOM解析器,因为它不需要一次性加载整个XML到内存中。下面我们将深入探讨这一主题。 首先,XML...
首先,让我们了解一下SAX解析XML的基本流程。当SAX解析器读取XML文件时,它会按照文档顺序触发一系列事件,这些事件对应于ContentHandler接口中定义的方法。以下是ContentHandler接口的一些关键方法: 1. `start...
本示例"android sax解析xml模板源码"提供了一个使用SAX解析XML的实例,方便开发者直接导入到自己的项目中使用。 SAX解析XML的基本流程如下: 1. **创建解析器**:在Android中,我们需要使用`SAXParserFactory`来...
SAX解析器为Android开发者提供了一种高效且内存友好的方式来解析XML数据,尤其适用于处理大量或复杂的数据。在`SaxTest`项目中,你可以找到一个具体的示例,演示如何将这些概念整合到实际的Android应用中。
下面详细介绍Android中使用SAX解析XML的关键步骤和相关知识点: 1. 引入库:在Android项目中,SAX解析器已经内置于`org.xml.sax`包中,无需额外导入库。 2. 创建事件处理器:你需要创建一个类来实现`...
下面我们将详细讨论如何在Android中使用SAX解析XML。 首先,我们需要了解SAX解析的基本原理。SAX解析器在读取XML文档时,会触发一系列的事件,如开始文档、开始元素、结束元素、字符数据等。开发者需要定义一个...
本文将详细介绍如何在Android中使用SAX解析XML。 首先,我们需要了解SAX解析的基本流程。SAX解析XML的过程是基于事件的,当解析器读取XML文档时,会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等...
### Android中使用SAX解析XML 1. **引入库**:在Android项目中,SAX解析器已经内置在`org.xml.sax`包中,无需额外导入库。 2. **创建ContentHandler**:创建一个实现了`org.xml.sax.ContentHandler`接口的类,重写...
本教程将详细讲解如何在Android中使用SAX解析XML。 首先,要使用SAX解析XML,我们需要理解其工作原理。SAX解析器会逐个读取XML文档的元素,每当遇到文档的开始、结束、文本等事件时,就会触发相应的回调方法。...
本资料包“xml.rar”主要关注Android环境下的XML解析,特别是SAX解析器,同时也涵盖了DOM和Pull解析方式。 1. XML基本概念: XML是一种自描述性的标记语言,它通过标签来定义数据结构。每个XML文档都包含元素、...
本篇文章将深入探讨三种在Android中解析XML的方法:DOM(文档对象模型)、Pull(拉取解析器)和SAX(简单API for XML),并且会特别强调如何识别文件编码。 首先,DOM解析是将整个XML文件加载到内存中形成一个树形...
本文将详细介绍如何在Android中使用SAX解析XML。 首先,理解SAX解析的基本原理。SAX解析器在读取XML文档时,会触发一系列的事件,例如开始文档、结束文档、开始元素、结束元素等。开发者需要创建一个实现了`...
本文将详细介绍如何在Android中使用SAX方式解析XML。 **SAX解析器的工作原理** SAX解析器读取XML文件时,遇到每个元素、属性、文本等都会触发相应的事件,开发者需要通过实现ContentHandler接口来处理这些事件。...
以下是一个简单的SAX解析XML文件的Android实例源码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxExample extends ...
下面将详细介绍SAX解析XML文件的基本原理、工作流程以及在Android环境下如何实现。 **SAX解析的基本原理:** SAX解析器在读取XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素、字符数据等...
在Android中使用SAX解析XML,主要涉及以下几个关键步骤: 1. **创建ContentHandler**:ContentHandler是SAX解析的核心,它定义了一系列的回调方法,用于处理XML文档的各种事件。比如`startDocument()`会在解析开始...
XML(eXtensible Markup ...了解和掌握SAX解析XML的原理和实践,对于Android开发者来说,有助于优化应用性能,特别是处理大量XML数据时。在实际项目中,根据具体需求选择合适的解析方式,是提高代码质量和效率的关键。
以下是使用SAX解析XML的基本步骤: - 创建`DefaultHandler`子类,重写关键方法如`startElement`、`endElement`和`characters`。 - 实例化`SAXParserFactory`,然后获取`SAXParser`。 - 使用`parse`方法解析XML文件...