java基础74 XML解析中的SAX解析相关知识点(网页知识)
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 ...
随机推荐
- More than one file was found with OS independent path 'META-INF/LICENSE' | Error:Could not read \build\intermediates\typedefs.txt (系统找不到指定的文件。)
FAQ1: Error:Could not read E:\new\PlatformLibrary\CommonLibrary\build\intermediates\typedefs.txt: E: ...
- 解题:ZJOI 2015 幻想乡战略游戏
题面 神**所有点都爆int,我还以为我写出什么大锅了,不开long long见祖宗... 动态点分治利用点分树树高不超过log的性质,我们对每个点维护一个子树和,一个点分树子树和,一个点分树上父亲的 ...
- 【bzoj4231】回忆树
题解: 树上的串匹配,模式串的总长$|S|$,令$\overline {S} $为$S$的反串: 对$S$和$\overline {S} $分别建自动机 $u -> v$可以分成三个部分去统计 ...
- 《剑指offer》— JavaScript(23)二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 相关知识 二叉查找树(B ...
- IEEE 754浮点数表示标准
二进制数的科学计数法 C++中使用的浮点数包括采用的是IEEE标准下的浮点数表示方法.我们知道在数学中可以将任何十进制的数写成以10为底的科学计数法的形式,如下 其中显而易见,因为如果a比10大或者比 ...
- Chapter6(函数) --C++Prime笔记
1.重载函数,也就是说一个名字可以对应几个不同的函数. 2.内置类型的未初始化局部变量将产生未定义的值. 3.局部静态对象在程序执行路径第一次进过对象定义语句时初始化,并且直到程序终止才被销毁. 内置 ...
- python的list()列表数据类型的方法详解
一.列表 列表的特征是中括号括起来的,逗号分隔每个元素,列表中的元素可以是数字或者字符串.列表.布尔值......等等所有类型都能放到列表里面,列表里面可以嵌套列表,可以无限嵌套 字符串的特征是双引号 ...
- Django中@login_required用法简介
我们在网站开发过程中,经常会遇到这样的需求: 用户登陆系统才可以访问某些页面 如果用户没有登陆而直接访问就会跳转到登陆界面,而不能访问其他页面. 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访 ...
- micro 架构组件介绍
Micro 是什么 Micro 是微服务生态系统中专注于提供产品.服务和解决方案的一款软件,使得在现代软件企业中起到创新驱动.它计划是可以将任何微服务相关的资源与即将使用此款软件的公司结合起来,利用此 ...
- numpy二进制转换和范围缩放
numpy二进制转换和范围缩放 觉得有用的话,欢迎一起讨论相互学习~Follow Me 一维二进制转换 import numpy as np # 一维二进制数组转换 a=np.array([0,1,1 ...