Android之SAX解析XML

來源:互聯網
上載者:User

Sax使用的是事件驅動的流式解析技術。事件驅動的流式解析方式是,從檔案的開始順序解析到文檔的結束,不可暫停或倒退。當解析到文檔的開始或結束、元素的開始或結束等都會觸發一個事件,我們在事件處理方法中完成對資料的操作。由此可見,我們需要編寫實現了事件介面的類。

 1.XML檔案對應的實體Book:

package eoe.androidxml;public class Book {private int id;private String name;private float price;public Book() {}public Book(int id, String name, float price) {this.id = id;this.name = name;this.price = 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;}@Overridepublic String toString() {return "Book [name=" + name + ", price=" + price + "]";}}

2.Sax解析XML的事件處理類:


       Sax的事件處理類必須實現ContentHandler介面,但我們在這個例子中不需要使用到ContentHandler介面的所有方法,我們僅需要其中的3個方法。所以Sax為我們提供了一個沒有進行任何操作的ContentHandler實作類別DefaultHandler。我們直接繼承DefaultHandler類,並重寫我們需要的方法即可。

package eoe.androidxml.;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import com.changcheng.androidxml.entity.Book;public class SaxXmlContentHandler extends DefaultHandler {private List books;private Book book;private String tagName;public List getBooks() {return books;}/**接收文檔的開始的通知。*/@Overridepublic void startDocument() throws SAXException {this.books = new ArrayList();}/**接收字元資料的通知。*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if (this.tagName != null) {String data = new String(ch, start, length);if (this.tagName.equals("name")) {this.book.setName(data);} else if (this.tagName.equals("price")) {this.book.setPrice(Float.parseFloat(data));}}}/*** 接收元素開始的通知。* namespaceURI:元素的命名空間* localName:元素的本地名稱(不帶首碼)* qName:元素的限定名(帶首碼)* atts:元素的屬性集合*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if (localName.equals("book")) {book = new Book();book.setId(Integer.parseInt(attributes.getValue(0)));}this.tagName = localName;}/*** 接收文檔的結尾的通知。* uri:元素的命名空間* localName:元素的本地名稱(不帶首碼)* name:元素的限定名(帶首碼)*/@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if (localName.equals("book")) {this.books.add(this.book);}this.tagName = null;}}

   3.編寫測試Sax解析XML的類


       在建立工程時,產生的AndroidXML.java,並沒有被使用到。因為我們使用Android的單元測試,運行上面的程式。


       編寫Android單元測試類:

package eoe.androidxml;import java.io.InputStream;import java.io.StringWriter;import java.util.ArrayList;import java.util.List;import com.changcheng.androidxml.entity.Book;import com.changcheng.androidxml.xml.AndoridSaxXml;import com.changcheng.androidxml.xml.AndroidPullXML;import android.test.AndroidTestCase;import android.util.Log;public class TestAndroidXML extends AndroidTestCase {private static final String TAG = "TestAndroidXML";/*** 測試Sax解析XML* @throws Throwable*/public void testAndroidSaxReadXML() throws Throwable{InputStream file = this.getClass().getClassLoader().getResourceAsStream("books.xml");try {List books = AndoridSaxXml.readXML(file);Log.i(TAG, books.toString());} catch (Exception e) {Log.e(TAG, e.toString());}}}

4.運行測試


       在outline面板中的testAndroidSaxReadXML方法或在TestAndroidXML類的testAndroidSaxReadXML方法上右鍵->Debug As->Android Junit Test。運行結束後在LogCat面板中查看運行結束。

關於使用Sax產生XML文檔,我在此就不做總結了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.