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