andorid读取xml文件内容方法有三种 sax dom pull,其中 pull是android自带的
1.先认识一下xml文件中的些术语
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
</persons>
xml中的标签和内容都可以叫做节点,其中的persons person name age 这些都叫做元素(element).而像李明 25 这些值叫做文本节点.那么有个问题 中<persons>到<person>之间的是什么,什么都没有? 答案是他也是节点,是文本节点,你会说他里面什么都没有啊,错了,它有回车和空格.这个在sax解析xml中你debug一下就会发现.回车和空格(或者是tab)是会被读取出来的.id是属性.
2.sax
sax是采用事件驱动,就是说他不需要完全读完xml文件,他是读到一个节点就解析一个节点是否符合xml语法,如果符合就调用相对应的方法其实就是回调方法,并且没有记忆功能.下面提到的这些方法都是在ContentHander()接口中的方法.
startDocumnet() :当开始解析xml文件的声明的时候就会触发这个事件, 可以做一些初始化的工作
startElement() 当开始解析元素的开始标签的时候,就会触发这个事件
characters() 当读到文本元素的时候要触发这个事件.
endElement() 当读到结束标签的时候 就会触发这个事件
sax就是这样按照顺序来解析的.
3.sax读取xml文件举例
3-1创建一个项目 ReadXml
3-2将xml文件拷贝到根目录下.
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
</persons>
可以看出这个xml文件中有一个可以抽象出来的对象 就是person 属性有id name age
那么我们就建立一个bean
3-3:创建bean
package com.leequer.service.demo;
/**
* <person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
* @author leequer
*
* xml文件对应的bean
*/
public class Person {
private Integer id;
private String name;
private int age;
public Person ()
{}
public Person (String name ,int age)
{
this.name = name;
this.age = age;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.id+",name "+this.name+" age "+this.age+"\n";
}
}
3-4:遵循mvc的架构,我们建立一个service用来读取xml
package com.leequer.service;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;
import com.leequer.service.demo.Person;
public class SaxReadxml {
public static List<Person> readXml(InputStream inStream)throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance(); // 初始化sax解析器
SAXParser sp = spf.newSAXParser(); // 创建sax解析器
//XMLReader xr = sp.getXMLReader();// 创建xml解析器
XMLContentHandler handler = new XMLContentHandler();
sp.parse(inStream, handler);
return handler.getPersons();
}
}
sp.parse(inStream, handler);
这句可以看出xml文件是以流的形式传进来的,参数handler就是回调函数的实例,当sax解析器解析xml文件的时候当遇到符合xml的内容就会去handle类中调用对应的上面提到的方法.那我们建立这个XMLContentHandler 就要求这个类要实现ContentHandler()这个接口,但是这个接口中有很多需要实现的方法.sax提供了一个DefaultHandler接口 只要实现这个接口中你感兴趣的方法就可以了.
3-5:创建XMLContentHandler 并完成读取时的事件的实现 注意看注释
package com.leequer.service;
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.leequer.service.demo.Person;
public class XMLContentHandler extends DefaultHandler {
private List<Person> persons;
private Person person;
private String tempString;
private static final String NAMESTRING = "name";
private static final String AGESTRING = "age";
private static final String PERSONSTRING = "person";
private static final String IDSTRING = "id";
public List<Person> getPersons() {
return persons;
}
/**
* sax 解析文件不带记忆,只读取 对xml文件中的 <person id="23"> <name>李明</name> <age>23</age>
* </person> <person id="22"> <name>李量</name> <age>25</age> </person> 这部分感兴趣
* 那么这部分包含了person这个节点元素的开始和结尾,那么就要有startElement和endElement
* 这两个方法;还有text的节点元素,(就是像节点之间的回车和空格还有标签中的像李明这样的文字都是文本节点 元素
* (text节点元素)那么要解析文本节点元素就要用到characters 这个方法来获取信息。)
*/
/**
* 要开始读取xml文件的时候调用的方法
* 初始化persons
*/
@Override
public void startDocument() throws SAXException {
//这里做list的初始化工作
persons = new ArrayList<Person>();
}
/**
* sax 读取到文本节点的时候调用了这个方法
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (person != null) {
String valueString = new String(ch, start, length);
if (NAMESTRING.equals(tempString)) {
// 如果当前解析到的节点是name 就要将name中的文本节点元素的值得到
person.setName(valueString);
} else if (AGESTRING.equals(tempString)) {
person.setAge(new Integer(valueString).intValue());
}
}
}
/**
* sax 读取到元素节点的时候用到这个方法;
*/
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// 先判断读到的元素是否是person
if (PERSONSTRING.equals(localName)) {
// 如果读到的是person这个元素 就要保存起来,保存在我们创建的那个person的类中 所以我们要new一个person类
person = new Person();
// attributes是属性。
person.setId(new Integer(attributes.getValue(IDSTRING)));
}
tempString = localName;
}
/**
* 这个方法是每次遇到结束的标签都会执行的 并不是只遇到最后的结尾才调用
*
* 读取完毕遇到person'的结尾 就将封装好的一个personbean保存到list中 并且清空person对象
*
*/
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if(PERSONSTRING.equals(localName)&&person!=null)
{
persons.add(person);
person = null;
}
tempString = null;
}
}
3-6:写个测试类来实验 将xml文件装载入 然后读取
package com.leequer.readxml;
/**
* 测试类
*/
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import com.leequer.service.SaxReadxml;
import com.leequer.service.demo.Person;
import android.test.AndroidTestCase;
import android.util.Log;
public class SaxReadxmlTest extends AndroidTestCase {
private String PERSONSTRING = "ObjectPerson";
public void testReadXml() throws Exception
{//类装载器
InputStream inputStream = SaxReadxmlTest.class.getClassLoader().getResourceAsStream("NewFile.xml");
List <Person> personsList = SaxReadxml.readXml(inputStream);
for (Iterator iterator = personsList.iterator(); iterator.hasNext();) {
Person person = (Person) iterator.next();
Log.i(PERSONSTRING, person.toString());
}
}
}
本文是从他处转载而来,原文链接
http://leequer.iteye.com/blog/653148
分享到:
相关推荐
以下是一个简单的SAX解析XML文件的Android实例源码: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxExample extends ...
以下是一个使用SAX解析XML文件的基本步骤: 1. **创建解析器**: 首先,我们需要创建一个SAX解析器实例。在Java中,这通常通过`SAXParserFactory`类完成。设置解析器属性,然后调用`newSAXParser()`方法获取`...
本示例"android sax解析xml模板源码"提供了一个使用SAX解析XML的实例,方便开发者直接导入到自己的项目中使用。 SAX解析XML的基本流程如下: 1. **创建解析器**:在Android中,我们需要使用`SAXParserFactory`来...
以下是使用SAX解析XML文件的步骤: 1. 引入依赖:在Android项目中,通常需要添加`xmlpull`库,它包含了SAX解析器。可以在`build.gradle`文件中添加依赖: ``` implementation 'xpp3:xpp3:1.1.4c' ``` 2. 创建...
下面是一个SAX解析XML的示例(有点长,因为详细注解了SAX事件处理的所有方法),SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。下面的例子可能...
本篇将详细讲解如何在Android环境中使用SAX解析XML。 1. **SAX解析的基本原理** SAX解析器读取XML文档时,遇到每个元素、属性、文本等都会触发相应的事件,开发者需要注册事件处理器来处理这些事件。这种方式适合...
下面详细介绍Android中使用SAX解析XML的关键步骤和相关知识点: 1. 引入库:在Android项目中,SAX解析器已经内置于`org.xml.sax`包中,无需额外导入库。 2. 创建事件处理器:你需要创建一个类来实现`...
"SAX解析String类型XML字符串"就是一种高效且节省内存的方式去解析XML数据,特别是当XML文件较大时,SAX解析器优于DOM解析器,因为它不需要一次性加载整个XML到内存中。下面我们将深入探讨这一主题。 首先,XML...
- `xmlSAXPaserDemo`可能是一个包含示例代码的Android项目,用于演示如何实际使用SAX解析XML文件。 - 项目中可能包括网络请求模块、SAX解析器处理类以及展示解析结果的UI部分。 通过以上步骤,开发者可以在...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在移动应用开发,如Android中,解析XML文件是常见的任务。本篇将详细讲解Android中三种主要的XML解析方式:SAX(Simple API for XML)...
本文将详细介绍如何在Android中使用SAX解析XML。 首先,理解SAX解析的基本原理。SAX解析器在读取XML文档时,会触发一系列的事件,例如开始文档、结束文档、开始元素、结束元素等。开发者需要创建一个实现了`...
本教程将详细介绍如何在Android环境下解析XML文件,以"ReadXMLDemo"为例,展示具体步骤和关键知识点。 首先,XML(eXtensible Markup Language)是一种自定义标记语言,它的结构清晰,易于读写,适合于数据交换和...
本文将深入探讨如何在Android环境中使用SAX(Simple API for XML)解析XML文件。SAX是一种事件驱动的解析器,它在读取XML文档时触发一系列事件,开发者可以注册事件处理器来处理这些事件,从而实现对XML数据的高效、...
在Android中使用SAX解析XML,主要涉及以下几个关键步骤: 1. **创建ContentHandler**:ContentHandler是SAX解析的核心,它定义了一系列的回调方法,用于处理XML文档的各种事件。比如`startDocument()`会在解析开始...
下面将详细介绍SAX解析XML文件的基本原理、工作流程以及在Android环境下如何实现。 **SAX解析的基本原理:** SAX解析器在读取XML文档时会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素、字符数据等...
总结起来,Android中使用SAX解析XML的优点在于其低内存占用和高效的性能,适合处理大型XML文档。通过创建自定义的ContentHandler并重写其方法,我们可以根据XML的结构来解析和处理数据。不过,SAX解析不适用于需要...
本篇文章将深入探讨三种在Android中解析XML的方法:DOM(文档对象模型)、Pull(拉取解析器)和SAX(简单API for XML),并且会特别强调如何识别文件编码。 首先,DOM解析是将整个XML文件加载到内存中形成一个树形...
首先,让我们了解一下SAX解析XML的基本流程。当SAX解析器读取XML文件时,它会按照文档顺序触发一系列事件,这些事件对应于ContentHandler接口中定义的方法。以下是ContentHandler接口的一些关键方法: 1. `start...
### Android中使用SAX解析XML 1. **引入库**:在Android项目中,SAX解析器已经内置在`org.xml.sax`包中,无需额外导入库。 2. **创建ContentHandler**:创建一个实现了`org.xml.sax.ContentHandler`接口的类,重写...
本教程将详细讲解如何在Android中使用SAX解析XML。 首先,要使用SAX解析XML,我们需要理解其工作原理。SAX解析器会逐个读取XML文档的元素,每当遇到文档的开始、结束、文本等事件时,就会触发相应的回调方法。...