`

用 SAX 读取一个 XML 文档(二)

XML 
阅读更多
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<学生名册>
	<学生 学号="1">
		<姓名>张三</姓名>
		<!-- haha -->
		<性别>男</性别>
		<年龄>20</年龄>
	</学生>
	<学生 学号="2">
		<姓名>李四</姓名>
		<性别>女</性别>
		<年龄>19</年龄>
	</学生>
	<学生 学号="3">
		<姓名>王五</姓名>
		<性别>男</性别>
		<年龄>21</年龄>
	</学生>
</学生名册>



package com.syh.xml.sax;

import java.io.File;
import java.util.Stack;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXResult;

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

/**
 * 用 SAX 解析 XML 文档
 * @author Administrator
 *
 */

public class SaxTest2 {

	public static void main(String[] args) throws Exception, SAXException {
		
		//step1 : 获得 SAX 解析器工厂实例
		SAXParserFactory factory = SAXParserFactory.newInstance() ;
		
		//step2 : 获得 SAX 解析器实例
		SAXParser parser = factory.newSAXParser() ;
		
		//step3 : 开始进行解析 ,需要传递一个解析对象--> File 对象, 和一个实现了 DefaultHandler 的对象
		parser.parse(new File("student.xml"), new MyHandler2()) ;
	
		
	}
	
}

/**
 * 一般重写下面的三种方法
 * @author Administrator
 *
 */

class MyHandler2 extends DefaultHandler {
	
	//使用了Java提供的栈!其特点是:后进先出的原则
	private Stack<String> stack = new Stack<String>() ;
	
	private String name ;
	
	private String gender ;
	
	private String age ;
	
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		
		//放到栈顶 qName 就是元素的名字-->标签的名字,例如:<PERSON>中的PERSON
		stack.push(qName) ; //进栈
		
		//对元素中属性进行遍历 
		for(int i = 0 ; i < attributes.getLength() ; i ++) {
			
			//获得第  i 个属性的名字
			String attrName = attributes.getQName(i) ;
			String attrValue = attributes.getValue(i) ;
			
			System.out.println(attrName + " = " + attrValue);
			
		}
		
	}
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
	
		String tag = stack.peek() ; // 拿出栈的内容,但是不出栈
		
		/**
		 * 为什么要进行下面的判断呢?
		 * 因为 SAX 在解析过程当中,并不知道这个元素到底是什么!它仅仅知道这个是一个元素
		 */
		
		if("姓名".equals(tag)) {
			name = new String(ch, start, length) ;
		} else if ("性别".equals(tag)) {
			gender = new String(ch, start, length) ;
		} else if ("年龄".equals(tag)) {
			age = new String(ch, start, length) ;
		}
	
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
	
		//表示该元素已经解析完毕,需要从栈中弹出
		stack.pop() ;  //出栈
		
		if("学生".equals(qName)) {
			
			System.out.println("姓名:" + name);
			System.out.println("性别:" + gender);
			System.out.println("年龄:" + age);
			
			System.out.println();
		}
		
	}
	
	
	
}




下面是在控制台上输出的结果:

学号 = 1
姓名:张三
性别:男
年龄:20

学号 = 2
姓名:李四
性别:女
年龄:19

学号 = 3
姓名:王五
性别:男
年龄:21


分享到:
评论

相关推荐

    QT使用SAX读取xml高效-快速.rar

    QT使用SAX读取xml高效-快速.rar SAX(Simple API for XML) 如果你只想读取并显示整个XML文档,那么SAX是很好的选择,因为它提供了比DOM更简单的接口,并且它不需要将整个XML文档一次性读入内存,这样便可以用来读取...

    test_sax.rar_XML SAX vs20_sax_sax xml_读取XML文档

    本文将重点讨论SAX解析器,并通过描述中的"test_sax.rar"压缩包中的示例,讲解如何使用SAX解析器在Visual Studio 20(VS20)环境下读取XML文档。 SAX解析器是一种基于事件驱动的解析方式,它不会一次性加载整个XML...

    sax解析xml本地读取xml

    标题“sax解析xml本地读取xml”指的是使用SAX解析器来读取和解析存储在本地文件系统中的XML文件。这种方式适用于处理那些无法一次性加载到内存中的大型XML文档,或者对于内存有限的环境。 SAX解析的基本工作原理...

    Java解析XML文档(二):sax读取xml文件导出excel

    SAX解析器在读取XML文档时,会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等。开发者需要定义一个ContentHandler类来处理这些事件,当解析器遇到相应的XML元素时,就会调用ContentHandler中的方法...

    使用SAX读取XML文件

    SAX解析器不同于DOM(Document Object Model)解析器,DOM会将整个XML文档加载到内存中形成一个树形结构,而SAX则是逐行扫描XML文档,当遇到特定的元素、属性或事件时,触发相应的回调函数。这种按需处理的方式使得...

    SAX2方法读取XML文件

    使用SAX2方法读取XML文件的基本步骤如下: 1. **包含必要的头文件**:首先,在C++程序中需要包含`xercesc/sax2/SAX2XMLReader.hpp`和`xercesc/sax/DefaultHandler.hpp`等头文件,以使用Xerces-C++库中的SAX2解析器...

    使用JAXP之SAX读取XML内容

    本篇文章将深入探讨如何使用JAXP的SAX解析器来读取XML内容。 首先,了解SAX解析器的工作原理。SAX解析器逐行读取XML文件,当遇到XML文档的各个元素、属性等结构时,会触发相应的事件回调,如开始文档、结束文档、...

    Java SAX解析Xml文档Demo

    Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...

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

    本篇文章将深入探讨如何使用SAX技术读取XML文档,以及SaxReaderXML.rar压缩包中的相关内容。 首先,SAX解析器的工作方式是逐行扫描XML文档,当遇到元素、属性、文本等内容时,会触发相应的事件回调函数。这种解析...

    Servlet利用SAX解析XML文档

    在处理XML数据时,SAX(Simple API for XML)是一种常见的解析器,它采用事件驱动模型,以流式方式读取XML文档,降低了内存占用,适用于处理大型XML文件。本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 ...

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

    标题“使用Sax方法读XML文档:SaxReaderXML.zip”指出,这个压缩包包含了一个关于如何使用SAX解析器来读取XML文档的示例。SAX解析器的工作方式是,当解析到XML文档中的某个元素、属性或文本时,会触发相应的事件,...

    javaSAX方式解析xml文档

    Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...

    DOM和SAX解析XML文档

    DOM解析器将整个XML文档加载到内存中,创建一个树形结构的文档对象模型,允许开发者通过节点层级遍历和操作XML数据。DOM解析的特点包括: 1. 完整性:DOM解析器一次性加载整个XML文档,因此可以随时访问任何部分的...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    2. **SAX解析**:SAX是一种事件驱动的解析方式,它逐行读取XML文档,遇到元素、属性等时触发相应的事件处理器。这种方式节省内存,适合处理大型XML文件。"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析...

    SAX对xml文档进行解析

    SAX解析器是一种基于事件驱动的解析模型,它读取XML文档,遇到每个元素、属性、文本等时,都会触发相应的事件回调函数。这种方式使得解析器不需要一次性加载整个XML文档到内存,因此对于大文件,SAX解析具有高效、低...

    dom and sax 读取xml

    DOM解析器将整个XML文档加载到内存中,构建一个树形结构,即DOM树。每个XML元素、属性、文本等都被表示为树中的节点。通过DOM,开发者可以随时访问任何部分的XML文档,因为整个文档都在内存中,所以操作灵活,但缺点...

    Java使用sax、dom、dom4j解析xml文档

    SAX是一种基于事件驱动的解析器,它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到某个元素、属性或其他结构时,会触发相应的事件处理器方法。这种方式适用于处理大型XML文档,因为它占用的内存较小。然而...

    Sax解析XML文件解析

    SAX解析器以流式的方式读取XML文档,当遇到文档的各个元素时,会触发相应的事件,如开始文档、开始元素、结束元素、字符数据等。程序员通过实现SAX解析器的回调接口来处理这些事件,从而解析XML内容。这种方式使得...

Global site tag (gtag.js) - Google Analytics