(一)SAX解析

1.1 SAX解析
SAX:基于事件处理的机制
sax解析xml文件时,遇到根开始标签,根结束标签,开始解析文件,文件解析结束,字符内容,空白字符等都会触发各自的方法。

优点:
适合解析大文件,对内存要求不高
轻量级的解析数据方式,效率更高
缺点:
不能随机解析(只能从头开始解析,一点点往后进行)
不能修改XML文件,只能进行查询

1.2用SAX解析遍历整个xml文件并进行原样输出

1.2.1 java代码

package xml4;

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.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class SaxTest {
public static void main(String[] args) {
// SAX解析 ①获取factory工厂
SAXParserFactory factory = SAXParserFactory.newInstance(); try {
// SAX ②获取解析器
SAXParser parser = factory.newSAXParser();
// 获取handel的对象
SaxTestHandel sh = new SaxTestHandel();
try {
parser.parse(new File("src/xml4/desk.xml"), sh);
} catch (IOException e) {
e.printStackTrace();
} } catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} }
} class SaxTestHandel extends DefaultHandler {
//当开始读到这个文件时,触发该相应
@Override
public void startDocument() throws SAXException {
System.out.println("开始解析了!");
}
//读完了,所有的,触发该方法
@Override
public void endDocument() throws SAXException {
//System.out.println("解析完了!");
} //读到元素标签时,触发该方法
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.print("<");
System.out.print(qName);
for(int i=0;i<attributes.getLength();i++) {
String qName2 = attributes.getQName(i);
String value = attributes.getValue(qName2);
System.out.print(" "+qName2+"="+"'"+value+"'");
}
System.out.print(">");
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("</"+qName+">");
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
String str=new String(ch,start,length);
System.out.print(str);
} }

1.2.2 Xml代码

<?xml version="1.0" encoding="UTF-8"?>
<disks>
<disk name='c盘'>
<size>10G</size>
<directory>100</directory>
<file>200</file>
</disk> <disk name='d盘'>
<size>20G</size>
<directory>200</directory>
<file>3000</file>
</disk>
</disks>

1.3  小练习 题目:获取一个xml 文件中的信息,并把它封装到一个实体类中去,并存放到一个集合中去,并保存到本地文件中去

 package xml4;

 public class Disk {

     private String name;
private String size;
private String directory;
private int file;
public Disk(String name, String size, String directory, int file) {
super();
this.name = name;
this.size = size;
this.directory = directory;
this.file = file;
}
public Disk() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getDirectory() {
return directory;
}
public void setDirectory(String directory) {
this.directory = directory;
}
public int getFile() {
return file;
}
public void setFile(int file) {
this.file = file;
}
@Override
public String toString() {
return "Disk [name=" + name + ", size=" + size + ", directory=" + directory + ", file=" + file + "]";
} }
package xml4;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; import sun.awt.FwDispatcher; public class SaxTest2 {
public static void main(String[] args) {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
File f = new File("src/xml4/desk.xml");
SaxTest2Hander dh = new SaxTest2Hander();
SAXParser parser = factory.newSAXParser(); try {
parser.parse(f, dh);
} catch (IOException e) {
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
} class SaxTest2Hander extends DefaultHandler {
private ArrayList<Disk> list;
private Disk disk;
private String tagName; @Override
public void startDocument() throws SAXException {
list=new ArrayList<Disk>();
} @Override
public void endDocument() throws SAXException { try {
PrintWriter fw=new PrintWriter("src/xml4/desk.txt");
for (Disk disk : list) {
fw.println(disk);
fw.flush();
}
fw.close(); } catch (IOException e) {
e.printStackTrace();
}
} @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("disk".equals(qName)) {
disk=new Disk();
}else {
tagName=qName;
}
for(int i=0;i<attributes.getLength();i++) {
String qName2 = attributes.getQName(0);
String value = attributes.getValue(qName2);
if(qName2.equals("name")){
disk.setName(value);
}
}
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("disk".equals(qName)) {
list.add(disk);
}else {
tagName=null;
} } @Override
public void characters(char[] ch, int start, int length) throws SAXException {
String str=new String(ch,start,length);
if("size".equals(tagName)) {
disk.setSize(str);
}
if("directory".equals(tagName)) {
disk.setDirectory(str);
}
if("file".equals(tagName)) {
disk.setFile(Integer.parseInt(str));
}
} }

  

<?xml version="1.0" encoding="UTF-8"?>
<disks>
<disk name='c盘'>
<size>10G</size>
<directory>100</directory>
<file>200</file>
</disk> <disk name='d盘'>
<size>20G</size>
<directory>200</directory>
<file>3000</file>
</disk>
</disks>

xml_SAX解析的更多相关文章

  1. Java修炼——四种方式解析XML_SAX

    四种方式解析XML:DOM      JDOM    DOM4J    SAX 先写一个XML栗子: <?xml version="1.0" encoding="U ...

  2. XML解析之JAXP

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. JAVA解析xml的四种方式比较

    1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ①允 ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  5. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  6. Html Agility Pack 解析Html

    Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面  用Fir ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  8. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  9. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

随机推荐

  1. Django之缓存配置

    01-什么是缓存 缓存(cache),其作用是缓和较慢存储的高频次请求,简单来说,就是加速满存储的访问效率. 02-几种缓存配置 # 内存缓存:local-memory caching CACHES ...

  2. 搭建Git服务器及本机克隆提交

    前文 Git是什么? Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首 ...

  3. 数据中心网络架构的问题与演进 — CLOS 网络与 Fat-Tree、Spine-Leaf 架构

    目录 文章目录 目录 前文列表 CLOS Networking Switch Fabric 胖树(Fat-Tree)型网络架构 Fat-Tree 拓扑示例 Fat-Tree 的缺陷 叶脊(Spine- ...

  4. keystone入口manage.py

    /opt/stack/keystone/keystone/cmd/manage.py OpenStack所有项目都是基于Python开发,并且都是标准的Python项目,通过setuptools工具管 ...

  5. PHP常用的 五种设计模式及应用场景

    设计模式六大原则 开放封闭原则:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象. 依赖倒置原则:高层模块不应该依赖低层模块,二者 ...

  6. 对JavaScript事件处理程序/事件监听器的设定的简单介绍

    下面是一些对事件处理进行设定的方式. 指定为HTML元素的属性(事件处理程序) 指定为DOM元素的属性(事件处理程序) 通过EventTarget.addEventListener()进行指定(事件监 ...

  7. TensorFlow自编码器(AutoEncoder)之MNIST实践

    自编码器可以用于降维,添加噪音学习也可以获得去噪的效果. 以下使用单隐层训练mnist数据集,并且共享了对称的权重参数. 模型本身不难,调试的过程中有几个需要注意的地方: 模型对权重参数初始值敏感,所 ...

  8. SVN(linux版)安装与使用

    SVN(linux版)安装与使用 一 简述:  SVN有2种运行方式,一种是 linux自带的轻量级服务器svnserve,一种是基于Apache的. 基于svnserve的,默认端口为3690,通过 ...

  9. Leetcode之动态规划(DP)专题-877. 石子游戏(Stone Game)

    Leetcode之动态规划(DP)专题-877. 石子游戏(Stone Game) 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最 ...

  10. java-循环变量定义问题

    第15行,这样就会报错.