`
xglla_1129
  • 浏览: 10171 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Sax读XML

阅读更多

test.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="12">
		<name>thinking in java</name>
		<price>85.5</price>
	</book>
	<book id="15">
		<name>Spring in Action</name>
		<price>39.0</price>
	</book>
</books>
 

Book.java

public class Book {
	private int id;
	private String name;
	private float price;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	@Override
	public String toString(){
		return this.id+":"+this.name+":"+this.price;
	}
}
 

ParseTest.java

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


public class ParseTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		    SaxParseService sax = new SaxParseService();  
	        InputStream input = sax.getClass().getClassLoader().getResourceAsStream("test.xml");  
	        List<Book> books = sax.getBooks(input);  
	        for(Book book : books){  
	            System.out.println(book.toString()); 
	}
	}

}
 

SaxParseService.java

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

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

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


public class SaxParseService extends DefaultHandler{
	private List<Book> books = null;
	private Book book = null;
	private String preTag = null;//作用是记录解析时的上一个节点名称
	
	public List<Book> getBooks(InputStream xmlStream) throws Exception{
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		SaxParseService handler = new SaxParseService();
		parser.parse(xmlStream, handler);
		return handler.getBooks();
	}
	
	public List<Book> getBooks(){
		return books;
	}
	
	@Override
	public void startDocument() throws SAXException {
		books = new ArrayList<Book>();
	}

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		if("book".equals(qName)){
			book = new Book();
			book.setId(Integer.parseInt(attributes.getValue(0)));
		}
		preTag = qName;//将正在解析的节点名称赋给preTag
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if("book".equals(qName)){
			books.add(book);
			book = null;
		}
		preTag = null;/**当解析结束时置为空。这里很重要,例如,当图中画3的位置结束后,会调用这个方法
		,如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图
		中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方
		法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		if(preTag!=null){
			String content = new String(ch,start,length);
			if("name".equals(preTag)){
				book.setName(content);
			}else if("price".equals(preTag)){
				book.setPrice(Float.parseFloat(content));
			}
		}
	}
	
}
 
分享到:
评论

相关推荐

    dom和sax读XML源码范例

    用dom 和 sax 读XML文件,简单明了

    使用Sax技术读XML文档:SaxReaderXML.rar

    使用Sax技术读XML文档:SaxReaderXML.rar

    【下载】Android 使用SAX实现XML的读和写,使用XML与后台交互

    Android 使用SAX实现XML的读和写,使用XML与后台交互,博文地址:http://blog.csdn.net/diyangxia/article/details/43524267

    使用Sax方法读XML文档:SaxReaderXML.zip

    使用Sax方法读XML文档:SaxReaderXML.zip 详细代码展示例子

    QT中读取XML文件三种方式 的实例

    XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储(虽然近年来 JSON 盛行,大有取代 XML 的趋势,但是对于一些已有系统和架构,比如 WebService,由于历史原因,仍旧会继续...

    android入门级解析xml SAX

    SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调...

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

    SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调...

    JAVA读XML:sax,dom,jdom,dom4j的比较以及选择.doc

    JAVA读XML:sax,dom,jdom,dom4j的比较以及选择.doc

    sax2.0.1jar,xml文件解析

    sax2.0.1版本的jar包,可用于xml文件的解析。...SAX采用事件驱动`,也就是说,它并不是需要解析完整的文档,在按内容顺序解析文档的过程中,Sax会判断当前读到的字符是否符合XMl语法的某部分,如果符合就会触发事件。

    生成、解析xml的四种方式(dom,dom4j,sax,jdom)

    4种最主流、最全面、最详细的生成和解析xml的4种方式,包括Dom,Dom4j,Sax,JDom,读懂了绝对好用xml,非常好的入门项目,而且精心排版,逻辑清晰

    xml入门教程/xml入门教程

    3) HTML标记非常适合描述人类易读的可视化文本。 4) HTML定义了许多表现指令用以优化在浏览器中的显示。 5) 在HTML标记中,数据固有的结构丢失了。 6) HTML没有维持数据类型信息的完整性、约束、或实体间的其它...

    symbian_XML解析

    简要比较一下,DOM是将XML在内存中展开成一个树的模型,我们可以方便地访问它的每个子节点,可读可写。但是SAX呢?我们只能通过一个单向文本流去解析XML,在过程中有多个事件回调(开始某个元素处理、结束某个元素...

    xml增删改查for android

    android经常用sax-simple api for xml,但只能读取,于是一个用sax读,用dom增删改的例子就是这个,没在android上编译导入eclipse即可用,可以直接复制到android工程里面用

    在Python中处理XML的教程

    SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。 正常情况下,优先考虑SAX,因为DOM实在太占内存。 在Python中使用SAX解析XML非常简洁,通常我们关心的事件是start_element,end_...

    node-xmlstream-parser:基于sax的简单xml流解析器

    基于 sax 的简单 xml 流解析器。 将可读的 xml 流作为输入并发出解析后的对象作为结果。 这个模块的灵感来自 。 安装 npm install --save xmlstream-parser 用法 var streamParser = require ( '../lib/index' ) ...

    VC使用Cmarkup生成、解析xml资料

    当你不需要复杂的XML特性时,它避免你读大量的DOM和SAX文档。 如果你希望使用微软的MSXML,CMarkup工程中CmarkupMSXML类全面的演示了通过EDOM来使用MSXML,并且它是以C++ COM语法开始。 下面列出了CMarkup的特征: ...

    XML高级编程

    当你读完它们之后,你将理解XML是什么,如何筹划它的结构,如何用代码操作XML文档。虽然XML技巧资源已经相当丰富,但你仍需要首先打好坚实的基础。所以关键的主线包括: ?第2章:格式正规的XML ?第3章:文档类型定义...

    浅谈Android Studio 解析XML的三种方法

    SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。 缺点是不能倒退。 DOM(Document Object Model) 是一种...

Global site tag (gtag.js) - Google Analytics