java 之 XML SAX解析

    时隔多日,终于,继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 工厂实例

SAXParserFactory factory = SAXParserFactory.newInstance();

try {

                        //通过工厂实例创建SAXParser 解析器

SAXParser parser = factory.newSAXParser();

                        //创建自定义的Handler实例

SAXHandler saxHandler = new SAXHandler();

                        //传入参数进行解析

parser.parse("info.xml", 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("节点名")) {
//进行操作
}
}
}

    本次讲解到此结束,希望大家一起学习,共同进步,感兴趣的友友们可关注我的博客,后期会经常更新更多博客经验




阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页