Android中使用sax解析xml文件的方法

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)就可以获取内容。

注意:一个标签之间的字符比较多时,或者字符串中包含有”\n”等特殊字符时,就会出现字符丢失的现象。遇到这种问题不要怀疑SAX不能解析标签中含有”\n”或字符比较多的XML。实际上是我们写的Handler是有问题的。SAX在解析XML时,当遇到一个标签中的内容比较多时,就会多次调用characters。所以我们在写Handler时要考虑到这种情况。就不会丢字符了。以下是一种解决方案:新建一个临时变量temp,在调用characters方法中用temp接收数据,在endElement方法中把临时变量temp赋值给目标变量,并给临时变量temp清空,避免出现脏数据,这样就可以解决sax读取XML时不能读取换行符号后面的内容的问题。

ljq.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>

实体类


代码如下:

package com.ljq.entity;

import java.io.Serializable;

/**
 * 实体类
 *
 * @author jiqinlin
 *
 */
@SuppressWarnings("serial")
public class Person implements Serializable{
    private Integer id;
    private String name;
    private Short age;

public Person() {
    }

public Person(String name, Short age) {
        super();
        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 Short getAge() {
        return age;
    }

public void setAge(Short age) {
        this.age = age;
    }

}

handle类


代码如下:

package com.ljq.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.ljq.entity.Person;

public class XMLContentHandler extends DefaultHandler {
    //临时变量,解决sax读取XML时不能读取换行符号后面的内容的问题;注意temp=""不能写成temp或temp=null,避免脏数据
    private String temp="";
    private String preTag;
    private Person person;
    private List<Person> persons;

@Override
    public void startDocument() throws SAXException {
        persons = new ArrayList<Person>();
    }

@Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (person!=null){
            String date = new String(ch,start,length);
            if ("name".equals(preTag)) {
                temp+=date;
            }else if ("age".equals(preTag)) {
                temp+=date;
            }
        }
    }

@Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        if ("person".equals(localName)) {
            person= new Person();
            person.setId(attributes.getIndex("id"));
        }
        preTag = localName;
    }

@Override
    public void endElement(String uri, String localName, String name) throws SAXException {
        if (person !=null && "name".equals(localName)) {
            person.setName(temp);
            temp="";
        }else if (person !=null && "age".equals(localName)) {
            person.setAge(new Short(temp));
            temp="";
        }else if (person !=null && "person".equals(localName)) {
            persons.add(person);
            person = null;
        }
        preTag = null;
    }

//getter...
    public List<Person> getPersons() {
        return persons;
    }

}

代码如下:

package com.ljq.service;

import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import com.ljq.entity.Person;

/**
 * sax解析工厂
 *
 * @author jiqinlin
 *
 */
public class SaxPersonService {
    // 业务层要对外抛出
    public static List<Person> readXML(InputStream inStream) throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser saxParser = spf.newSAXParser(); // 创建解析器
        // 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true
        // 表示开启命名空间特性
        // saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
        XMLContentHandler handler = new XMLContentHandler();
        saxParser.parse(inStream, handler);
        inStream.close();
        return handler.getPersons();
    }

}

测试类


代码如下:

package com.ljq.test;

import java.io.InputStream;
import java.util.List;

import com.ljq.entity.Person;
import com.ljq.service.SaxPersonService;

import android.test.AndroidTestCase;
import android.util.Log;

public class SaxPersonServiceTest extends AndroidTestCase{
    private final String TAG = "SaxPersonServiceTest";
    public void testReadXML() throws Exception{
        //ljq.xml放在src目录下
        InputStream inputStream = SaxPersonServiceTest.class.getClassLoader().getResourceAsStream("ljq.xml");
        List<Person> persons = SaxPersonService.readXML(inputStream);
        for(Person person : persons){
           Log.i(TAG, person.getId() + " : " + person.getName() + " : " + person.getAge());
        }
    }
}

运行结果

在android模拟器中,如果是中文字符会出现乱码,在真机上就不会出现这种情况

(0)

相关推荐

  • Android 中读取Excel文件实例详解

    Android 中读取Excel文件实例详解 最近有个需求需要在app内置数据,新来的产品扔给了我两个Excel表格就不管了(两个表格格式还不统一...),于是通过度娘等方法找到了Android中读取Excel表格文件的一种方法,记录一下. 闲话一下Excel中工作簿和工作表的区别: 工作簿中包含有工作表.工作簿可以由一张或多张工作表组成,一个工作簿就是一个EXCEL表格文件. 好了,开始读取表格文件吧. 前提 首先,我们假设需要读取的表格文件名字为test.xls, 位于assets根目录下.

  • 基于Android XML解析与保存的实现

    解析XML文件:在Android平台上可以使用SAX.DOM和Android附带的pull解析器解析XML文件:pull解析器提供了各种事件,使用parser.next()方法进入下一个元素并触发相应事件,pull解析器产生的事件是一个数字,可以通过switch对感兴趣的事件进行处理:通过paser.nextText()方法可以获取下一个Text类型的节点的值:http://xmlpull.org/xmlpull-website/impls.shtml; 读取XMLXmlPullParser p

  • Android操作Excel文件的功能实现

    Android中操作Excel文件导出报表时主要采用开源库jxl,最早用在java上,但也可用于Android.与之类似的POI,因为依赖库众多,所以只能用于java,而不能用于Android. 使用jxl需要在Android工程中导入jxl.jar包,jxl可以完成Excel的基本读写操作,其支持与不支持的情况如下: 1.jxl只支持Excel2003格式,不支持Excel2007格式.即支持xls文件,不支持xlsx文件. 2.jxl不支持直接修改excel文件,但可通过复制新文件覆盖原文件

  • Android应用读取Excel文件的方法

    本文实例讲述了Android应用读取Excel文件的方法.分享给大家供大家参考,具体如下: ReadExcel.java文件: public class ReadExcel extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

  • android通过jxl读excel存入sqlite3数据库

    复制代码 代码如下: package com.demo.day20140228; import java.io.File;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Statement; import jxl.Cell;import jxl.Sheet;import jx

  • android编程之xml文件读取和写入方法

    本文实例讲述了android编程之xml文件读取和写入方法.分享给大家供大家参考.具体分析如下: 一.环境: 主机:WIN8 开发环境:Eclipse 二.说明: 1.打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置 2.读取xml文件 三.xml文件格式: <?xml version="1.0" encoding="UTF-8" standalone="true"?> -<config> <titl

  • android操作XML的几种方法总结

    XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现.其标准型,可靠性,安全性......毋庸置疑.在android平台上,我们要想实现数据存储和数据交换,经常会使用到xml数据格式和xml文件. 小提示:android中存储数据一般有如下几种:SharedPreferences(参数化),XML文件,sqllite数据库,网络,ContentProvider(内容提供者)等. 在android中,操作xml文件,一般有几种方式:SAX操作,Pull操作,DOM操作等.

  • Android开发实现读取excel数据并保存为xml的方法

    本文实例讲述了Android开发实现读取excel数据并保存为xml的方法.分享给大家供大家参考,具体如下: 前阵子,公司请外面人翻译了一些android中values中的一些strings,然而保存的都是excel格式,如果单纯的将excel中的数据粘贴到指定的xml中的话,工作量非常的大,于是,自己写了个简单的demo,将excel中的数据读取并保存为xml对应的数据,下面的demo和图片展示: 1.数据保存在BeanValue中,包括key和value,方便后续数据读取 package c

  • Android中使用sax解析xml文件的方法

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用

  • Android编程使用sax解析xml数据的方法详解

    本文实例讲述了Android编程使用sax解析xml数据的方法.分享给大家供大家参考,具体如下: 随着技术的发展,现在的web已经和以前不同了.web已经逐渐像移动的方向倾斜,作为程序员的确应该拓展一下自己的知识层面.学习各方面的知识,今天就接着前几天的弄一下Android的xml解析,这次就使用sax的方式解析xml.下面就一步一步的来做吧. 1. 编写一个简单的xml <?xml version="1.0" encoding="UTF-8"?> &l

  • JAVA中4种解析XML文件的方法

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种: 1.DOM解析: 2.SAX解析: 3.JDOM解析: 4.DOM4J解析. 其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台. 针对以下XML文件,会对四种方式进行详细描述: <?xml version="

  • Android开发之DOM解析xml文件的方法

    本文实例讲述了Android中DOM解析xml文件的方法.分享给大家供大家参考,具体如下: 一.在assets文件中写xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李明</name> <age>30</age> </person> <pe

  • java中使用dom4j解析XML文件的方法教程

    前言 dom4j是一个java的XML api,性能优异.功能强大.易于使用.以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4j解析xml的具体操作.下面话不多说了,来一起看看详细的介绍吧 官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回List<Stude

  • Java中使用DOM和SAX解析XML文件的方法示例

    dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory dom4j是一个简单的开源库,用于处理XML. XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP. dom4j的使用 下载了dom4j项目之后,解压缩,将其jar包(我的当前版本叫做dom4j-1.6.1.jar)加入class path下面. (Properties->Java Build Pa

  • java中使用sax解析xml的解决方法

    在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析 Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档 Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档 本文主要讲解Sax解析,其余放在后面 Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取) 在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或

  • Ruby程序中创建和解析XML文件的方法

    使用builder创建XML builder安装方法: gem install builder require 'builder' x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1) #":target =>$stdout"参数:指示输出内 容将被写向标准输出控制台 #":indent =>1"参数:XML输出形式将被缩 进一个空格字符x.instruct! :xml, :

  • Android编程解析XML文件的方法详解【基于XmlPullParser】

    本文实例讲述了Android编程解析XML文件的方法.分享给大家供大家参考,具体如下: 前言 在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等. 用途 XML设计用了传送及携带数据信息,

  • jQuery+ajax读取并解析XML文件的方法

    本文实例讲述了jQuery+ajax读取并解析XML文件的方法.分享给大家供大家参考,具体如下: ajax.xml: <?xml version="1.0" encoding="UTF-8"?> <stulist> <student email="1@1.com"> <name>zhangsan</name> <id>1</id> </student>

随机推荐