您的位置:首页 > 其它

xml Sax解析器

2016-06-17 11:40 176 查看
步骤:

1.创建事件处理程序(继承DefaultHandler),里面需要改写5个事件处理的方法

2.创建SaxParser解析器

3.将第一步创建的事件处理分配给第二步创建的parser

4.文档解析

现在来详细解说一下如何实现xml Sax解析

1.首先在在项目中创建一个xml文档



2.在创建一个Book类

package test.java.com;

public class Book {//从xml中解析出来的内容以一本书的对象的形式存在
private String bookNo;
private String title;
private String author;
public String getBookNo() {
return bookNo;
}
public void setBookNo(String bookNo) {
this.bookNo = bookNo;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Book(String bookNo, String title, String author) {
super();
this.bookNo = bookNo;
this.title = title;
this.author = author;
}
public Book() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "书号:"+bookNo+"\n书名:"+title+"\n作者:"+author;
}
}


3.创建解析器类所要实现的一个接口

package test.java.com;

import java.util.ArrayList;

public interface xmlParse {//创建解析器类所要实现的接口  解析xml文档的一个过程
public ArrayList<Book> parsexml(String fileName);//String fileName为路径名
}


4.创建事件处理器(注意:需要继承DefaultHandler,并且要重写里面的五个事件)

package test.java.com;

import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MySaxHandler extends DefaultHandler {//创建事件处理器
private Book book;//字段
private String tag;// 将东西保存到tag中
private ArrayList<Book> list;

public ArrayList<Book> getList() {
return list;
}

@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
// TODO Auto-generated method stub
super.characters(arg0, arg1, arg2);
if (tag != null) {// 只有tag不为空时,tag中的内容是book中的内容
String s = new String(arg0, arg1, arg2).trim();// arg1代表字符数组的起始位置,arg2代表长度
if (tag.equals("title")) {
book.setTitle(s);
}
if (tag.equals("author")) {
book.setAuthor(s);
}
}
}

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

@Override
public void endElement(String arg0, String arg1, String arg2)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(arg0, arg1, arg2);
if (arg2.equals("book")) {
list.add(book);
book = null;
}
tag = null;
}

@Override
public void startDocument() throws SAXException {//文档一开始就要建列表
// TODO Auto-generated method stub
super.startDocument();
list = new ArrayList<Book>();
}

@Override
public void startElement(String arg0, String arg1, String arg2,
Attributes arg3) throws SAXException {
// TODO Auto-generated method stub
super.startElement(arg0, arg1, arg2, arg3);// arg2保存当前元素的名字,arg3保存书号
if (arg2.equals("book")) {
book = new Book();
String bookNo = arg3.getValue("bookno");
book.setBookNo(bookNo);
}
tag = arg2;// 把当前元素的名字保存到tag字段里
}
}


5.创建xml解析工作的一个类

package test.java.com;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

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

import org.xml.sax.SAXException;

public class SaxParse implements xmlParse{//创建一个解析器实现解析接口(做xml解析工作的一个类)

@Override
public ArrayList<Book> parsexml(String fileName) {
// TODO Auto-generated method stub
ArrayList<Book>  list = new ArrayList<Book>();
SAXParserFactory factory = SAXParserFactory.newInstance();//创建一个Sax解析器工厂
MySaxHandler handler = null;//准备一个事件处理器
try {
SAXParser parser = factory.newSAXParser();//通过工厂来获取一个解析器对象
FileInputStream is = new FileInputStream(fileName);//fileName文件路径
handler = new MySaxHandler();
parser.parse(is, handler);// 将事件处理器配置给解析器 此时list也在handler中了
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
list = handler.getList();
return list;
}

public static void main(String[] args){
xmlParse parse = new SaxParse();
ArrayList<Book> list = parse.parsexml("test.xml");
System.out.println("sax解析结果:");
for(Book book:list){
System.out.println(book);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息