千家信息网

XML中SAX的示例分析

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,这篇文章给大家分享的是有关XML中SAX的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.SAX解析在使用DOM解析XML文档时,需要读取整个XML文档,在内存中
千家信息网最后更新 2024年11月24日XML中SAX的示例分析

这篇文章给大家分享的是有关XML中SAX的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1.SAX解析

  • 在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构建整个DOM树的Document对象,从而再对XML文档进行操作。此种情况下,如果XML文档特别大,就会消耗计算机的大量内存,严重的情况下可能还会导致内存溢出。

  • SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才对文档进行操作。

  • 通过继承DefaultHandler,来开发一个SAX解析器

【注意】SAX主要用于对XML文档的解析,不能去修改、删除和添加元素。

1.1.SAX解析机制

sax是一种推式的机制,你创建一个sax解析器,解析器在发现xml文档中的内容时就告诉你(把事件推给你,有点类似于java swing中的事件监听)。如何处理这些发现的内容,由程序员自己决定。

在基于sax的程序中,有五个最常用的sax事件:

1.startDocument()->告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
2.endDocument()->告诉你解析器发现了文档结尾
3.startElement()->告诉你解析器发现了一个起始标签,该事件告诉你标签的名称、该元素所有的属性名和值
4.characters()->告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以得到解析器发现的文本
5.endElement()->告诉你解析器发现了一个结束标签,该事件告诉你元素的名称

1.2.SAX解析实例

依然使用DOM解析中用到的XML例子,如下:

<班级>    <学生 地址="香港">        <名字>周小星        <年龄>23        <介绍>学习刻苦        <学生 地址="澳门">        <名字>林晓        <年龄>25        <介绍>是一个好学生    

【步骤】:

1.使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf = SAXParserFactory.newInstance();

2.通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();

3.将解析对象和事件处理器对象关联

sp.parse("src/myClass.xml",new MyHandler());

这里的MyHandler需要自己定义,并且它要继承DefaultHandler,然后在MyHandler类中重写上文提到的5个sax事件方法,当然也可以只重写自己需要的。
比如现在我写的MyHandler如下:

class MyHandler extends DefaultHandler{    /**     * 发现文档开始,该函数只会被调用一次     */    @Override    public void startDocument() throws SAXException {        System.out.println("startDocument");    }    /**     * 发现文档结束,该函数只会被调用一次     */    @Override    public void endDocument() throws SAXException {        System.out.println("endDocument");    }    /**     * 发现XML中的一个元素开始,会被反复调用     */    @Override    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {        System.out.println("元素名称:"+qName);    }    /**     * 发现XML中的一个元素结束,会被反复调用     */    @Override    public void endElement(String uri, String localName, String qName)                throws SAXException {    }    /**     * 发现XML文件中的文本,会被反复调用     */    @Override    public void characters(char[] ch, int start, int length)                throws SAXException {        // 显示文本内容        String text = new String(ch,start,length);        if(!text.trim().equals("")){            System.out.println(text);        }    }}

运行结果如下:

可以看到,这是对XML文档的一种遍历,而sax能够做的也只是遍历了。


那么,如果现在我们有这样一个需求:只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?

我们可以在MyHandler类中定义两个布尔变量isName和isAge,在startElement方法中标识是否是姓名元素或者年龄元素,如果是的话才在characters方法中获取对应的文本,如下:

1.定义两个布尔变量

private boolean isName = false;private boolean isAge = false;

2.在startElement方法中添加判断

@Overridepublic void startElement(String uri, String localName, String qName,        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        this.isName = true;    }else if(qName.equals("年龄")){        this.isAge = true;    }}

3.在characters方法中根据标识符进行判断是否获取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显示文本内容    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){        System.out.println(text);    }    isName = false;    isAge = false;}

最后要记得将两个布尔变量复位成false。
运行结果如下:

1.SAX解析

  • 在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构建整个DOM树的Document对象,从而再对XML文档进行操作。此种情况下,如果XML文档特别大,就会消耗计算机的大量内存,严重的情况下可能还会导致内存溢出。

  • SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才对文档进行操作。

  • 通过继承DefaultHandler,来开发一个SAX解析器

【注意】SAX主要用于对XML文档的解析,不能去修改、删除和添加元素。

1.1.SAX解析机制

sax是一种推式的机制,你创建一个sax解析器,解析器在发现xml文档中的内容时就告诉你(把事件推给你,有点类似于java swing中的事件监听)。如何处理这些发现的内容,由程序员自己决定。

在基于sax的程序中,有五个最常用的sax事件:

1.startDocument()->告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
2.endDocument()->告诉你解析器发现了文档结尾
3.startElement()->告诉你解析器发现了一个起始标签,该事件告诉你标签的名称、该元素所有的属性名和值
4.characters()->告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以得到解析器发现的文本
5.endElement()->告诉你解析器发现了一个结束标签,该事件告诉你元素的名称

1.2.SAX解析实例

依然使用DOM解析中用到的XML例子,如下:

<班级>    <学生 地址="香港">        <名字>周小星        <年龄>23        <介绍>学习刻苦        <学生 地址="澳门">        <名字>林晓        <年龄>25        <介绍>是一个好学生    

【步骤】:

1.使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf = SAXParserFactory.newInstance();

2.通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();

3.将解析对象和事件处理器对象关联

sp.parse("src/myClass.xml",new MyHandler());

这里的MyHandler需要自己定义,并且它要继承DefaultHandler,然后在MyHandler类中重写上文提到的5个sax事件方法,当然也可以只重写自己需要的。
比如现在我写的MyHandler如下:

class MyHandler extends DefaultHandler{    /**     * 发现文档开始,该函数只会被调用一次     */    @Override    public void startDocument() throws SAXException {        System.out.println("startDocument");    }    /**     * 发现文档结束,该函数只会被调用一次     */    @Override    public void endDocument() throws SAXException {        System.out.println("endDocument");    }    /**     * 发现XML中的一个元素开始,会被反复调用     */    @Override    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {        System.out.println("元素名称:"+qName);    }    /**     * 发现XML中的一个元素结束,会被反复调用     */    @Override    public void endElement(String uri, String localName, String qName)                throws SAXException {    }    /**     * 发现XML文件中的文本,会被反复调用     */    @Override    public void characters(char[] ch, int start, int length)                throws SAXException {        // 显示文本内容        String text = new String(ch,start,length);                if(!text.trim().equals("")){            System.out.println(text);        }    }}

运行结果如下:

可以看到,这是对XML文档的一种遍历,而sax能够做的也只是遍历了。


那么,如果现在我们有这样一个需求:只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?

我们可以在MyHandler类中定义两个布尔变量isName和isAge,在startElement方法中标识是否是姓名元素或者年龄元素,如果是的话才在characters方法中获取对应的文本,如下:

1.定义两个布尔变量

private boolean isName = false;private boolean isAge = false;

2.在startElement方法中添加判断

@Overridepublic void startElement(String uri, String localName, String qName,        Attributes attributes) throws SAXException {    if(qName.equals("名字")){                this.isName = true;    }else if(qName.equals("年龄")){        this.isAge = true;    }}

3.在characters方法中根据标识符进行判断是否获取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显示文本内容    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){        System.out.println(text);    }    isName = false;    isAge = false;}

最后要记得将两个布尔变量复位成false。
运行结果如下:

感谢各位的阅读!关于"XML中SAX的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

文档 元素 事件 文本 内容 方法 变量 对象 两个 内存 名称 学生 布尔 年龄 标签 函数 姓名 工厂 情况 数组 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 我与网络安全征文一年级 家用nas硬盘服务器 验证码存在服务器 公益网络安全宣传官是什么意义 网络安全 宣讲 kinhdown服务器资源调整 成都企业软件开发哪家实惠 金融行业服务器怎么防护 华为核心网软件开发项目 软件开发知识体系 大学生网络安全知识竞赛有效吗 服务器一开机就告警 华科网络安全历年复试线 惠普服务器换了一个硬盘突然断电 我的世界服务器如何防别人拆你家 qt 查询网络连接数据库 咸宁一品威客网软件开发 绍兴app软件开发需要多少钱 艾德思软件开发公司青岛 推动无线网络技术 南阳龙宇网络技术有限公司 bgp 服务器租用 湖南军工卫星授时服务器虚拟主机 连接数据库JSPZ增删 数据库代码建表什么意思 财政局网络安全知识讲座 我的世界服务器房间号怎么弄 涉密服务器电磁防护 扬州市场软件开发常见问题 网络安全法维护了什么权力
0