SAX解析XML

来源:互联网 发布:js date gmt 编辑:程序博客网 时间:2024/06/06 16:54

jdk中DefaultHandler类 虽然实现了ContentHandler接口的startDocument(),endDocument(),startElement(),endElement(),characters()
这些方法,但是没有执行任何操作.需要其子类进一步重写。

使用SAX读取XML文件时需创建一个类 XMLContentHandler , 这个类继承DefaultHandler类,然后重写里面的这些方法:

startDocument(),endDocument(),startElement(),endElement(),characters()


 

首先准备一个xml文件,例如book.xml


<?xml version="1.0" encoding="UTF-8"?><booklist><book isbn="1001" catalog="科幻"><name lang="en">哈利波特</name><author>罗琳</author><price>60</price><year>2005</year></book><book isbn="1002" catalog="Web"><name lang="en">Spring</name><author>Bruce</author><price>54</price><year>2008</year></book><book isbn="1003" catalog="武侠"><name lang="zh">笑傲江湖</name><author>金庸</author><price>70</price><year>1970</year></book><book isbn="1004" catalog="武侠"><name lang="zh">小李飞刀</name><author>古龙</author><price>45</price><year>1965</year></book></booklist>

创建一个java实体类: Book.java


package sax.xml;/** *  *  Class Name: Book.java *  Function: *   *     Modifications:    *   *  @author Howard  DateTime 2014-1-3 下午12:38:26     *  @version 1.0 */public class Book {private String isbn;private String catalog;private String name;private String author;private double price;private int year;public Book() {super();}public Book(String isbn, String catalog, String name, String author,double price, int year) {super();this.isbn = isbn;this.catalog = catalog;this.name = name;this.author = author;this.price = price;this.year = year;}public String getIsbn() {return isbn;}public void setIsbn(String isbn) {this.isbn = isbn;}public String getCatalog() {return catalog;}public void setCatalog(String catalog) {this.catalog = catalog;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}@Overridepublic String toString() {return "Book [isbn=" + isbn + ", catalog=" + catalog + ", name=" + name+ ", author=" + author + ", price=" + price + ", year=" + year+ "]";}}

解析xml,Xml ContentHandler.java
package sax.xml;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class XMLContentHandler extends DefaultHandler {private List<Book> books;private Book book;private String tag;public List<Book> getBooks() {return books;}/** *  接收文档开始的通知,这里重写 *  Function: *  *  @author Howard  DateTime 2014-1-3 下午12:58:23 *  @throws SAXException */public void startDocument() throws SAXException {books = new ArrayList<Book>();System.out.println("开始解析");}/** * 接收元素开始的通知,重写此方法,以便在每个元素的开始处采取特定的操作(如,分配新的树节点或将输出写入文件). *  Function:  *  @author Howard  DateTime 2014-1-3 下午12:58:12 *  @param uri 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串. *  @param localName 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串. *  @param qName  限定的名称(带有前缀),如果限定的名称不可用,则为空字符串. *  @param attributes  附加到元素的属性.如果没有属性,则它将是空的 Attributes对象. *  @throws SAXException */public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if ("book".equals(qName)) {book = new Book();book.setIsbn(attributes.getValue("isbn"));book.setCatalog(attributes.getValue("catalog"));}tag = qName;System.out.println("解析开始:" + qName);}/** * 接收元素中字符数据的通知.重写此方法,以便对每块字符数据采取特定的措施(如将该数据添加到节点或缓冲区,或者将该数据打印到文件). *  Function: *  @author Howard  DateTime 2014-1-3 下午12:58:32 *  @param ch 字符 *  @param start  字符数组中的开始位置 *  @param length  从字符数组中使用的字符数 *  @throws SAXException */public void characters(char[] ch, int start, int length)throws SAXException {if (book != null) {String data = new String(ch, start, length);if ("name".equals(tag)) {book.setName(data);}if ("author".equals(tag)) {book.setAuthor(data);}if ("price".equals(tag)) {book.setPrice(new Double(data));}if ("year".equals(tag)) {book.setYear(new Integer(data));}System.out.println("解析内容: " + new String(ch, start, length));}}/** * 接收元素结束的通知.重写此方法,以便在每个元素的结束处采取特定的操作(如,结束树节点或将输出写入文件). *  Function: *  @author Howard  DateTime 2014-1-3 下午12:58:38 *  @param uri 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串. *  @param localName  本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串. *  @param qName  限定的名称(带有前缀),如果限定的名称不可用,则为空字符串. *  @throws SAXException */public void endElement(String uri, String localName, String qName)throws SAXException {if ("book".equals(qName) && book != null) {books.add(book);book = null;}tag = null;System.out.println("解析完毕");}/** * 接收文档结束的通知.重写 *  Function: *  @author Howard  DateTime 2014-1-3 下午12:58:45 *  @throws SAXException */public void endDocument() throws SAXException {super.endDocument();System.out.println("文档解析完毕");}}

测试:SAXBookMain.java
package sax.xml;import java.io.InputStream;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;public class SAXBookMain {public static void main(String[] args) throws Exception {InputStream inStream = SAXBookMain.class.getClassLoader().getResourceAsStream("book.xml");SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser parser = spf.newSAXParser();    //创建解析器XMLContentHandler handler = new XMLContentHandler();parser.parse(inStream, handler);inStream.close();List<Book> books = handler.getBooks();for (Book book : books) {System.out.println("book===="+book);}}}

0 0