<?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 SAX(Simple API for XML) 如果你只想读取并显示整个XML文档,那么SAX是很好的选择,因为它提供了比DOM更简单的接口,并且它不需要将整个XML文档一次性读入内存,这样便可以用来读取...
本文将重点讨论SAX解析器,并通过描述中的"test_sax.rar"压缩包中的示例,讲解如何使用SAX解析器在Visual Studio 20(VS20)环境下读取XML文档。 SAX解析器是一种基于事件驱动的解析方式,它不会一次性加载整个XML...
标题“sax解析xml本地读取xml”指的是使用SAX解析器来读取和解析存储在本地文件系统中的XML文件。这种方式适用于处理那些无法一次性加载到内存中的大型XML文档,或者对于内存有限的环境。 SAX解析的基本工作原理...
SAX解析器在读取XML文档时,会触发一系列的事件,如开始文档、结束文档、开始元素、结束元素等。开发者需要定义一个ContentHandler类来处理这些事件,当解析器遇到相应的XML元素时,就会调用ContentHandler中的方法...
SAX解析器不同于DOM(Document Object Model)解析器,DOM会将整个XML文档加载到内存中形成一个树形结构,而SAX则是逐行扫描XML文档,当遇到特定的元素、属性或事件时,触发相应的回调函数。这种按需处理的方式使得...
使用SAX2方法读取XML文件的基本步骤如下: 1. **包含必要的头文件**:首先,在C++程序中需要包含`xercesc/sax2/SAX2XMLReader.hpp`和`xercesc/sax/DefaultHandler.hpp`等头文件,以使用Xerces-C++库中的SAX2解析器...
本篇文章将深入探讨如何使用JAXP的SAX解析器来读取XML内容。 首先,了解SAX解析器的工作原理。SAX解析器逐行读取XML文件,当遇到XML文档的各个元素、属性等结构时,会触发相应的事件回调,如开始文档、结束文档、...
Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...
本篇文章将深入探讨如何使用SAX技术读取XML文档,以及SaxReaderXML.rar压缩包中的相关内容。 首先,SAX解析器的工作方式是逐行扫描XML文档,当遇到元素、属性、文本等内容时,会触发相应的事件回调函数。这种解析...
在处理XML数据时,SAX(Simple API for XML)是一种常见的解析器,它采用事件驱动模型,以流式方式读取XML文档,降低了内存占用,适用于处理大型XML文件。本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 ...
标题“使用Sax方法读XML文档:SaxReaderXML.zip”指出,这个压缩包包含了一个关于如何使用SAX解析器来读取XML文档的示例。SAX解析器的工作方式是,当解析到XML文档中的某个元素、属性或文本时,会触发相应的事件,...
Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...
DOM解析器将整个XML文档加载到内存中,创建一个树形结构的文档对象模型,允许开发者通过节点层级遍历和操作XML数据。DOM解析的特点包括: 1. 完整性:DOM解析器一次性加载整个XML文档,因此可以随时访问任何部分的...
2. **SAX解析**:SAX是一种事件驱动的解析方式,它逐行读取XML文档,遇到元素、属性等时触发相应的事件处理器。这种方式节省内存,适合处理大型XML文件。"sax_xml sax_解析_xml"标签表明了本压缩包包含使用SAX解析...
SAX解析器是一种基于事件驱动的解析模型,它读取XML文档,遇到每个元素、属性、文本等时,都会触发相应的事件回调函数。这种方式使得解析器不需要一次性加载整个XML文档到内存,因此对于大文件,SAX解析具有高效、低...
DOM解析器将整个XML文档加载到内存中,构建一个树形结构,即DOM树。每个XML元素、属性、文本等都被表示为树中的节点。通过DOM,开发者可以随时访问任何部分的XML文档,因为整个文档都在内存中,所以操作灵活,但缺点...
SAX是一种基于事件驱动的解析器,它不会一次性加载整个XML文档到内存,而是逐行读取,当遇到某个元素、属性或其他结构时,会触发相应的事件处理器方法。这种方式适用于处理大型XML文档,因为它占用的内存较小。然而...
SAX解析器以流式的方式读取XML文档,当遇到文档的各个元素时,会触发相应的事件,如开始文档、开始元素、结束元素、字符数据等。程序员通过实现SAX解析器的回调接口来处理这些事件,从而解析XML内容。这种方式使得...