MyException - 我的异常网
当前位置:我的异常网» XML/SOAP » android 或许java SAX解析XML

android 或许java SAX解析XML

www.MyException.Cn  网友分享于:2013-10-09  浏览:8次
android 或者java SAX解析XML

本实例解析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();
}
}
}
 

文章评论

当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
每天工作4小时的程序员
每天工作4小时的程序员
代码女神横空出世
代码女神横空出世
 程序员的样子
程序员的样子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
如何成为一名黑客
如何成为一名黑客
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
10个调试和排错的小建议
10个调试和排错的小建议
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
鲜为人知的编程真相
鲜为人知的编程真相
漫画:程序员的工作
漫画:程序员的工作
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
中美印日四国程序员比较
中美印日四国程序员比较
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
一个程序员的时间管理
一个程序员的时间管理
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
为什么程序员都是夜猫子
为什么程序员都是夜猫子
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
Java程序员必看电影
Java程序员必看电影
程序员和编码员之间的区别
程序员和编码员之间的区别
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
我是如何打败拖延症的
我是如何打败拖延症的
程序员必看的十大电影
程序员必看的十大电影
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
老程序员的下场
老程序员的下场
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员的鄙视链
程序员的鄙视链
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
旅行,写作,编程
旅行,写作,编程
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
编程语言是女人
编程语言是女人
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员都该阅读的书
程序员都该阅读的书
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有