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 ...
随机推荐
- Android L开发指南
导语:Android下一代操作系统“ L”对开发者意味着什么?ART模式能否让应用的体验超越苹果? 刚刚结束的 Google I/O大会上,Android下一代操作系统“ L”带来不少惊喜.新系统运行 ...
- Eclipse – Java.Lang.OutOfMemoryError: Java Heap Space(转)
In Eclipse IDE, if your program is consuming a lot of memory (loading big data) like this : List< ...
- 小技巧--tab键自动补齐Git命令
Git是什么,你不清楚? 好吧,那么该篇内容对你也木有帮助,请绕道而行.. 我们在使用Git命令时,可以通过tab键,自动补齐Git,特别是在切换分支时特别有用. 如下,当我们想将当前分支切换到bug ...
- 【数学】【CF1096C】 Polygon for the Angle
Description 给定一个角度 \(\theta\),请你寻找一个正 \(n\) 边型,满足在这个正 \(n\) 边型上找三个顶点 \(A,B,C\) (可以不相邻),使得 \(\angle A ...
- Python【logging】模块
# 1.负责往控制台里面输出日志信息的 # 2.往日志文件里面写日志的,按天生成日志,清理日志 import logging from logging import handlers logger = ...
- Lua 错误 收集
不存在的变量或者变量没有定义,提示错误 // :: [error] #: * lua entry thread aborted: runtime error: /opt/openresty/nginx ...
- 视差插件parallarx
github上的demo,自己拿来改了改. <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...
- nodejs express 上传文件 (格式 FormData)
前台代码使用jQuery的ajax: <script type="text/javascript"> $(function(){ $('#file_upload').c ...
- idea 永久注册
1.在百度输入http://idea.lanyus.com/ 2.点击这个网址http://idea.lanyus.com/jar/JetbrainsCrack-3.1-release-enc.ja ...
- SVN搭建和使用
原文出处: http://www.cnblogs.com/tugenhua0707/p/3969558.html SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不 ...