文档章节

<Java 读取XML文件>学习日志(二)——SAX方式解析

WhuBit
 WhuBit
发布于 2016/11/03 23:09
字数 466
阅读 7
收藏 0

一,创建测试类

import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;

public class SaxTest {
	/*
	 * 使用SAX方式解析XML文件
	 * 2016/11/3
	 */
	
	public static void saxTest() throws ParserConfigurationException, SAXException, IOException{
		SAXParserFactory spf=SAXParserFactory.newInstance();
		SAXParser sp=spf.newSAXParser();
		bookHandler bh=new bookHandler();
		sp.parse("books.xml", bh);	
		for(Books book:bh.bookList){
	    	System.out.println(book.toString());
	    }
	}
	
	public static void main(String[] args) throws Exception{
		saxTest();
	}

}

二,创建handler对象

import java.util.ArrayList;

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

public class bookHandler extends DefaultHandler {
	int bookindex=0;
	String str=null;
	Books book;
	ArrayList<Books> bookList=new ArrayList<>();

	//标识解析结束
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
		System.out.println("解析结束");
	}

	//标志解析开始
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
		System.out.println("解析开始");
	}


	//遍历XML文件的结束标签
	@Override
	public void endElement(String url, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(url, localName, qName);
		if(qName.equals("book")){//!!!注意:此处不为"\book"
			System.out.println("第"+(bookindex)+"本书遍历结束");
			bookList.add(book);
		}
		else if(qName.equals("name"))
			book.setName(str);
		else if(qName.equals("auther"))
			book.setAuthor(str);
		else if(qName.equals("year"))
			book.setYear(str);
		else if(qName.equals("language"))
			book.setLanguage(str);
		else if(qName.equals("price"))
			book.setPrice(str);	
	}

	//用来遍历XML文件的开始标签
	@Override
	public void startElement(String url, String localName, String qName, Attributes attr) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(url, localName, qName, attr);
		if(qName.equals("book")){
			//创建Books对象
			book=new Books();
			bookindex++;
			System.out.println("开始遍历"+(bookindex)+"本书");
//			System.out.println(attr.getValue("id"));//已知属性名获取属性值
			
			//不知道属性名和属性值时
			for(int i=0;i<attr.getLength();i++){
				System.out.println("第"+(i+1)+"个属性名:"+attr.getQName(i)+"  属性值:"+attr.getValue(i));
			if(attr.getQName(i).equals("id")){
				book.setId(attr.getValue(i));
			}
			}
		}
		else if(!qName.equals("book")&&!qName.equals("bookstore")){
//			System.out.println("节点名"+qName+"   节点值:"+attr.getValue(qName));!!!错误:这样无法输出节点值,attr是当前节点的属性值集合
			System.out.print("节点名:"+qName);
		}
	}
	
	//处理XML文件两节点间的文本内容
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);
		str=new String(ch,start,length);
		//!!!不能直接打印,会将空格和换行构成的节点也打印出来了,修正如下
		if(!str.trim().equals("")){
		    System.out.println(" 节点值:"+str);
		}
	}
	
	
}

© 著作权归作者所有

WhuBit
粉丝 1
博文 12
码字总数 4328
作品 0
武汉
私信 提问
Android读写XML(上)

注明:本文转自http://www.moandroid.com. 原文地址: http://www.moandroid.com/?p=508 XML 经常用作 Internet 上的一种数据格式,其文件格式想必大家都比较清楚,在这里我结合Android平台,...

晨曦之光
2012/03/01
391
0
Tomcat的配置解析工具Apache Commons Digester

开篇  最近开始看Tomcat的源码,在catalina. createStartDigester方法中,Tomcat开发人员采用了Digester来读取conf/server.xml文件,以前读取xml文件一般采用Dom4j和SAX,因此对Digester比较...

晴天哥
2018/10/10
0
0
Android 创建与解析XML(一)—— 概述

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。 XML,相关有DOM、SAX、JDOM、DOM4J、Xerce...

长平狐
2013/01/06
159
0
java解析xml文件四种方式介绍、性能比较和基本使用方法

一、基本介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特...

Candy_Desire
2014/08/20
0
0
XML解析(DOM、SAX、JDOM和DOM4J)

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SA...

拷贝忍者卡卡习
2017/01/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
5
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
6
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0
聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部