閱讀800 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java解析XML(一)、SAX

package xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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

import model.Book;

/**
 * 使用SAX解析XML文件
 */
public class SaxHelper {
	
	private static SAXParserFactory spf;

	/**
	 * 使用SAX方式解析XML文件
	 * @param is XML文件輸入流
	 * @return 
	 */
	public static List<Book> saxReader(InputStream is) {
		try {
			if (spf == null)
			 spf = SAXParserFactory.newInstance();
			SAXParser saxParser = spf.newSAXParser(); 
			XmlContentHandler xmlContentHandler = new XmlContentHandler();
			saxParser.parse(is, xmlContentHandler);
			return xmlContentHandler.getBooks();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}


package xml;

import java.util.ArrayList;
import java.util.List;

import model.Book;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import util.DateUtils;

/**
 * SAX解析XML文件的事件處理器
 */
public class XmlContentHandler extends DefaultHandler {
	
	private Book book;	//保存每一個節點的對象
	
	private List<Book> books;	//保存已解析好的節點對象
	
	private String preTag;		//保存當前正在解析的節點標簽名
	
	@Override
	public void startDocument() throws SAXException {
		System.out.println("開始解析文檔...");
		books = new ArrayList<Book>();
	}
	
	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		if (name.equals("book") && book == null) {
			book = new Book();
			book.setIsbn(attributes.getValue("", "isbn"));
		}
		
		preTag = name;	//記錄當前開始節點名
	}
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (book != null && preTag != null && !"book".equals(preTag) && !"books".equals(preTag)) {
			String data = new String(ch,start,length);
			if (!"".equals(data.trim())) {
				if ("name".equals(preTag)) {
					book.setName(data);
				} else if ("author".equals(preTag)) {
					book.setAuthor(data);
				} else if ("publishing".equals(preTag)) {
					book.setPublishing(data);
				} else if ("pubdate".equals(preTag)) {
					book.setPubdate(DateUtils.string2Date("yyyy-mm-dd", data));
				} else if ("price".equals(preTag)) {
					book.setPrice(Double.parseDouble(data));
				}
			}
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		if ("book".equals(name) && book != null) {
			books.add(book);
			book = null;	//一個節點的結束,代表一本書的信息解析完成,所以要將book設為null
		}
		preTag = null;		//同時將當前書的節點設為null
	}
	
	@Override
	public void endDocument() throws SAXException {
		System.out.println("XML文件解析結束...");
		System.out.println("結果:" + books);
	}

	/**
	 * 獲得解析後的數據
	 * @return
	 */
	public List<Book> getBooks() {
		return books;
	}
	
}


package model;

import java.util.Date;

/**
 * 圖書
 */
public class Book {

	/**
	 * 圖書編號
	 */
	private String isbn;
	
	/**
	 * 書名
	 */
	private String name;
	
	/**
	 * 作者
	 */
	private String author;
	
	/**
	 * 出版社
	 */
	private String publishing;
	
	/**
	 * 發布時間
	 */
	private Date pubdate;
	
	/**
	 * 價格
	 */
	private double price;

	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	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 String getPublishing() {
		return publishing;
	}

	public void setPublishing(String publishing) {
		this.publishing = publishing;
	}

	public Date getPubdate() {
		return pubdate;
	}

	public void setPubdate(Date pubdate) {
		this.pubdate = pubdate;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}
	
	public String toString() {
		return "name: " + name + " isbn: " + isbn + " author: " + author
				+ " publishing: " + publishing + " pubdate: " + pubdate
				+ " price: " + price;
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<books>
	<!-- ISBN:國際標準書號由13位數字組成。前三位數字代表圖書,中間的9個數字分為三組,分別表示組號、出版社號和書序號,最後一個數字是校驗碼。 -->
	<book isbn="9787121025389">
		<name>JAVA麵向對象編程</name>
		<author>孫衛琴</author>
		<publishing>電子工業出版社</publishing>
		<pubdate>2006-07-01</pubdate>
		<price>50.60</price>
	</book>
	<book isbn="9787111349662">
		<name>深入理解Java虛擬機:JVM高級特性與最佳實踐</name>
		<author>周誌明</author>
		<publishing>機械工業出版社</publishing>
		<pubdate>2011-07-01</pubdate>
		<price>46.20</price>
	</book>
	<book isbn="9787508338408">
		<name>Java網絡編程(第3版)</name>
		<author>(英)哈諾德 著 朱濤江,林劍 譯</author>
		<publishing>中國電力出版社</publishing>
		<pubdate>2005-11-01</pubdate>
		<price>63.80</price>
	</book>
	<book isbn="9787508379661">
		<name>Java經典實例(第2版)</name>
		<author>(美)達爾文(Darwin,F.I) 著 關麗榮,張曉坤 譯</author>
		<publishing>中國電力出版社</publishing>
		<pubdate>2009-02-01</pubdate>
		<price>72.10</price>
	</book>
	<book isbn="9787111213826">
		<name>Java編程思想(第4版)</name>
		<author>(美)埃克爾 著 陳昊鵬 譯</author>
		<publishing>機械工業出版社</publishing>
		<pubdate>2007-06-01</pubdate>
		<price>74.50</price>
	</book>
	<book isbn="9787508344980">
		<name>Head First Java(中文版)(第2版)</name>
		<author>(美)塞若(Sierra,K.),(美)貝茨(Bates,B.) 著 O’Reilly Taiwan公司 譯 張然,等 編</author>
		<publishing>中國電力出版社</publishing>
		<pubdate>2007-02-01</pubdate>
		<price>55.20</price>
	</book>
	<book isbn="9787111231837">
		<name>數據結構與算法分析:Java語言描述(第2版)</name>
		<author>(美)韋斯(Weiss,M.A.) 著 馮舜璽 譯</author>
		<publishing>機械工業出版社</publishing>
		<pubdate>2009-01-01</pubdate>
		<price>41.20</price>
	</book>
</books>


最後更新:2017-04-02 22:16:20

  上一篇:go javascript閉包
  下一篇:go 使用內省的方式操作JavaBean