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
- [XML] SAX解析XML
- 【XML】SAX解析XML
- XML解析(SAX解析)
- XML解析:SAX解析
- Study SAX《SAX解析XML》
- 使用SAX解析XML
- 解析xml之--SAX
- SAX解析XML
- SAX解析XML
- xml文件解析-SAX
- 解析xml之--SAX
- 解析xml之--SAX
- 使用SAX解析XML
- XML学习《SAX解析》
- SAX解析XML例子
- java sax 解析 xml
- 使用SAX解析XML
- sax解析xml实例
- 15 Android 数据存储
- android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
- 基于融合特征图像检索的优点
- eclipse4.2 版本插件装配
- Android 和 iOS 孰优孰劣:真实应用开发过程告诉你答案
- SAX解析XML
- jdbc的pl/sql的java调用存储过程
- 实战演示黑客如何利用SQL注入漏洞攻破一个WordPress网站
- 关于编程在线
- banner图加速加载的方法
- TortoiseSVN 中访问错误
- JNI数据类型转换
- 开心的小明
- jsp的分页技术与访问数据库的汉字处理