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)的更多相关文章

  1. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

  2. xml文件读取到数据库

    xml文件读取到数据库   第一步,导包 c3p0,dom4j,jaxen,MySQL-connector 第二步  xml文件,config文件 第三步 javabean 第四步 c3p0的工具类 ...

  3. php xml 文件读取 XMLReader

    php xml 文件读取 <?php /** $xmlString = '<xml> <persons count="10"> <person ...

  4. javascript读取xml文件读取节点数据的例子

    分享下用javascript读取xml文件读取节点数据方法. 读取的节点数据,还有一种情况是读取节点属性数据. <head> <title></title> < ...

  5. java实现xml文件读取并保存到对象

    首先浅聊一下解析xml的四种方式: 1.DOM方式:有缺点但是这个缺点却也是他的优点.下面详细介绍: 以树形的层次结构组织节点或信息片断集合,可以获得同一个文档中的多处不同数据.使用起来简单. 优点是 ...

  6. JAVA xml 流方式读取。数据挖掘大文件预处理。

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  7. java操作XML文件--读取内容

          先把问题贴出来:编写一个可以解析xml及修改xml内容的工具类       由于我以前做过Android应用程序开发,之前也解析过xml文件,所以,这道题不是很难,这篇文章我先解决第一个问 ...

  8. Java XML文件解析

    四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 蓝色字体内容由上一篇博文中补充进来的,写作风格比较好,大家有兴趣可以去查看原文 众所周知,现在解析XML的方法越来越多,但主流的方法也就四 ...

  9. 对xml文件的sax解析(增删改查)之二

    先上代码: package com.saxparsetest; //the filename of this file is :saxparse.java import javax.xml.parse ...

随机推荐

  1. golang struct 定义中json``解析说明

    在代码学习过程中,发现struct定义中可以包含`json:"name"`的声明,所以在网上找了一些资料研究了一下 package main import ( "enco ...

  2. Lua string文件类型判断和内容解析

    [1]文件名称类型判断和解析 local fileName = "shanxi201904npsdr1_200000.zip" print("len : " . ...

  3. 录音整理文字工具otranscribe简介

    网址: http://otranscribe.com/ 首先载入音频文件,支持 mp3, ogg, webm, wav (HTML5 无需将文件上传至服务器,可保护隐私),然后就可以边听边整理了. 通 ...

  4. memcache 的使用

    基础知识 memcached 是一个开源项目,旨在利用多个服务器内的多余 RAM 来充当一个可存放经常被访问信息的内存缓存.这里的关键是使用了术语缓存:memcached 为加载自他处的信息提供的是内 ...

  5. python 基础 9.4 游标

    一. 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.       用户可以用SQL 语句逐一从游标中获取记录,并赋值给主变量,交由python 进一步处理,一组主变量一次只能存放一条 ...

  6. sudo npm install -g cnpm --registry=https://registry.npm.taobao.org

  7. 【BZOJ2119】股市的预测 后缀数组+分块

    [BZOJ2119]股市的预测 Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工具,它通过一张时间与股票的价位的函数图像清晰 ...

  8. centos 时区正确,时间不对

    centos6.5 里面 时区是 Asia/Shanghai ,但是 时间还是不对,在网上收集了如下做法:好像恢复了~~ (主要过程是:  查看各种设置,然后设置时间,最后更新本机时间,最后保持与时间 ...

  9. 2个canvas叠加运用(时钟例子)

    最近在学习canvas,http://corehtml5canvas.com/code-live/,主要的学习方式就是通过上面的一些例子来学习canvas的一些用法.但是我发现,这里的例子,只要can ...

  10. HDU - 1176 免费馅饼 【DP】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路 因为刚开始的起点是固定的 但是终点不是固定的 所以我们可以从终点往起点推 dp[i][j] ...