xml解析之sax基础

SAX是一种事件驱动的XMLAPI,特点:

流的方式处理,遇到标签的时候不会记下标签

分析能即刻开始,并可随时结束

所占内存小,适合大型文档


示例xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person name="Claw" age="24">
        <weight>70kg</weight>
        <height>173cm</height>
    </person>
    <person name="Nancy" age="25">
        <weight>54kg</weight>
        <height>172cm</height>
    </person>
    <person name="dearcloud" age="27">
        <weight>55kg</weight>
        <height>172cm</height>
    </person>
</persons>


使用方法:扩展defaultHandler实现解析细节,重写主要的五个方法,实例代码如下:

package com.example.xmlparser;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxHandler extends DefaultHandler {

	HashMap<String,String> map;
	List<Map<String,String>> list;
	private String curTag;//当前标签
	private String curValue;//当前值
	private String nodeName;//当前节点名
	
	public SaxHandler(String node) {
		nodeName=node;
	}

	public List<Map<String,String>> getList() {
		return list;
	}

	@Override
	public void startDocument() throws SAXException {
		list=new ArrayList<Map<String,String>>();
		super.startDocument();
	}
	
	@Override
	public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
		if(qName.equals(nodeName))
			map=new HashMap<String,String>();
		if(attributes!=null&&map!=null)
			for(int i=0;i<attributes.getLength();i++){
				map.put(attributes.getQName(i),attributes.getValue(i));
			}
		curTag=qName;
		super.startElement(uri,localName,qName,attributes);
	}
	
	@Override
	public void characters(char[] ch,int start,int length)
			throws SAXException {
		if(curTag!=null&&map!=null){
			curValue=new String(ch,start,length);
			if(curValue!=null&&!curValue.trim().equals("")){
				map.put(curTag,curValue);
			}
		}
		super.characters(ch,length);
	}
	
	@Override
	public void endElement(String uri,String qName)
			throws SAXException {
		if(nodeName.equals(qName))
			list.add(map);
		super.endElement(uri,qName);
	}
	
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
	}
	
}

有了这个DefaultHandler就可以解析了,解析类的静态方法如下:

public static List<Map<String,String>> parseSax(InputStream is,String node){
		try {
			SAXParserFactory saxPF=SAXParserFactory.newInstance();
			SAXParser saxParser=saxPF.newSAXParser();
			SaxHandler saxHandler=new SaxHandler(node);
			saxParser.parse(is,saxHandler);
			return saxHandler.getList();
		} catch (Exception e) {
			Log.e("parse error",e.getMessage()+e.getLocalizedMessage());
			return null;
		}finally{
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
		
	}

如此,就可以用这个方法来解析xml文件了,使用示例如下:

String nodeName="person";
		InputStream is=getResources().openRawResource(R.raw.parsed);
		List<Map<String,String>> list=ParserUtil.parseSax(is,nodeName);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇