1、SAX解析工具

SAX解析工具:是Sun公司提供的,内置JDK中。org.xml.sax.*         点击查看: DOM解析相关知识;以及DOM和SAX解析的原理(区别)

2、SAX解析的核心API

SAXParser类:用于读取和解析xml文件对象
    parse(File f, DefaultHandler dh)方法----->解析xml文件
        参数一:file:表示读取xml文件
        参数二:DefaultHandler:SAX事件处理程序.使用DefaultHandler的子类

DefaultHandler类:
    void  startDocument():在读文档开始时调用
    void  endDocument():在读文档结束时调用
    void  startElement(String uri, String localName, String qName, Attributes attributes):读到开始标签时调用
    void  endElement(String uri, String localName, String qName):读到结束标签时调用
    void  characters(char[] ch, int start, int length):读到文本内容时调用

3、SAX解析原理和DOM解析原理的区别

DOM解析原理 SAX解析原理
1、一次性加载xml文档,不适合大容量的读取文件
2、DOM解析可以任意进行增删改
3、DOM解析任意的读取任何位置的数据,甚至往回读
4、DOM解析面向对象的编程方法(Node,Element,Attribute),java开发者编码比较简单
1、加载一点,读取一点,处理一点。适合大容量文件读取
2、SAX解析只能读取
3、SAX解析只能冲上往下,按顺序的读取,不能回读
4、SAX解析基于事件的编程方法.java开发编码相对复杂

4、实例

例1:用SAX解析读取xml文档

 package com.shore.sax;

 import java.io.File;

 import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class Demo1 {
public static void main(String[] args) throws Exception, SAXException {
//1.创建SAXParser对象
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
//2.调用parser方法
/*
* 参数一:xml文档
* 参数二:DefaultHandler的子类
* */
parser.parse(new File("./src/contact.xml"),new MyDefaultHandler());
}
}
 package com.shore.sax;

 import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class MyDefaultHandler extends DefaultHandler {
/*
* 开始文档时调用
* */
@Override
public void startDocument() throws SAXException {
System.out.println("startDocument");
}
/*
* 开始标签时调用
* @param qName:表示开始标签的标签名
* @param attributes:表示开始标签内的包含的属性列表
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("startElement"+"----->"+qName);
}
/*
* 结束标签时调用
* @param qName:结束标签的标签名
* */
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("endElement"+"----->"+qName);
}
/*
*读到文本内容时调用
* @param ch:表示当前读取到的所有文本内容
* @param start:表示当前文本内容的开始位置
* @param length:表示当前文本内容长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String content=new String(ch,start,length);//获取文本内容
System.out.println("characters"+"----->"+content);
}
/*
* 结束文档时调用
* */
@Override
public void endDocument() throws SAXException {
System.out.println("endDocument");
}
}

contact.xml文档

 <?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001" sex="男">
<name>张三</name>
<age>18</age>
<phone>15779593710</phone>
<email>872855221@qq.com</email>
<qq>872855221</qq>
</contact>
</contactList>

结果图

附录1

 package com.shore.code;

 import java.io.File;
import java.io.IOException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; /**
* @author DSHORE / 2018-9-6
*
*/
/*
* 读取contact.xml文件,完整输出文档内容
* */
public class Demo6 {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//1.创建SAXParser
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
//读取xml1文件
MyDefaultHander2 hander=new MyDefaultHander2();
parser.parse(new File("./src/contact.xml"),hander);
String content=hander.getContent();
System.out.println(content);
}
}

MyDefaultHander2.java

 package com.shore.code;

 import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; /**
* @author DSHORE / 2018-9-6
*
*/
public class MyDefaultHander2 extends DefaultHandler{
//存储xml文档信息
private StringBuffer sb=new StringBuffer(); public String getContent(){//作用:把读到的所有内容toString一下(变成字符串的形式)
return sb.toString();
}
//开始标签
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
sb.append("<"+qName);
if(attributes !=null){
for (int i = 0; i < attributes.getLength(); i++) {
//得到属性名称
String attrName=attributes.getQName(i);
String attrValue=attributes.getValue(i);
sb.append(" "+attrName+"=\""+attrValue+"\"");
}
}
sb.append(">");
}
//文本内容
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String content=new String(ch,start,length);//获取标签中的文本内容
sb.append(content);
}
//结束标签
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
sb.append("</"+qName+">");
}
}

contact.xml文件

 <?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001" sex="男">
<name>张三</name>
<age>18</age>
<phone>15779593710</phone>
<email>872855221@qq.com</email>
<qq>872855221</qq>
</contact>
<contact id="002">
<name>李四</name>
<age>20</age>
<phone>1314580</phone>
<email>12580666@qq.com</email>
<qq>832144529</qq>
</contact>
</contactList>

结果图

附录2

 package com.shore.code;

 import java.io.File;
import java.util.List; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; /**
* @author DSHORE / 2018-9-6
*
*/
//需求:存储所有联系人信息
public class Demo7 {
public static void main(String[] args) throws Exception, SAXException {
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
MyDefaultHander3 hander=new MyDefaultHander3();
parser.parse(new File("./src/contact.xml"),hander);
List<Contact> list=hander.getList(); for (Contact contact : list) {
System.out.println(contact);
}
}
}

MyDefaultHander3.java文件

 package com.shore.code;

 import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; /**
* @author DSHORE / 2018-9-6
*
*/
public class MyDefaultHander3 extends DefaultHandler{
//存储所有联系人对象
private List<Contact> list=new ArrayList<Contact>();
private Contact contact;
private String curTag; public List<Contact> getList(){
return list;//把设置进去集合里的值 返回给调用者
}
//读到开始标签 调用
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
curTag=qName;
//System.out.println(curTag);//返回值:xml文件中的所有标签名
if("contact".equals(qName)){
contact=new Contact();
//设置id
contact.setId(attributes.getValue("id"));
}
}
//读到文本内容时 调用
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//当前文本内容
String content=new String(ch,start, length);
if("name".equals(curTag)){
contact.setName(content);
}
if("age".equals(curTag)){
contact.setAge(content);
}
if("phone".equals(curTag)){
contact.setPhone(content);
}
if("email".equals(curTag)){
contact.setEmail(content);
}
if("qq".equals(curTag)){
contact.setQq(content);
}
}
//读到结束标签时 调用
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
curTag = null;//作用:防止xml文件 标签中的值被设置两次(被覆盖)。
/* 解析:如果不要这句代码,输出结果除了id有值,其他标签全部没值。
* 比如contact.xml文件的name标签,读到该标签时,curTag=name,被设置进去的值是“张三”,因为<name>张三</name>标签后面的空白处也是文本内容;
* (同一行)所以还会往后解析,这时curTag还是等于name,所以空白也被设置进去了(空白文本替换掉了张三);所以name、age、phone、email、qq等标签 全部没值。
**/
if("contact".equals(qName)){
list.add(contact);
}
}
}

contact.xml文件用的是 和附录1一样

contact.java文件

 package com.shore.code;

 /**
* @author DSHORE / 2018-9-6
*
*/
public class Contact {
private String id;
private String name;
private String age;
private String phone;
private String email;
private String qq; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
@Override
public String toString() {
return "Contact [id=" + id + ", name=" + name + ", age=" + age
+ ", phone=" + phone + ", email=" + email + ", qq=" + qq + "]";
}
}

结果图

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/9576457.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

java基础74 XML解析中的SAX解析相关知识点(网页知识)的更多相关文章

  1. xml解析中的sax解析

    title: xml解析中的sax解析 tags: grammar_cjkRuby: true --- SAXPasser 类: parser(File file, DefaultHandler ha ...

  2. java基础57 css样式、选择器和css定位(网页知识)

    本文知识点(目录): 1.CSS样式    2.选择器    3.CSS定位 1.CSS样式 1.html 在一个网页中负责的是一个页面的结构    2.css(层叠样式表)在一个页面中负责了一个页面 ...

  3. java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)

    本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容 1.xml解析的含义    2.XML的解析方式    3.xml的解析工具    4.XML的解析原理    5.实例    6 ...

  4. java基础之XML

    目录 java基础之XML 1. XML解析概述 2. DOM4J介绍 2.1 常用包 2.2 内置元素 2.2 Element类 2.3 Attribute类 2.4 常用操作 3. 代码演示 3. ...

  5. Java基础语法(8)-数组中的常见排序算法

    title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...

  6. 2.2 使用 JAXP 对XML文档进行SAX解析

    使用JAXP 对 XML文档进行 SAX解析: public class Demo1 { /** * 使用JAXP对XML文档进行SAX解析 * @throws Exception * @throws ...

  7. Java中实现SAX解析xml文件到MySQL数据库

    大致步骤: 1.Java bean 2.DBHelper.java 3.重写DefaultHandler中的方法:MyHander.java 4.循环写数据库:SAXParserDemo.java ① ...

  8. java基础篇---XML解析(一)

    XML是可扩展标记语言 在XML文件中由于更多的是描述信息的内容,所以在得到一个xml文档后应该利用程序安装其中元素的定义名称去除对应的内容,这样的操作称为XML解析. 在XML解析中W3C定义SAX ...

  9. Android笔记(四十七) Android中的数据存储——XML(三)SAX解析

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SA ...

随机推荐

  1. Ansible基础概述

    一.Ansible简介 Ansible基于Python语言实现,由paramiko和PyYAML两个关键模块构建.Ansible的编排引擎可以出色地完成配置管理,流程控制,资源部署等多方面工作.Ans ...

  2. UVA.10791 Minimum Sum LCM (唯一分解定理)

    UVA.10791 Minimum Sum LCM (唯一分解定理) 题意分析 也是利用唯一分解定理,但是要注意,分解的时候要循环(sqrt(num+1))次,并要对最后的num结果进行判断. 代码总 ...

  3. #define后面只带有一个标识符

    经常看到有#define后只有一个标识符的语句,这样是做宏开关用 宏定义编译前会被编译器进行替换,只有一个标识符的情况,如果在代码里使用了这个标识符,会被替换为空,也就是相当于没加. 用来做编译开关的 ...

  4. All flavors must now belong to a named flavor dimension

    FAQ: All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/ ...

  5. Codeforces 901C. Bipartite Segments(思维题)

    擦..没看见简单环..已经想的七七八八了,就差一步 显然我们只要知道一个点最远可以向后扩展到第几个点是二分图,我们就可以很容易地回答每一个询问了,但是怎么求出这个呢. 没有偶数简单环,相当于只有奇数简 ...

  6. 解题:USACO13NOV Empty Stalls

    题面 当然可以用并查集做,不过你需要按秩合并+路径压缩(才可能过),因为数据范围十分不友好...... USACO的官方做法更为优秀.首先题目告诉我们牛们加入的前后顺序不影响结果(自己证明也很容易,显 ...

  7. bzoj3473: 字符串 && bzoj3277串

    3473: 字符串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 121  Solved: 53[Submit][Status][Discuss] D ...

  8. 深度学习网络层之 Pooling

    pooling 是仿照人的视觉系统进行降维(降采样),用更高层的抽象表示图像特征,这一部分内容从Hubel&wiesel视觉神经研究到Fukushima提出,再到LeCun的LeNet5首次采 ...

  9. Chapter 3(线性表)

    1.单链表 //单链表代码,手打纯手工 //***********************************link.h*********************************** # ...

  10. Python模拟登录cnblogs

    Python利用requests.Session对象模拟浏览器登录cnblogs request.Session对行可以跨请求的保持cookie,非常方便的用于模拟登录. cnblogs登录页面分析: ...