java--xml文件读取(SAX)
SAX解析原理:
使用Handler去逐个分析遇到的每一个节点
SAX方式解析步奏:
创建xml解析需要的handler(parser.parse(file,handler))
package com.imooc_xml.sax.handler; import java.util.ArrayList; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; import com.imooc_xml.sax.entity.Book; public class SAXParserHandler extends DefaultHandler { //使用全局变量可以使本类的各个方法通用,联系
int bookIndex = 0 ;
String value = null;
Book book = null;
private ArrayList<Book> bookList = new ArrayList<Book>();
public ArrayList<Book> getBookList() {
return bookList;
}
/**
* 用来遍历xml文件的开始标签
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
////解析xml文件的节点属性,只有book节点有属性
if(qName.equals("book")){
book = new Book();
bookIndex++;
//已知book的属性名
// attributes.getValue("id");
//不知book元素的属性名和个数
int num = attributes.getLength();
for(int i=0;i<num;i++){
//book元素的第i+1个属性名
attributes.getQName(i);
attributes.getValue(i);
if(attributes.getQName(i).equals("id")){
book.setId(attributes.getValue(i));
}
}
}else if (!qName.equals("book")&&!qName.equals("bookstore")){
//节点名
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 (qName.equals("book")){
bookList.add(book);
book = null;
System.out.println("结束遍历第"+bookIndex+"本书");
}else if(qName.equals("name")){
book.setName(value);
}else if(qName.equals("author")){
book.setAuthor(value);
}else if(qName.equals("year")){
book.setYear(value);
}else if(qName.equals("price")){
book.setPrice(value);
}else if(qName.equals("language")){
book.setLanguage(value);
} }
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
//ch是节点之间的文本内容
value = new String(ch, start, length);
//判断空格和换行
if(!value.trim().equals("")){
System.out.println(value);
}
}
/**
* 用来标志解析开始
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来标志解析结束
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析结束");
}
}
创建hanlder类

SAX解析准备工作:
package com.imooc_xml.sax.test; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.imooc_xml.sax.handler.SAXParserHandler; public class SAXTest { public static void main(String[] args) { //通过SAXParserFactory的静态newInstance()方法获取SAXParserFactory的实例factory
SAXParserFactory factory = SAXParserFactory.newInstance(); try {
//通过factory获取SAXParser实例
SAXParser parser = factory.newSAXParser();
//创建一个handler对象
SAXParserHandler handler = new SAXParserHandler();
parser.parse("xml/books.xml", handler);
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
使用SAX解析xml文件的节点属性:
//只有book节点有属性
if(qName.equals("book")){
//已知book的属性名
// attributes.getValue("id");
//不知book元素的属性名和个数‘
int num = attributes.getLength();
for(int i=0;i<num;i++){
//book元素的第i+1个属性名
attributes.getQName(i);
attributes.getValue(i);
}
}
使用SAX解析xml文件的节点值
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
//ch是节点之间的文本内容
value = new String(ch, start, length);
//判断空格和换行
if(!value.trim().equals("")){
System.out.println(value);
}
}
在Java中保留xml数据的结构
public class Book {
private String id;
private String name;
private String author;
private String year;
private String price;
private String language;
获取对象集合:
handler.getBookList().size();
for(Book book:handler.getBookList()){
System.out.println(book.getId());
....
}
java--xml文件读取(SAX)的更多相关文章
- JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)
1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...
- xml文件读取到数据库
xml文件读取到数据库 第一步,导包 c3p0,dom4j,jaxen,MySQL-connector 第二步 xml文件,config文件 第三步 javabean 第四步 c3p0的工具类 ...
- php xml 文件读取 XMLReader
php xml 文件读取 <?php /** $xmlString = '<xml> <persons count="10"> <person ...
- javascript读取xml文件读取节点数据的例子
分享下用javascript读取xml文件读取节点数据方法. 读取的节点数据,还有一种情况是读取节点属性数据. <head> <title></title> < ...
- java实现xml文件读取并保存到对象
首先浅聊一下解析xml的四种方式: 1.DOM方式:有缺点但是这个缺点却也是他的优点.下面详细介绍: 以树形的层次结构组织节点或信息片断集合,可以获得同一个文档中的多处不同数据.使用起来简单. 优点是 ...
- JAVA xml 流方式读取。数据挖掘大文件预处理。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...
- java操作XML文件--读取内容
先把问题贴出来:编写一个可以解析xml及修改xml内容的工具类 由于我以前做过Android应用程序开发,之前也解析过xml文件,所以,这道题不是很难,这篇文章我先解决第一个问 ...
- Java XML文件解析
四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 蓝色字体内容由上一篇博文中补充进来的,写作风格比较好,大家有兴趣可以去查看原文 众所周知,现在解析XML的方法越来越多,但主流的方法也就四 ...
- 对xml文件的sax解析(增删改查)之二
先上代码: package com.saxparsetest; //the filename of this file is :saxparse.java import javax.xml.parse ...
随机推荐
- Tkinter 控件详细介绍
Tkinter 控件详细介绍 1.Button 按钮.类似标签,但提供额外的功能,例如鼠标掠过.按下.释放以及键盘操作/事件 2.Canvas 画布.提供绘图功能(直线.椭圆.多边形.矩形) ;可以包 ...
- 第5章 网页下载器和urllib2模块
网页下载器:将互联网上URL对应的网页下载到本地的工具 通过网页下载器将互联网中的url网页,存储到本地或内存字符串 python有哪几种网页下载器? 1.urllib2 python官方基础模块 ...
- Laravel手记:执行route:cache时报LogicException
laravel5的路由支持缓存.需要执行以下命令: php artisan route:cache 执行完毕后,报出以下错误: Route cache cleared! [LogicException ...
- 安装mingw后,在命令窗体编译c文件
1.编译test.cpp文件 #include<iostream> int main(int argc,char **argv) { std::cout<<"he ...
- 纯JS实现动态时间
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Django模板系统(非常详细)(后台数据如何展示在前台)
前面的章节我们看到如何在视图中返回HTML,但是HTML是硬编码在Python代码中的这会导致几个问题:1,显然,任何页面的改动会牵扯到Python代码的改动网站的设计改动会比Python代码改动更频 ...
- [ZJOI2006]三色二叉树
[ZJOI2006]三色二叉树 BZOJ luogu 分3种颜色讨论转移一下 #include<bits/stdc++.h> using namespace std; const int ...
- 转。git 乌龟的使用安装
TortoiseGit 简称 tgit, 中文名海龟Git. 海龟Git只支持神器 Windows 系统, 有一个前辈海龟SVN, TortoiseSVN和TortoiseGit都是非常优秀的开源的版 ...
- [转载]Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- python学习-4-类的使用
class Animal: def __init__(self, name): # Constructor of the class self.name = name def talk(self): ...