Android平台XML文件解析:SAX、DOM与Pull解析器应用

需积分: 50 26 下载量 140 浏览量 更新于2024-09-13 收藏 49KB DOC 举报
在Android平台上处理XML数据是常见的需求,开发者可以选择多种方式来实现,包括Simple API for XML (SAX), Document Object Model (DOM), 和 Android 自带的 pull 解析器。本文将重点讲解如何使用SAX解析XML文件,并结合一个示例来加深理解。 首先,我们来看一下要解析的XML文件 "itcast.xml",其内容定义了一个包含人员信息的结构,如人员ID、姓名和年龄: ```xml <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李明</name> <age>30</age> </person> <person id="20"> <name>李向梅</name> <age>25</age> </person> </persons> ``` 为了处理这种XML数据,我们需要创建一个Java类 `Person` 作为数据模型,该类对应XML中的 `<person>` 元素,包含了id、name和age属性: ```java public class Person { private Integer id; private String name; private Short age; // getters and setters public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Short getAge() { return age; } public void setAge(Short age) { this.age = age; } } ``` 接下来,我们将使用SAX解析器来逐行处理XML。SAX解析器是一个事件驱动的解析器,它不需要一次性加载整个XML文档到内存中,而是边读边处理,这样可以节省内存资源,特别适合于Android这样的移动设备。 在SAX解析过程中,我们需要实现 `ContentHandler` 接口中的若干回调方法,这些方法代表了XML解析的事件: 1. `startDocument()`:文档开始时调用,用于进行初始化或预处理操作。 2. `endDocument()`:文档结束时调用,通常用于清理工作。 3. `startElement(String uri, String localName, String qName, Attributes attributes)`:元素开始时调用,提供元素名称和属性信息。 4. `endElement(String uri, String localName, String qName)`:元素结束时调用,与 `startElement` 对应。 5. `characters(char ch[], int start, int length)`:处理元素文本内容。 例如,以下是一个简单的SAX解析器示例,它会在遇到 `<person>` 元素时创建 `Person` 对象并存储数据: ```java ContentHandler handler = new ContentHandler() { private Person currentPerson = null; private boolean inPersonTag = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) { if (qName.equals("person")) { inPersonTag = true; currentPerson = new Person(); } } @Override public void characters(char[] ch, int start, int length) { if (inPersonTag) { String text = new String(ch, start, length); if ("id".equals(qName)) { currentPerson.setId(Integer.parseInt(text)); } else if ("name".equals(qName)) { currentPerson.setName(text); } else if ("age".equals(qName)) { currentPerson.setAge(Short.parseShort(text)); } } } // 其他事件处理方法... }; // 创建SAX解析器并解析XML文件 XMLReader parser = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); parser.setContentHandler(handler); parser.parse(new InputSource(new File("itcast.xml"))); ``` 通过这种方式,SAX解析器会逐步处理XML文档,当遇到符合结构的标签时,调用对应的事件方法,从而构建出 `Person` 对象的实例。这种方法对于大型XML文件尤其有利,因为它避免了一次性加载整个文档到内存中,从而节省了宝贵的系统资源。