Android之SAX解析XML

本文介绍了使用Sax解析XML文档的方法,包括事件驱动的流式解析技术、如何实现XML文件对应的实体类及事件处理类,以及如何通过Android单元测试验证解析效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sax使用的是事件驱动的流式解析技术。事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。当解析到文档的开始或结束、元素的开始或结束等都会触发一个事件,我们在事件处理方法中完成对数据的操作。由此可见,我们需要编写实现了事件接口的类。

 1.XML文件对应的实体Book:

[java]  view plain copy
  1. package eoe.androidxml;  
  2.   
  3. public class Book {  
  4.   
  5. private int id;  
  6. private String name;  
  7. private float price;  
  8.   
  9. public Book() {  
  10. }  
  11.   
  12. public Book(int id, String name, float price) {  
  13. this.id = id;  
  14. this.name = name;  
  15. this.price = price;  
  16. }  
  17.   
  18. public int getId() {  
  19. return id;  
  20. }  
  21.   
  22. public void setId(int id) {  
  23. this.id = id;  
  24. }  
  25.   
  26. public String getName() {  
  27. return name;  
  28. }  
  29.   
  30. public void setName(String name) {  
  31. this.name = name;  
  32. }  
  33.   
  34. public float getPrice() {  
  35. return price;  
  36. }  
  37.   
  38. public void setPrice(float price) {  
  39. this.price = price;  
  40. }  
  41.   
  42. @Override  
  43. public String toString() {  
  44. return "Book [name=" + name + ", price=" + price + "]";  
  45. }  
  46. }  

2.Sax解析XML的事件处理类:

       Sax的事件处理类必须实现ContentHandler接口,但我们在这个例子中不需要使用到ContentHandler接口的所有方法,我们仅需要其中的3个方法。所以Sax为我们提供了一个没有进行任何操作的ContentHandler实现类DefaultHandler。我们直接继承DefaultHandler类,并重写我们需要的方法即可。

[java]  view plain copy
  1. package eoe.androidxml.;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import org.xml.sax.Attributes;  
  6. import org.xml.sax.SAXException;  
  7. import org.xml.sax.helpers.DefaultHandler;  
  8. import com.changcheng.androidxml.entity.Book;  
  9.   
  10. public class SaxXmlContentHandler extends DefaultHandler {  
  11. private List books;  
  12. private Book book;  
  13. private String tagName;  
  14.   
  15. public List getBooks() {  
  16. return books;  
  17.   
  18. }  
  19. /**接收文档的开始的通知。*/  
  20.   
  21. @Override  
  22. public void startDocument() throws SAXException {  
  23. this.books = new ArrayList();  
  24. }  
  25.   
  26. /**接收字符数据的通知。*/  
  27.   
  28. @Override  
  29. public void characters(char[] ch, int start, int length)  
  30. throws SAXException {  
  31. if (this.tagName != null) {  
  32. String data = new String(ch, start, length);  
  33. if (this.tagName.equals("name")) {  
  34. this.book.setName(data);  
  35. else if (this.tagName.equals("price")) {  
  36. this.book.setPrice(Float.parseFloat(data));  
  37. }  
  38. }  
  39. }  
  40.   
  41. /** 
  42. * 接收元素开始的通知。 
  43. * namespaceURI:元素的命名空间 
  44. * localName:元素的本地名称(不带前缀) 
  45. * qName:元素的限定名(带前缀) 
  46. * atts:元素的属性集合 
  47. */  
  48.   
  49. @Override  
  50. public void startElement(String uri, String localName, String qName,  
  51. Attributes attributes) throws SAXException {  
  52. if (localName.equals("book")) {  
  53. book = new Book();  
  54. book.setId(Integer.parseInt(attributes.getValue(0)));  
  55. }  
  56. this.tagName = localName;  
  57. }  
  58.   
  59. /** 
  60. * 接收文档的结尾的通知。 
  61. * uri:元素的命名空间 
  62. * localName:元素的本地名称(不带前缀) 
  63. * name:元素的限定名(带前缀) 
  64. */  
  65.   
  66. @Override  
  67. public void endElement(String uri, String localName, String qName)  
  68. throws SAXException {  
  69. if (localName.equals("book")) {  
  70. this.books.add(this.book);  
  71. }  
  72. this.tagName = null;  
  73. }  
  74. }  

   3.编写测试Sax解析XML的类

       在创建工程时,生成的AndroidXML.java,并没有被使用到。因为我们使用Android的单元测试,运行上面的程序。

       编写Android单元测试类:

[java]  view plain copy
  1. package eoe.androidxml;  
  2.   
  3. import java.io.InputStream;  
  4. import java.io.StringWriter;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. import com.changcheng.androidxml.entity.Book;  
  8. import com.changcheng.androidxml.xml.AndoridSaxXml;  
  9. import com.changcheng.androidxml.xml.AndroidPullXML;  
  10. import android.test.AndroidTestCase;  
  11. import android.util.Log;  
  12.   
  13. public class TestAndroidXML extends AndroidTestCase {  
  14. private static final String TAG = "TestAndroidXML";  
  15.   
  16. /** 
  17. * 测试Sax解析XML 
  18. * @throws Throwable 
  19. */  
  20.   
  21. public void testAndroidSaxReadXML() throws Throwable{  
  22. InputStream file = this.getClass().getClassLoader().getResourceAsStream("books.xml");  
  23. try {  
  24. List books = AndoridSaxXml.readXML(file);  
  25. Log.i(TAG, books.toString());  
  26. catch (Exception e) {  
  27. Log.e(TAG, e.toString());  
  28. }  
  29. }  
  30. }  

4.运行测试

       在outline面板中的testAndroidSaxReadXML方法或在TestAndroidXML类的testAndroidSaxReadXML方法上右键->Debug As->Android Junit Test。运行结束后在LogCat面板中查看运行结束。
关于使用Sax生成XML文档,我在此就不做总结了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值