XML文档的SAX解析

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<books> <!--根节点--><!--这里的空白也算一个节点,所以books共有5个子节点-->
	<book id="book1" w="wwwww">
		<name><a>AAAAAA</a>bookName1</name>
		<price>10.0</price>
	</book>
	<book id="book2">
		<name>bookName2</name>
		<author>bookAuthor2</author>
	</book>
</books>

测试类:

package com.zhang.xml.sax;

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

/*
 * sax解析是逐行扫描文档,一边扫描一边解析。
 * 需要创建一个org.xml.sax.helpers.DefaultHandler的继承类
 */
public class SaxParse {

	public static void main(String[] args) throws Exception {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();

		SaxParser handler = new SaxParser();
		parser.parse("books.xml", handler);

		System.out.println(handler.getBooks());
	}

}
org.xml.sax.helpers.DefaultHandler的子类
package com.zhang.xml.sax;

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.zhang.xml.bean.Book;

public class SaxParser extends DefaultHandler {

	private int index = 0;
	private List<Book> books = new ArrayList<Book>();
	private Book book = null;
	private String value = null;

	public List<Book> getBooks() {
		return books;
	}

	/**
	 * 用来标识解析开始
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		System.out.println("----------开始解析文档----------");
	}

	/**
	 * 用来标识解析结束
	 */
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
		System.out.println("----------结束文档解析----------");
	}

	/**
	 * 解析一个xml元素
	 * 每遇到一个元素的开始标签就调用一次该方法
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		if("book".equals(qName)){
			index++;
			System.out.println("---开始解析第" + index + "个book标签---");
			book = new Book();

			int size = attributes.getLength();
			for(int i=0; i<size; i++) {
				System.out.print("第" + (i + 1) + "个属性名: " + attributes.getQName(i));
				System.out.println("-->属性值:" + attributes.getValue(i));

				if("id".equals(attributes.getQName(i))) {
					book.setId(attributes.getValue(i));
				}
			}
		} else {
			System.out.println("遇到" + qName + "开始标签");
		}

	}

	/**
	 * 结束一个解析xml元素
	 * 每遇到一个元素的结束标签就调用一次该方法
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		if("book".equals(qName)){
			System.out.println("---结束解析第" + index + "个book标签---");

			books.add(book);
			book = null;
		} else if("name".equals(qName)) {
			book.setName(value);
		} else if("price".equals(qName)) {
			book.setPrice(value);
		} else if("author".equals(qName)) {
			book.setAuthor(value);
		} else {
			System.out.println("遇到" + qName + "结束标签");
		}
	}

	/*
	 *	ch中存放着xml文档中所有的元素的值,每遇到一个元素的值,就调用一次该方法
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		value = new String(ch, start, length);
		if (!value.trim().equals("")) {	 //	排除空白位置 
			System.out.println("-->value值:" + value);
		}

	}
}

结果:

----------开始解析文档----------
遇到books开始标签
---开始解析第1个book标签---
第1个属性名: id-->属性值:book1
第2个属性名: w-->属性值:wwwww
遇到name开始标签
遇到a开始标签
-->value值:AAAAAA
遇到a结束标签
-->value值:bookName1
遇到price开始标签
-->value值:10.0
---结束解析第1个book标签---
---开始解析第2个book标签---
第1个属性名: id-->属性值:book2
遇到name开始标签
-->value值:bookName2
遇到author开始标签
-->value值:bookAuthor2
---结束解析第2个book标签---
遇到books结束标签
----------结束文档解析----------
[Book [id=book1, name=bookName1, price=10.0, author=null], Book [id=book2, name=bookName2, price=null, author=bookAuthor2]]
时间: 2024-10-10 04:02:36

XML文档的SAX解析的相关文章

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

一:JAXP使用SAX方式解析XML文件 1:dom解析与sax解析异同点 2:sax解析特点 二:代码案例 1:xml文件 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <students> 3 <student> 4 <name sid="111">李四</name> 5 <age>

使用JAXP对XML文档进行DOM解析

一.XML解析方式分为两种:dom和sax dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式. sax:(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它. dom和sax解析方法的区别: dom:对文档CRUD(增删改查)比较方便,缺点:占用内存比较大(将xml文件全部读入内存). sax:占用内存较少,解析速度快(从上往下读一行解析一行).缺点:只适合读取,不适合CRU

Java高级特性 第14节 解析XML文档(2) - SAX 技术

一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口. 1. SAX解析原理: 加载一点,读取一点,处理一点.对内存要求比较低. SAX解析工具内置在jdk中:org.xml.sax.*

源生API解析XML文档与dom4j解析XML文档

一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可以存储数据. 1.XML语言书写的注意事项 1.XML标签命名自定义[推荐英文],标签名中不能包含空格 2.XML空格和换行都表示数据,严格区分大小写 3.XML中特殊字符表示的数据需要使用特殊字符编码和HTML一样 4.CDATA区中的数据不会被识别为语法 <![CDATA[王天霸<>&l

使用Dom4j对XML文档创建与解析

创建XML文件: public class Dom4jCreateXml { public void testCreatXml() { //创建文档对象 Document document = DocumentHelper.createDocument(); //创建跟节点 Element root = document.addElement("students"); //根据根节点创建子节点 Element stu01 = root.addElement("student&

XML文档的DOM解析

xml的DOM解析: <?xml version="1.0" encoding="UTF-8"?> <books> <!--根节点--><!--这里的空白也算一个节点,所以books共有5个子节点--> <book id="book1" w="wwwww"> <name><a>AAAAAA</a>bookName1</name

javaweb学习总结十一(JAX对XML文档进行DOM解析)

一:将内存中写好的xml文件读取到硬盘上 二:DOM方式对xml文件进行增删改查 1:添加节点(默认是在最后的子节点后面添加) 1 @Test 2 // 向元素中添加节点<version>1.0</version> 3 public void test5() throws Exception { 4 Document doc = getDoc(); 5 Node node = doc.getElementsByTagName("book").item(0); 6

DOM和SAX是应用中操纵XML文档的区别

DOM和SAX是应用中操纵XML文档的两种主要API,它们分别解释如下: DOM,即Document Object Model,中文叫文档对象模型.DOM是W3C定义的标准文档对象模型,是一个与操作系统和编程语言无关的.用于内存存储和操作层次化文档的模型.当按 照DOM模型解析XML文档时,就会在内存中构造一个对应的DOM树,它可以用于不同 节点之间的遍历.然而,在遍历之前必须先完成DOM树的构造.因此, 在处理规模较大的XML文档时就很耗内存,占用资源较多.尤其是只需要操作文档中一小部分时效率

dom4j 解析 XML文档截录

dom4j 是一种解析 XML 文档的开放源代码 XML 框架.本文介绍如何使用包含在 dom4j 中的解析器创建并修改 XML 文档. dom4j API 包含一个解析 XML 文档的工具.本文中将使用这个解析器创建一个示例 XML 文档.清单 1 显示了这个示例 XML 文档,catalog.xml. 清单 1. 示例 XML 文档(catalog.xml) <?xml version="1.0" encoding="UTF-8"?> <cat