6.jaxp的sax方式操作
1.sax解析的原理
(1)解析xml有两种技术 dom 和 sax
dom:
根据xml的层级结构在内存中分配一个树形结构,把xml中标签,属性,文本封装成对象
sax:
事件驱动,一行一行边读边解析(正确来说,是按照顺序,一个一个标签解析的)
(2)所使用到的类和方法(javax.xml.parsers包里面)
SAXParserFactory 抽象类
实例 newInstance() 方法得到
SAXParser 抽象类
此类的实例从 SAXParserFactory.newSAXParser()方法获得
- parse(File f,DefaultHandler dh) 执行此方法,每当获取一个标签的时候,会自动执行DefaultHandler类中的一些方法
file xml路径
DefaultHandler 事件处理器
(3)DefaultHandler(在org.xml.sax.helpers.DefaultHandler包)
    当解析到开始标签的时候,自动执行 startElement(String uri, String localName, String qName, Attributes attributes) 
      - qName 返回标签名,输出参数即可qName
当解析到文本的时候,自动执行 characters(char[] ch, int start, int length)
- 返回文本,输出ch即可
当解析到结束标签的时候,自定执行 endElement(String uri, String localName, String qName)
- 返回结束标签,输出qName即可
    注意:一般我们会定义一个类,并重写者三个方法,这样方便我们对xml文件操作,并不是直接实例化这个然后传递过去,其中qName表示返回的标签名
注意:sax只能查询,不能进行增删改
实例代码如下:
需求1:获取所有的xml中的所有标签和文本
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<persion xmlns="http://www.example.org/one"
xmlns:two="http://www.example.org/two"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/one one.xsd http://www.example.org/two two.xsd">
<two:name>12</two:name>
<name>张三</name>
<age>180</age>
</persion>
package day2; 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 Demo1 {
public static void main(String[] args) throws Exception {
//实例化解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//实例化解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//调用parse方法,开始解析
saxParser.parse("src/day2/1.xml", new myHandler());
}
} //自定义事件处理器
class myHandler extends DefaultHandler{ @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(qName);
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println(new String(ch,start,length));
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(qName);
}
}

需求2:按照xml格式进行输出(上面的输出我们可以知道,空格也会输出出来)
package day2; 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 Demo1 {
public static void main(String[] args) throws Exception {
//实例化解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//实例化解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//调用parse方法,开始解析
saxParser.parse("src/day2/1.xml", new myHandler());
}
} //自定义事件处理器
class myHandler extends DefaultHandler{ @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.print("<"+qName+">");
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.print(new String(ch,start,length));
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("<"+qName+">");
}
}

需求3:查询name标签的文本
package day2; 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 Demo1 {
public static void main(String[] args) throws Exception {
//实例化解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//实例化解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//调用parse方法,开始解析
saxParser.parse("src/day2/1.xml", new myHandler());
}
} //自定义事件处理器
class myHandler extends DefaultHandler{ boolean flash = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//获取到name标签
if("name".equals(qName)) {
flash = true;
}
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(flash == true) {
System.out.print(new String(ch,start,length));
}
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("name".equals(qName)) {
flash = false;
}
}
}

6.jaxp的sax方式操作的更多相关文章
- 用JAXP的SAX方式解析XML文件
		
简单用JAXP的SAX方式(事件驱动)解析XML文件: 文件(1.XML) <?xml version="1.0" encoding="UTF-8" st ...
 - jaxp的dom方式操作(查找、添加、修改、删除、遍历节点)
		
package cn.itcast.jaxptest; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;imp ...
 - XML的解析(DOM以及SAX方式)
		
感谢http://blog.csdn.net/redarmy_chen/article/details/12951649(关于SAX解析)以及http://blog.csdn.net/zhangerq ...
 - 用JAXP的dom方式解析XML文件
		
用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...
 - POI以SAX方式解析Excel2007大文件(包含空单元格的处理)  Java生成CSV文件实例详解
		
http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...
 - Android网络之数据解析----SAX方式解析XML数据
		
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
 - (四)SAX方式解析XML数据
		
SAX方式解析XML数据 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...
 - Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
		
通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...
 - Linux下用文件IO的方式操作GPIO(/sys/class/gpio)(转)
		
通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...
 
随机推荐
- 【LOMBOK】能引入 @Slf4j 注解,不能识别 log 的解决方法
			
问题: 在pom.xml中加入引入了lombok的依赖,可以引用@Slf4j注解不能识别log 如:注:上面一篇博客,已经说明lombok的安装了,但是用的时候还有点问题. 1).把lombok.ja ...
 - Xenu Link Sleuth 简单好用的链接测试工具
			
XenuLink Sleuth 名词介绍 “Xenu链接检测侦探”是被广泛使用的死链接检测工具.可以检测到网页中的普通链接.图片.框架.插件.背景.样式表.脚本和java程序中的链接. 那么神马时候出 ...
 - 20180822-Java接口
			
Java 接口 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并 ...
 - CF889 E Mod Mod Mod——DP
			
题目:http://codeforces.com/contest/889/problem/E 这题真好玩. 官方题解说得很好. 想到相邻 a[ i ] 之间的段可能可以一起维护,但是不太会. 原来是表 ...
 - 字符串(二):string
			
字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string string 是 C++ STL 的一个字符串类型,原型是 vector<char> 并对字符串处理做 ...
 - windows下源码安装调试postgresql
			
环境:windows 10 postgresql版本:postgresql-9.6.5 使用工具:vs2017社区版 辅助工具:perl.diff.flex.bison 相关工具下载地址: perl下 ...
 - (appium+python)UI自动化_07_app UI自动化实例【叮咚搜索加车为例】
			
前言 初学UI自动化的小伙伴,在配置好appium+python自动化环境后,往往不知道如何下手实现自动化.小编在初期学习的时候也有这种疑惑,在此以叮咚买菜app-搜索加车为实例,展示下appium是 ...
 - Rust SDL2配置
			
github地址 https://github.com/Rust-SDL2/rust-sdl2 clone或下载这个项目 本文使用的是MSVC版本 上面链接页面搜Windows (MSVC) 得知需要 ...
 - Orcle获取当前时间加小时
			
如下是oracle 获取当前数据库时间加2个小时 select to_date(TO_CHAR (SYSDATE, 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24: ...
 - Hexo-博客yilia主题创建分类(categories)和标签(tags)首页
			
转载自:http://orzcss.com/posts/5a207d64/ 概述 默认安装的 hexo 本身是没有分类和标签首页的,例如:http://orzcss.com/categories/页面 ...