JAVA解析XML之SAX方式

SAX解析xml步骤

  通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory
  通过SAXParserFactory实例的newSAXParser()方法返回SAXParser实例parser
  创建一个类继承DefaultHandle,重写方法进行业务处理并创建这个类的实例handle

重写DefaultHandle类的方法

  startElement方法用来遍历xml文件的开始标签;

  endElement方法用来遍历xml文件的结束标签;

  startDocument方法用来标识解析开始;

  endDocument方法用来标识解析结束。

  characters方法用来获取text

  其中:参数qName 遍历到的元素的名称

     且同样会出现空白和换行的问题

下面直接上代码

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>JAVA编程思想</name>
<anthor>****</anthor>
<year>2000</year>
</book>
<book id="2">
<name>疯狂JAVA系列</name>
<anthor>李刚</anthor>
<price>89</price>
</book>
</bookstore>

books.xml

SAX.java
package pers.zww.xml.handler;

import javax.xml.stream.events.StartElement;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class SAXParserHandler extends DefaultHandler{
int bookIndex=0;
/*
* 解析XML元素
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//开始解析book元素的属性 if (qName.equals("book")) {
bookIndex++;
System.out.println("开始遍历第"+bookIndex+"本书"); // //已知book元素下的属性名称,根据属性名称获取属性值
// String value=attributes.getValue("id");
// System.out.println("book的属性值:"+value);
//未知book元素下的属性名称及个数
int num=attributes.getLength();
for (int i = 0; i < num; i++) {
System.out.print("book元素的第"+(i+1)+"个属性名:"+attributes.getQName(i));
System.out.println(" && 属性值:"+attributes.getValue(i)); }
}else if(!qName.equals("book")&&!qName.equals("bookstore")){
System.out.print("节点名:"+qName); }else { }
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
String val=new String(ch, start, length);
if (!val.trim().equals("")) {
System.out.println(" && 节点值:"+val);
}
} /*
* 用来遍历xml文件的结束标签
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
//是否针对一本书已经遍历结束
if (qName.equals("book")) {
System.out.println("=======================");
}
} /*
* 用来标志解析开始
*/
@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解析结束");
}
}

SAXParserHandler.java

SAX与DOM对比

  DOM解析原理:先把XML文件整个加载到内存中,在逐个解析;

  SAX解析原理:通过自己创建的Handler类,去逐个分析遇到的每一个节点;(节点分析是从最外层向里层逐个开始).

参考资料

  慕课网JessicaJiang老师视频教程点击链接

JAVA解析XML之SAX方式的更多相关文章

  1. JAVA解析XML之DOM方式

    JAVA解析XML之DOM方式 准备工作 创建DocumentBuilderFactory对象;    创建DocumentBuilder对象; 通过DocumentBuilder对象的parse方法 ...

  2. Java解析XML文件的方式

    在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到“解析xml文件”的需求.一般来讲,有基于DOM树和SAX的两种解析xml文件的方式 ...

  3. java解析XML几种方式

    第一种:DOM. DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序 ...

  4. python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  5. [转载] python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  6. JAVA解析XML的四种方式

    java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...

  7. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

    [目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...

  8. java解析xml的几种方式

    java解析xml的几种方式 DOM DOM的全称是Document ObjectModel,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称D ...

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

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

随机推荐

  1. Codeforces 898 A. Rounding

      A. Rounding   time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】

    B. Powers of Two   You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i,  ...

  3. .NET Core微服务 权限系统+工作流(一)权限系统

    一.前言 实际上权限系统老早之前我就在一直开发,大概在刚毕业没多久就想一个人写一个系统,断断续续一直坚持到现在,毕竟自己亲动手自写的系统才有收获,本篇仅介绍权限. 小小系统上不了台面,望各位大神勿喷. ...

  4. Copy Records From One Data Block To Another Data Block In Oracle Forms

    In this tutorial you will learn to copy the records from one data block to another data block on sam ...

  5. Android BroadcastReceiver 注册和反注册

    说起来这个问题很简单,只要注册和反注册成对出现就行,好像很多教材都是如此介绍.但实际开发中,对广播注册和反注册的时机把握还是很重要的. 关于广BroadcastReceiver注册和反注册时机,主要有 ...

  6. DedeCMS使用channelartlist循环,不能获取外部链接的解决办法

    Dede在制作下拉菜单时,可以使用channelartlist循环调用顶级栏目和子栏目,但该标签不能获取外部链接, 下拉菜单时一段代码搞定多个顶级栏目和子级栏目的同时输出. <div>   ...

  7. python super 的正确理解

    http://www.jb51.net/article/87807.htm super指的是MRO中的下一个类

  8. api 接口开发理论 在php中调用接口以及编写接口

    如: http://localhost/openUser.php?act=get_user_list&type=json 在这里openUser.php相当于一个接口,其中get_user_l ...

  9. SpringMVC:前台jsp页面和后台传值

    前台jsp页面和后台传值的几种方式: 不用SpringMVC自带的标签 前台---->后台,通过表单传递数据(): 1.jsp页面代码如下,  modelattribute 有没有都行 < ...

  10. linux 挂载相关

    mount命令的用法,以及技巧光盘镜像文件.移动硬盘.共享文件夹及U盘的方法. 一,挂接命令(mount) 挂接(mount)命令的使用方法. 命令格式:  mount [-t vfstype] [- ...