简介:
事件驱动,边读边解析
NO. |
SAXParser |
作用 |
SAXParserFactory |
作用 |
1 |
public abstract class SAXParser extends Object
|
继承关系
|
public abstract class SAXParserFactory extends Object
|
继承关系
|
2 |
public void parse(File f,DefaultHandler dh) throws SAXException,IOException
|
解析使用指定的指定XML文件的内容
当传入事件处理器,相当于在方法里面绑定了一个事件(自动执行事件) |
public static SAXParserFactory newInstance()
|
创建 SAXParserFactory实例 |
3 |
public abstract SAXParser newSAXParser()throws ParserConfigurationException,SAXException
|
创建SAXParse实例
|
NO |
DefaultHandler (事件处理器) |
参数 |
作用 |
1 |
public class DefaultHandler
extends Object
implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler
|
继承这个类然后重写下面三个方法 | |
2 |
public void characters(char[] ch,int start,int length)throws SAXException
|
|
接收元素内的字符数据通知。
默认情况下,什么也不做。 应用程序编写者可以覆盖此方法以对每个字符数据块采取特定操作(例如将数据添加到节点或缓冲区,或将其打印到文件中)。 |
3 |
public void startElement(String uri,String localName,String qName,Attributes attributes)throws SAXException |
|
接收元素开始的通知。
默认情况下,什么也不做。 应用程序编写者可以在子类中覆盖此方法,以在每个元素的开始处采取特定的操作(例如分配新的树节点或将输出写入文件)。 |
4 |
public void endElement(String uri,String localName,String qName)throws SAXException
|
uri - 名称空间URI,或空字符串,如果该元素没有命名空间URI或未命名空间处理。
|
接收元素结尾的通知。 |
代码实现:
package SAX.cn; import java.io.File; 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 TestSax { public static void main(String[] args) throws Exception { /** * 1、创建一个解析器工厂 * 2、创建解析器 * 3、执行parse()方法 */ // 创建解析器工厂 SAXParserFactory spf = SAXParserFactory.newInstance(); // 创建解析器 SAXParser sax = spf.newSAXParser(); // 执行parse()方法 sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml",new MyDef()); // 执行parse()方法后会自动执行事件处理器中的方法 } } class MyDef 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 + ">"); } }
输出结果:
import java.io.File;
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 TestSax {
public static void main(String[] args) throws Exception {
/**
* 1、创建一个解析器工厂 2、创建解析器 3、执行parse()方法
*/
// 创建解析器工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
// 创建解析器
SAXParser sax = spf.newSAXParser();
// 执行parse()方法
sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml", new MyDef2());
// 执行parse()方法后会自动执行事件处理器中的方法
}
}
// 获取所有name标签的值
class MyDef2 extends DefaultHandler {
boolean flag = false; // 相当于是仓库钥匙,startElement()是进门和endElement()就是出门,flag=true就是用钥匙开门,flag=false就是关门,characters()就是在进出仓库拿内容
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 判断qName是否是name标签
if ("name".equals(qName)) {
flag = true; // 找到name标签则flag为true
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(flag == true) { // flag为true表示已经找到name标签
System.out.println("name:" + new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(flag == true) { // 已经找到name的开始标签并打印了内容,那么此次那么标签应该结束
flag = false;
}
}
}
}
上面的代码实现了获取name标签的值(使用"name".equals(qName)来控制):
package SAX.cn;
import java.io.File;
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 TestSax {
public static void main(String[] args) throws Exception {
/**
* 1、创建一个解析器工厂 2、创建解析器 3、执行parse()方法
*/
// 创建解析器工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
// 创建解析器
SAXParser sax = spf.newSAXParser();
// 执行parse()方法
sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml", new MyDef2());
// 执行parse()方法后会自动执行事件处理器中的方法
}
}
// 获取所有name标签的值
class MyDef2 extends DefaultHandler {
boolean flag = false; // 相当于是仓库钥匙,startElement()是进门和endElement()就是出门,flag=true就是用钥匙开门,flag=false就是关门,characters()就是在进出仓库拿内容
int index = 1;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 判断qName是否是name标签
if ("name".equals(qName) && index==1) {
flag = true; // 找到name标签则flag为true
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(flag == true) { // flag为true表示已经找到name标签
System.out.println("name:" + new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(flag == true) { // 已经找到name的开始标签并打印了内容,那么此次那么标签应该结束
flag = false;
index++;
}
}
}
上面的代码实现了获取第一个name标签的值(使用index来控制):
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)