SAX解析示例代码和原理
import java.io.File; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; /**
* 第一个SAX读取xml文件程序
* @author APPle
*
*/
public class Demo1 { public static void main(String[] args) throws Exception{
//1.创建SAXParser对象
SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); //2.调用parse方法
/**
* 参数一: xml文档
* 参数二: DefaultHandler的子类
*/
parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
} }
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* SAX处理程序(如何解析xml文档)
* @author APPle
*
*/
public class MyDefaultHandler extends DefaultHandler { /**
* 开始文档时调用
*/
@Override
public void startDocument() throws SAXException {
System.out.println("MyDefaultHandler.startDocument()");
} /**
* 开始标签时调用
* @param qName: 表示开始标签的标签名
* @param attributes: 表示开始标签内包含的属性列表
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("MyDefaultHandler.startElement()-->"+qName);
} /**
* 结束标签时调用
* @param qName: 结束标签的标签名称
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("MyDefaultHandler.endElement()-->"+qName);
} /**
* 读到文本内容的时调用
* @param ch: 表示当前读完的所有文本内容
* @param start: 表示当前文本内容的开始位置
* @param length: 表示当前文本内容的长度
* char[]( 张三 20) 100
* 98 2
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//得到当前文本内容
String content = new String(ch,start,length);
System.out.println("MyDefaultHandler.characters()-->"+content);
} /**
* 结束文档时调用
*/
@Override
public void endDocument() throws SAXException {
System.out.println("MyDefaultHandler.endDocument()");
} }
日志输出:
MyDefaultHandler.startDocument()
MyDefaultHandler.startElement()-->contactList
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->contact
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->name
MyDefaultHandler.characters()-->张三
MyDefaultHandler.endElement()-->name
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->age
MyDefaultHandler.characters()-->20
MyDefaultHandler.endElement()-->age
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->phone
MyDefaultHandler.characters()-->134222223333
MyDefaultHandler.endElement()-->phone
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->email
MyDefaultHandler.characters()-->zhangsan@qq.com
MyDefaultHandler.endElement()-->email
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->qq
MyDefaultHandler.characters()-->432221111
MyDefaultHandler.endElement()-->qq
MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contact
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->contact
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->name
MyDefaultHandler.characters()-->李四
MyDefaultHandler.endElement()-->name
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->age
MyDefaultHandler.characters()-->20
MyDefaultHandler.endElement()-->age
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->phone
MyDefaultHandler.characters()-->134222225555
MyDefaultHandler.endElement()-->phone
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->email
MyDefaultHandler.characters()-->lisi@qq.com
MyDefaultHandler.endElement()-->email
MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->qq
MyDefaultHandler.characters()-->432222222
MyDefaultHandler.endElement()-->qq
MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contact
MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contactList
MyDefaultHandler.endDocument()
import java.io.File; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; /**
* 读取contact.xml文件,完整输出文档内容
* @author APPle
*
*/
public class Demo2 { public static void main(String[] args)throws Exception {
//1.创建SAXParser
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
//2.读取xml文件
MyDefaultHandler2 handler = new MyDefaultHandler2();
parser.parse(new File("./src/contact.xml"), handler);
String content = handler.getContent();
System.out.println(content);
} }
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* SAX处理器程序
* @author APPle
*/
public class MyDefaultHandler2 extends DefaultHandler {
//存储xml文档信息
private StringBuffer sb = new StringBuffer(); //获取xml信息
public String getContent(){
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+">");
}
}
日志输出:
<contactList>
<contact id="001">
<name>张三</name>
<age>20</age>
<phone>134222223333</phone>
<email>zhangsan@qq.com</email>
<qq>432221111</qq>
</contact>
<contact id="002">
<name>李四</name>
<age>20</age>
<phone>134222225555</phone>
<email>lisi@qq.com</email>
<qq>432222222</qq>
</contact>
</contactList>
import java.io.File;
import java.util.List; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; /**
* 使用sax解析把 xml文档封装成对象
* @author APPle
*
*/
public class Demo3 { public static void main(String[] args)throws Exception {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
MyDefaultHandler3 handler = new MyDefaultHandler3();
parser.parse(new File("./src/contact.xml"), handler);
List<Contact> list = handler.getList();
for (Contact contact : list) {
System.out.println(contact);
}
}
}
import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* SAX处理程序
* @author APPle
*
*/
public class MyDefaultHandler3 extends DefaultHandler {
//存储所有联系人对象
private List<Contact> list = new ArrayList<Contact>(); public List<Contact> getList(){
return list;
}
//保存一个联系人信息
private Contact contact;
/**
* 思路:
* 1)创建Contact对象
* 2)把每个contact标签内容存入到Contact对象
* 3)把Contact对象放入List中
*/
//用于临时存储当前读到的标签名
private String curTag; @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
curTag = qName;
//读取到contact的开始标签创建Contact对象
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;
//读到contact的结束标签放入List中
if("contact".equals(qName)){
list.add(contact);
}
}
}
日志输出:
Contact [age=20, email=zhangsan@qq.com, id=001, name=张三, phone=134222223333, qq=432221111]
Contact [age=20, email=lisi@qq.com, id=002, name=李四, phone=134222225555, qq=432222222]
Contact,xml
<?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001">
<name>张三</name>
<age>20</age>
<phone>134222223333</phone>
<email>zhangsan@qq.com</email>
<qq>432221111</qq>
</contact>
<contact id="002">
<name>李四</name>
<age>20</age>
<phone>134222225555</phone>
<email>lisi@qq.com</email>
<qq>432222222</qq>
</contact>
</contactList>
SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低
DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。 对内存要求比较要。 缺点: 不适合读取大容量的xml文件,容易导致内存溢出。
SAX解析工具- Sun公司提供的。内置在jdk中。org.xml.sax.*
核心的API:
SAXParser类: 用于读取和解析xml文件对象
parse(File f, DefaultHandler dh)方法: 解析xml文件 参数一: File:表示 读取的xml文件。 参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类
1.创建SAXParser对象
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
2.调用parse方法
parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());} [一个类继承class 类名(extends DefaultHandler) 在调用是创建传进去
DefaultHandler类的API:
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) : 读到文本内容时调用
SAX解析示例代码和原理的更多相关文章
- XML解析之SAX解析过程代码详解
上一篇谢了解析原理和过程,这里应用代码直观认识这个原理: 新建Demo1类: import java.io.File; import javax.xml.parsers.SAXParser; impo ...
- Android之SAX解析XML
一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...
- Android 之XML数据解析(2)—— SAX解析
(以下文章基本照抄郭霖大神的<第一行代码>) 在Android之 解析XML文件(1)—— Pull解析 中我们讲了Pull方式解析XML文件.今天讲另外一种方式,SAX解析XML文件. ...
- Android中悬浮窗口的实现原理和示例代码
用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutPar ...
- SAX解析原理示意
SAX解析原理示意
- 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )
作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...
- pyspider示例代码:解析JSON数据
pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下比较经典的示例进行简单讲解,希望对新手有一些帮助. 示例说明: py ...
- pyspider示例代码三:用PyQuery解析页面数据
本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一些 ...
- pyspider示例代码二:解析JSON数据
本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下 ...
随机推荐
- docker镜像pull不下来最终解决方法
pull镜像wordpress下来,但是出现如下错误: # docker pull wordpress:latest Error response from daemon: Get https://r ...
- libusb_control_setup
libusb_fill_control_transfer(transfer, devh, buf, ctrl_urb_complete_cb, utrans, 1000); ...
- USRPX310 在GNU Radio上更改通道A或B
UHD:USRP sink和USRP source默认是A通道发射接收.或设置 Mb0:Subdev Spec: A:0 更改为B通道收发:设置 Mb0:Subdev Spec: B:0
- 用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛
前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为使用 ES6 语法. 源码: gi ...
- MariaDB使用enum和set
1.enum 单选字符串数据类型,适合存储表单界面中的“单选值”. 设定enum的时候,需要给定“固定的几个选项”:存储的时候就只存储其中的一个值. 设定enum的格式: enum("选项1 ...
- Python实现Windows CMD命令行彩色输出
#! /usr/bin/env python #coding=utf-8 import ctypes,sys STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE ...
- Java-DatabaseConnectionPool工具类
package org.zxjava.test; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.s ...
- 在项目中使用Swagger接口说明
该链接写的内容非常详细: https://blog.csdn.net/xudant/article/details/82856555
- 创建基本的webpack4.x项目
1.步骤 1)运行npm init -y 快速初始化项目 2)在项目根目录创建src源代码目录和dist产品目录,目录结构 webpack4.x-base |dist |src |index.html ...
- tomcat下载与安装
https://www.cnblogs.com/limn/p/9358657.html