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 ...
随机推荐
- js常见的几种设计模式
一.单例模式 单例模式也称作为单子模式,更多的也叫做单体模式.为软件设计中较为简单但是最为常用的一种设计模式. 在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的 ...
- 我的Podfile如下
# Uncomment this line to define a global platform for your projectuse_frameworks!(http://www.my516.c ...
- CSU 1547 Rectangle(dp、01背包)
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1547 Description Now ,there are some rectang ...
- 002-JS-SDK开发使用,网页获取授权,扫一扫调用
一.概述 在申请响应的公众号之后,实名认证或者企业认证之后,可以进行对应开发 二.开发步骤 2.1.开发前提[服务号]-域名设置 登录后台之后→左侧设置→公众号设置→功能设置,设置好“JS接口安全域名 ...
- Python——GUI可视化
import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class ...
- pandas melt 与pivot 函数
(掌握这个,基本就完美无缺的任意按照自己的想法,更改列了.) 背景: 最近有个excel 数据需要转化的过程. 数据量还挺大的,大概有30多万. 需要把某些行变成列,有些列又变成行. 这个操作本身就比 ...
- 【ABAP系列】SAP ABAP 物料凭证增强
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 物料凭证增强 ...
- 2019/10/27 TZOJ
1001 Gaussian Prime http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=379 ...
- [COCI2017.1]Deda —— 解锁线段树的新玩法
众所周知,能用线段树做的题一定可以暴力 但考场上也只能想到暴力了,毕竟还是对线段树不熟练. deda 描述 有一辆车上有n个小孩,年龄为1~n,然后q个询问,M X A代表在第X站时年龄为A的小孩会下 ...
- Emqtt集群搭建
1 Emqtt简单搭建 1.1 介绍:EMQ:EMQ 2.0,号称百万级开源MQTT消息服务器,基于Erlang/OTP语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源MQTT消息服务器 ...