在android中,解析xml有三种方法,SAX ,DOM,还有android自身提供的PULL解析器。
SAX方法介绍
SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:
startDocument()
当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()
和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName, String qName, Attributes atts)
当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。
endElement(String uri, String localName, String name)
这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。
characters(char[] ch, int start, int length)
这个方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
例子:
1.person.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>
2.定义javabean保存这些属性
public class Person {
private Integer id;
private String name;
private Short 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 Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
}
3.
public class PersonContentHandler extends DefaultHandler {
private List<Person> persons = null;
private Person currentPerson;
private String tagName = null;//当前解析的元素标签
public List<Person> getPersons() {
return persons;
}
/*
* 接收文档的开始的通知。
*/
@Override public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}
/*
* 接收字符数据的通知。
*/
@Override public void characters(char[] ch, int start, int length) throws SAXException {
if(tagName!=null){
String data = new String(ch, start, length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}else if(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
/*
* 接收元素开始的通知。
* 参数意义如下:
* namespaceURI:元素的命名空间
* localName :元素的本地名称(不带前缀)
* qName :元素的限定名(带前缀)
* atts :元素的属性集合
*/
@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if(localName.equals("person")){
currentPerson = new Person();
currentPerson.setId(Integer.parseInt(atts.getValue("id")));
}
this.tagName = localName;
}
/*
* 接收文档的结尾的通知。
* 参数意义如下:
* uri :元素的命名空间
* localName :元素的本地名称(不带前缀)
* name :元素的限定名(带前缀)
*
*/
@Override public void endElement(String uri, String localName, String name) throws SAXException {
if(localName.equals("person")){
persons.add(currentPerson);
currentPerson = null;
}
this.tagName = null;
}
}
4 使用
public static List<Person> readXML(InputStream inStream) {
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser(); //创建解析器
//设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性
saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
PersonContentHandler handler = new PersonContentHandler();
saxParser.parse(inStream, handler);
inStream.close();
return handler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
分享到:
相关推荐
本教程将详细介绍如何在Android环境下解析XML文件,以"ReadXMLDemo"为例,展示具体步骤和关键知识点。 首先,XML(eXtensible Markup Language)是一种自定义标记语言,它的结构清晰,易于读写,适合于数据交换和...
本文将深入探讨如何使用SAX、DOM和Pull解析器解析XML文件,以及如何生成XML文件。我们将同时展示Java和Kotlin两种语言的实现方法。 一、SAX解析XML文件 SAX(Simple API for XML)是一种事件驱动的解析器,它不会一...
本篇将深入探讨Android中解析XML文件的方法,以及如何通过示例代码`ReadXmlConfigFile`来实现这一过程。 ### XML解析器类型 Android提供了多种解析XML的方式,主要包括以下几种: 1. **DOM解析器**:Document ...
通过老罗的Android视频教程,开发者可以学习到如何有效地解析XML文件,提升在Android开发中的数据处理能力。不论是DOM、SAX还是Pull解析,每种方法都有其适用场景,理解并熟练掌握这些技术,将对Android应用开发...
在Android开发中,XML文件广泛用于存储数据、配置和布局信息。DOM(Document Object Model)解析是处理XML文件的一种常用方法。DOM解析器将整个XML文档加载到内存中,形成一个树形结构,允许开发者通过节点操作来...
在Android开发中,解析XML文件是一项常见的需求。本文将详细介绍如何使用SAX(Simple API for XML)解析器来解析XML文件,并通过一个具体的实例来进行说明。 #### 二、SAX解析器简介 SAX是一种基于事件驱动的XML...
在Android开发中,XML(eXtensible Markup Language)是一种常用的数据交换格式,尤其是在网络通信中,用于传输数据。本文将深入探讨如何在Android中使用Pull解析器来处理XML文件,这是一种高效且节省资源的方式。 ...
在Android开发中,XML文件解析是一项重要的技能,用于读取和操作XML数据。XML(Extensible Markup Language)是一种结构化数据格式,常用于存储和传输数据。本篇文章将重点讲解如何在Android中使用SAX(Simple API ...
在Android开发中,XML文件常用于存储数据,如配置文件、布局文件等。Pull解析器是一种轻量级的解析方式,适用于处理XML流,尤其在内存有限的移动设备上更为适用。本文将深入探讨如何在Android中使用Pull解析器解析...
在Android中,我们通常使用`javax.xml.parsers.DocumentBuilderFactory`来创建解析器,并通过`DocumentBuilder`实例解析XML文件。下面是一个简单的示例: ```java DocumentBuilderFactory factory = ...
在Android开发中,XML文件操作是一项基础且重要的技能,它涉及到资源管理、数据持久化以及配置文件等多个方面。本项目主要关注的是XML的创建和使用Pull解析器来解析XML,这是Android系统中处理XML数据的一种高效方法...
该文章详细介绍了在Android环境下如何使用SAX和PULL解析XML,包括代码示例和步骤说明,对于初学者来说非常有帮助。 最后,压缩包中的"Weather"文件很可能是示例的天气预报XML数据。通过实际解析这个文件,你可以更...
在Android开发中,XML文件广泛用于存储数据、配置和布局信息。XML(eXtensible Markup Language)是一种可扩展标记语言,它具有结构清晰、易于读写的特点,非常适合于应用程序间的数据交换。本教程将深入讲解如何在...
在Android开发中,生成XML文件通常涉及到资源管理、布局动态生成以及数据持久化等方面的知识。这篇博客"android解析生成xml文件"可能详细介绍了如何在Android环境中处理XML数据,包括读取、解析和生成XML文件的过程...
本篇将详细介绍如何在Eclipse中解析XML文件,以及相关的Android XML解析技术。 首先,Android SDK提供了两种主要的XML解析方法:DOM(Document Object Model)和SAX(Simple API for XML)。DOM解析器将整个XML文件...
本篇将重点讲解如何使用SAX(Simple API for XML)解析XML文件,这是一种事件驱动的解析方式,非常适合处理大体积的XML文件,因为它不会一次性加载整个文件到内存中,从而节省了资源。 首先,了解SAX解析的基本原理...
《老罗Android开发视频教程》中关于“android解析xml文件”的部分,主要涵盖了如何在Android系统中处理XML数据,包括基础的DOM解析、SAX解析以及更高效的Pull解析器。 一、DOM解析 DOM(Document Object Model)...
解析XML文件,我们通常有两种方法:SAX(Simple API for XML)和Pull解析。本示例中使用了Pull解析,这是一种事件驱动的解析方式,它不需要整个XML文档加载到内存,而是按需读取,降低了内存消耗,适合处理大文件。 ...
6. 最后,调用`parse`方法开始解析XML文件。在Android环境中,可能需要从Assets目录或网络中读取XML文件。 例如,以下是一个简单的`MySAXHandler`示例: ```java public class MySAXHandler extends ...
SAX解析适合大型XML文件和复杂结构,而PULL解析则适用于小型XML文件和简单结构。在提供的`SAXParseDemo`项目中,你可以找到具体的SAX解析实现,通过阅读和理解代码,可以更好地掌握这两种解析方法的使用。 总之,...