时隔多日,终于,继XML DOM解析之后,开始XML SAX 解析之旅,首先说一下DOM解析,DOM解析:用于解析那种较小的XML文件,它要读取整个XML。我们来做个通俗一点的比喻,讲XML文件比喻成一个人体,DOM解析,就是读取整个人体的信息,由外至内,解析最外层,再依次解析到器官,细胞等等,这是有整体到局部到细节的解析方式;而SAX解析,则是依次,从人体的头部到脚部,每一层都解析到细胞结构。
那么,SAX解析如何实现呢?主要分一下几步:
1、创建SaxParserFactory实例
2、通过SAXParserFactory创建SAXParser实例
3、创建一个Handler类继承自DefaultHandler处理业务
4、创建一个Handler对象
5、用SAXParser.parser()方法,传入xml文件路径和handler对象进行解析
这种解析方式主要逻辑是在Handler类中进行实现的,这个类里面的逻辑操作,复写其中的几个方法,则是SAX的核心,代码如下:
Main主类:
public class Main{
public static void main(String[] args) {
//创建SAXParserFactory 工厂实例
try {
//通过工厂实例创建SAXParser 解析器
SAXParser parser = factory.newSAXParser();
//创建自定义的Handler实例
SAXHandler saxHandler = new SAXHandler();
//传入参数进行解析
} catch (ParserConfigurationException | SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
SAXHnadler类集成自DefaultHandler
public class SAXHandler extends DefaultHandler{
String name; //标签名称,
String currentTag; //记录当前标签名
//开始解析文件
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}
//解析文件结束
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
//开始解析xml元素
@Override
public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
// TODO Auto-generated method stub
super.startElement(arg0, arg1, arg2, arg3);
//name为标签名称
if ("searchName".equals(name)) {
//如果已知标签的属性,则可以直接调用Attributes.getValue(String name)获取属性值
System.out.println("已知book已有id属性,获取属性值-->" + arg3.getValue("id"));
//如果不知道标签的属性,则需要遍历Attributes分别获取属性名与属性值
for(int i = 0; i < arg3.getLength(); i++) {
//通过Attributes.getQName(int index)获取属性名称
System.out.print("属性名-->" + arg3.getQName(i));
//通过Attributes.getValue(int index)获取属性值
System.out.println("属性值-->" + arg3.getValue(i));
}
}
currentTag = name;
}
//解析xml元素结束
@Override
public void endElement(String arg0, String arg1, String arg2) throws SAXException {
// TODO Auto-generated method stub
super.endElement(arg0, arg1, arg2);
if (name.equals("searchName")) {
System.out.println("一个大标签解析完成");
}
currentTag = null;
}
//解析文档内容时调用
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
// TODO Auto-generated method stub
super.characters(arg0, arg1, arg2);
String str = new String(arg0, arg1, arg2);
if (currentTag.equals("节点名")) {
//进行操作
}
}
}
本次讲解到此结束,希望大家一起学习,共同进步,感兴趣的友友们可关注我的博客,后期会经常更新更多博客经验