[Qt教程] 第29篇 XML(三)Qt中的SAX
来源:互联网 发布:用户画像数据分析建模 编辑:程序博客网 时间:2024/04/29 13:28
[Qt教程] 第29篇 XML(三)Qt中的SAX
Qt中的SAX
版权声明
该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!
导语
我们前面讲述了用DOM的方法对XML文档进行操作,DOM实现起来很灵活,但是这样也就使得编程变得复杂了些,而且我们前面也提到过,DOM需要预先把整个XML文档都读入内存,这样就使得它不适合处理较大的文件。下面我们讲述另一种读取XML文档的方法,即SAX 。是的,如果你只想读取并显示整个XML文档,那么SAX是很好的选择,因为它提供了比DOM更简单的接口,并且它不需要将整个XML文档一次性读入内存,这样便可以用来读取较大的文件。我们对SAX不再进行过多的介绍,因为不需要任何基础,你就可以掌握我们下面要讲的内容了。如果大家对SAX有兴趣,可以到网上查找相关资料。
环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2
目录
一、解析器解析流程
二、使用SAX读取文档
正文
一、解析器解析流程
在Qt的QtXml模块中提供了一个QXmlSimpleReader的类,它便是基于SAX的XML解析器。这个解析器是基于事件的,但这些事件由它们自身进行关联,我们并不需要进行设置。我们只需知道,当解析器解析一个XML的元素时,就会执行相应的事件,我们只要重写这些事件处理函数,就能让它按照我们的想法进行解析。
比如要解析下面的元素:
<title>Qt</title>
解析器会依次调用如下事件处理函数:startElement(),characters(),endElement()。我们可以在startElement()中获得元素名(如“title”)和属性,在characters()中获得元素中的文本(如“Qt”),在endElement()中进行一些结束读取该元素时想要进行的操作。而所有的这些事件处理函数我们都可以通过继承QXmlDefaultHandler类来重写。
二、使用SAX读取文档
1.新建其他项目分类中的空的Qt项目,项目名称为mySAX。
2.完成后向项目中添加新的C++类,类名为“MySAX”,基类填写QXmlDefaultHandler。
3.然后再添加一个main.cpp文件。
4.先打开mySAX.pro文件,添加一行代码:QT+= xml,然后保存该文件。
5.打开mysax.h文件,将其内容更改为:
这里主要是重新声明了QXmlDefaultHandler类的startElement()、endElement()、characters()和fatalError()几个函数,readFile()函数用来读入XML文件,QListWidget部件用来显示解析后的XML文档内容,currentText字符串变量用于暂存字符数据。6.打开mysax.cpp文件,将其内容修改如下:
这里添加了几个函数的定义。在readFile()函数中,我们设置了文件的解析过程。Qt中提供了一个简单的XML解析器QXmlSimpleReader,它是基于SAX的。该解析器需要QXmlInputSource为其提供数据,QXmlInputSource会使用相应的编码来读取XML文档的数据。在进行解析之前,还需要使用setContentHandler()来设置事件处理器,使用setErrorHandler()来设置错误处理器,它们的参数使用了this,表明使用本类作为处理器,也就是在解析过程中出现的各种事件都会使用本类的startElement()等事件处理函数来进行处理,而出现错误时会使用本类的fatalError()函数来处理。最后,调用了parse()函数来进行解析,该函数会在解析成功时返回true,否则返回false。在后面的几个事件处理函数中,就是简单的将数据显示在QListWidget中。
7.最后打开main.cpp文件,添加如下内容:
#include "mysax.h"#include <QApplication>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MySAX sax;
sax.readFile("../mySAX/my.xml");
return app.exec();
}
8.将前面第27篇建立的“my.xml”文件复制到我们的源码目录中,然后运行程序,效果如下图所示。
结语
可以看到使用SAX方法来解析XML文档比使用DOM方法要清晰很多,更重要的是它的效率要高很多,不过SAX方法只适用于读取XML文档。
涉及到的源码: mySAX.zip
- [Qt教程] 第29篇 XML(三)Qt中的SAX
- Qt之XML(SAX)
- Qt之XML(SAX)
- QT SAX读取XML
- [Qt教程] 第27篇 XML(一)使用DOM读取XML文档
- [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
- [Qt教程] 第30篇 XML(四)使用流读写XML
- QT开发(四十三)——SAX方式解析XML
- [Qt教程] 第33篇 网络(三)FTP(一)
- [Qt教程] 第13篇 2D绘图(三)绘制文字
- [Qt教程] 第43篇 进阶(三)对象树与拥有权
- [Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句
- [Qt教程] 第52篇 从Qt 4到Qt 5(二)Qt 5框架介绍
- [Qt教程] 第51篇 从Qt 4到Qt 5(一)Qt 5.2安装、程序迁移和发布
- Qt 中sax方式 解析 xml文件
- QT开发之XML(SAX接口)
- QT XML文档的解析 QXmlStreamReader, DOM,SAX 三种解析方法 简单示例
- Qt 处理XML 文档的三种方式简介——DOM、SAX、流处理
- jquery validate在ie8下的bug解决
- [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
- mybatis 批量插入
- android 源码
- 软件开发论文
- [Qt教程] 第29篇 XML(三)Qt中的SAX
- mybatis整合spring的 泛型DAO接口
- 不同进程之间互斥锁的使用
- HibernateTemplate.save()与HibernateTemplate.update() 无法写入数据库的问题
- 【消圈】poj2175
- spark0.8.0安装与学习
- 第十二周上机实践 泰勒公式
- yii 返回上次访问的url
- java源文件和class文件编码详解