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 ...
随机推荐
- [CSP-S模拟测试]:Dash Speed(线段树+并查集+LCA)
题目描述 比特山是比特镇的飙车圣地.在比特山上一共有$n$个广场,编号依次为$1$到$n$,这些广场之间通过$n−1$条双向车道直接或间接地连接在一起,形成了一棵树的结构. 因为每条车道的修建时间以及 ...
- Codeforecs Round #425 D Misha, Grisha and Underground (倍增LCA)
D. Misha, Grisha and Underground time limit per test 2 seconds memory limit per test 256 megabytes i ...
- jQuery file upload测试
<input id="fileupload" type="file" name="files[]" data-url="Ha ...
- 1207D Number Of Permutations
题目大意 给你n个二元组 问你有几种排列是的按两个关键字中的任意一个都不是不降排列的 分析 不妨容斥 我们先加上总的方案数$n!$ 之后我们按第一个关键字排序 因为值相同的情况下不影响答案 所以让总方 ...
- vs2019里没有linq to sql或EF工具,导致dbml或者edmx无法通过设计器浏览
点击:工具->获取工具或功能 选择需要安装的工具,然后点击底部的修改按钮就可以了,等待安装完成,如下图:
- Python 操作 mongodb 亿级数据量使用 Bloomfilter 高效率判断唯一性 例子
工作需要使用 python 处理 mongodb 数据库两亿数据量去重复,需要在大数据量下快速判断数据是否存在 参考资料:https://segmentfault.com/q/101000000061 ...
- oracle创建sequence序列语法
在oracle中sequence就是序号,每次取的时候它会自动增加.sequence与表没有关系 1.create sequence create sequence SEQ_LOG_ID minval ...
- 性能测试工具 Jmeter GET 请求 参数为 Json 串且参数中存在变量的转化
2.在BeanShell PreProcessor的实现:
- P3740 [HAOI2014]贴海报
题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...
- luoguP1311 选择客栈 题解(NOIP2011)
P1311 选择客栈 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...