標籤:
***MySaxHandler***
package android_xml_sax;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class MySaxHandler extends DefaultHandler { public List<Book> list ; public Book book ; public StringBuilder builder; public List<Book> getList() { return list; } @Override public void startDocument() throws SAXException { // TODO 自動產生的方法存根 super.startDocument(); list = new ArrayList<Book>(); builder = new StringBuilder(); } /** *方法說明: *解析器在 XML 文檔中的每個元素的開始調用此方法;對於每個 startElement 事件都將有相應的 endElement 事件(即使該元素為空白時)。所有元素的內容都將在相應的 endElement 事件之前順序地報告。 *參數說明: *uri - 名稱空間 URI,如果元素沒有名稱空間 URI,或者未執行名稱空間處理,則為空白字串 *localName - 本地名稱(不帶首碼),如果未執行名稱空間處理,則為空白字串 *qName - 限定名(帶有首碼),如果限定名不可用,則為空白字串 *atts - 串連到元素上的屬性。如果沒有屬性,則它將是空 Attributes 對象。在 startElement 返回後,此對象的值是未定義的 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO 自動產生的方法存根 super.startElement(uri, localName, qName, attributes); if(qName.equals("book")){ book = new Book(); } builder.setLength(0); } /** * 接收字元資料的通知,可以通過new String(ch,start,length)構造器,建立解析出來的字串文本. *參數: *ch - 來自 XML 文檔的字元 *start - 數組中的開始位置 *length - 從數組中讀取的字元的個數 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO 自動產生的方法存根 super.characters(ch, start, length); builder.append(ch, start, length); //將讀取的字元數組追加到builder中 } /** * SAX 解析器會在 XML 文檔中每個元素的末尾調用此方法;對於每個 endElement 事件都將有相應的 startElement 事件(即使該元素為空白時)。 * 參數: *uri - 名稱空間 URI,如果元素沒有名稱空間 URI,或者未執行名稱空間處理,則為空白字串 *localName - 本地名稱(不帶首碼),如果未執行名稱空間處理,則為空白字串 *qName - 限定的 XML 名稱(帶首碼),如果限定名不可用,則為空白字串 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO 自動產生的方法存根 super.endElement(uri, localName, qName); if(qName.equals("id")){ book.setId(Integer.parseInt(builder.toString())); }else if(qName.equals("name")){ book.setName(builder.toString()); }else if(qName.equals("price")){ book.setPrice(Float.parseFloat(builder.toString())); }else if(qName.equals("book")){ list.add(book); } } @Override public void endDocument() throws SAXException { // TODO 自動產生的方法存根 super.endDocument(); } }
***test.java***
package android_xml_sax;import java.io.File;import java.io.IOException;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;public class test { public static void main(String[] args) { // TODO 自動產生的方法存根 SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser parser = factory.newSAXParser(); MySaxHandler handler = new MySaxHandler(); parser.parse(new File("src/xml/book.xml"), handler); List<Book> list = handler.getList(); for(Book book:list){ System.out.println(book.toString()); } } catch (ParserConfigurationException e) { // TODO 自動產生的 catch 塊 e.printStackTrace(); } catch (SAXException e) { // TODO 自動產生的 catch 塊 e.printStackTrace(); } catch (IOException e) { // TODO 自動產生的 catch 塊 e.printStackTrace(); } }}
***Book.java***
package android_xml_sax;public class Book { private int id; private String name; private float price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString() { return "id:" + id + ", name:" + name + ", price:" + price; }}
***book.xml***
<?xml version="1.0" encoding="utf-8"?><books> <book> <id>1</id> <name>Thinking In Java</name> <price>80.00</price> </book> <book> <id>2</id> <name>Core Java</name> <price>90.00</price> </book> <book> <id>3</id> <name>Hello, Andriod</name> <price>100.00</price> </book></books>
安卓解析XML之SAX