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解析相关知识点(网页知识)的更多相关文章
-
xml解析中的sax解析
title: xml解析中的sax解析 tags: grammar_cjkRuby: true --- SAXPasser 类: parser(File file, DefaultHandler ha ...
-
java基础57 css样式、选择器和css定位(网页知识)
本文知识点(目录): 1.CSS样式 2.选择器 3.CSS定位 1.CSS样式 1.html 在一个网页中负责的是一个页面的结构 2.css(层叠样式表)在一个页面中负责了一个页面 ...
-
java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)
本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容 1.xml解析的含义 2.XML的解析方式 3.xml的解析工具 4.XML的解析原理 5.实例 6 ...
-
java基础之XML
目录 java基础之XML 1. XML解析概述 2. DOM4J介绍 2.1 常用包 2.2 内置元素 2.2 Element类 2.3 Attribute类 2.4 常用操作 3. 代码演示 3. ...
-
Java基础语法(8)-数组中的常见排序算法
title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...
-
2.2 使用 JAXP 对XML文档进行SAX解析
使用JAXP 对 XML文档进行 SAX解析: public class Demo1 { /** * 使用JAXP对XML文档进行SAX解析 * @throws Exception * @throws ...
-
Java中实现SAX解析xml文件到MySQL数据库
大致步骤: 1.Java bean 2.DBHelper.java 3.重写DefaultHandler中的方法:MyHander.java 4.循环写数据库:SAXParserDemo.java ① ...
-
java基础篇---XML解析(一)
XML是可扩展标记语言 在XML文件中由于更多的是描述信息的内容,所以在得到一个xml文档后应该利用程序安装其中元素的定义名称去除对应的内容,这样的操作称为XML解析. 在XML解析中W3C定义SAX ...
-
Android笔记(四十七) Android中的数据存储——XML(三)SAX解析
SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SA ...
随机推荐
-
C/C++ 双精度double 数据相加出错缺陷解释
不知道有没有人和我一样遇到过这样一个问题,请看下面代码. #include<iostream> using namespace std; int main(){ double a=2.3, ...
-
VIM 常用错误解决
1.option ‘omnifunc’ is not set 错误: vim7下Omni completion默认情况下是没有开启的,有时候自定义的vimrc文件会实现自动补齐,例如vim-autoc ...
-
[原创]cocos2d-x研习录-第二阶 概念类之导演类(CCDirector)
CCDirector类是游戏的组织和控制中心(总指挥),它控制着主屏幕的显示.场景的切换和显示,以及游戏的开始.结束和暂停.它的继承关系图如下: CCDirector继承自基类CCObject, ...
-
Android GridView 添加 网格线解决办法
在使用 GridView 网格布局时,默认情况下 GridView 是没有网格线的,但是有些时候我们需要让GridView显示分割线,怎么办呢?查了不少资料,找到了一种为GridView添加网格线的 ...
-
Python 开发个人微信号在运维开发中的使用
一.主题:Python 开发个人微信号在运维开发中的使用 二.内容: 企业公众号 介绍开发微信公众号的后台逻辑,包括服务器验证逻辑.用户认证逻辑 个人微信号 面对企业微信的种种限制,可以使用 Itch ...
-
return的作用
(1)终止函数的执行. (2)返回到调用的地方. (3)返回值.
-
Revit API创建房间
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] ); ...
-
Linux网络管理-相关笔记【自用】
ISO/OSI七层模型应用层 APDU 应用层协议数据单元 越靠近用户表示层 PPDU 表示层协议数据单元会话层 SPDU 会话协 ...
-
The Builder pattern simulates named optional parameters(Java)
the Builder pattern is a good choice when designing classes whose constructors or static factories w ...
-
python下载网页上公开数据集
URL很简单,数据集分散开在一个URL页面上,单个用手下载很慢,这样可以用python辅助下载: 问题:很多国外的数据集,收到网络波动的影响很大,最好可以添加一个如果失败就继续请求的逻辑,这里还没有实 ...