[Qt教程] 第30篇 XML(四)使用流读写XML

楼主

 发表于 2013-5-22 13:03:33 | 查看: 611| 回复: 0
使用流读写XML
版权声明

该文章原创于作者yafeilinux,转载请注明出处!
导语

       从Qt 4.3开始引入了两个新的类来读取和写入XML文档:QXmlStreamReader和QXmlStreamWriter。 QXmlStreamReader类提供了一个快速的解析器通过一个简单的流API来读取格式良好的XML文档,它是作为Qt的SAX解析器的替代品的身份出现的,因为它比SAX解析器更快更方便。QXmlStreamReader可以从QIODevice或者QByteArray中读取数据。流读取器的基本原理就是将XML文档报告为一个记号(tokens)流,这一点与SAX相似,而它们的不同之处在于XML记号被报告的方式。在SAX中,应用程序必须提供处理器(回调函数)来从解析器获得所谓的XML事件;而对于QXmlStreamReader,是应用程序代码自身来驱动循环,在需要的时候可以从读取器中一个接一个的拉出记号。这个是通过调用readNext()函数实现的,它可以读取下一个记号,然后返回一个记号类型,然后可以使用isStartElement()和text()等函数来判断这个记号是否包含我们需要的信息。使用这种主动拉取记号的方式的最大的好处就是可以构建递归解析器,也就是可以在不同的函数或者类中来处理XML文档中的不同记号。
环境:Windows Xp + Qt 4.8.4+Qt Creator2.6.2
目录

一、解析XML文档
二、写入XML文档
正文

一、解析XML文档
1.新建Qt控制台应用,项目名称为myXmlStream,完成后将myXmlStream.pro文件的第一行代码更改为:
QT       += core  xml
然后保存该文件。
2.然后打开main.cpp文件,将内容更改如下:
  1. #include <QCoreApplication>
  2. #include <QFile>
  3. #include <QXmlStreamReader>
  4. #include <QXmlStreamWriter>
  5. #include <QDebug>
  6. int main(int argc, char *argv[])
  7. {
  8. QCoreApplication a(argc, argv);
  9. QFile file("../myXmlStream/my.xml");
  10. if (!file.open(QFile::ReadOnly | QFile::Text))
  11. {
  12. qDebug()<<"Error: cannot open file";
  13. return 1;
  14. }
  15. QXmlStreamReader reader;
  16. // 设置文件,这时会将流设置为初始状态
  17. reader.setDevice(&file);
  18. // 如果没有读到文档结尾,而且没有出现错误
  19. while (!reader.atEnd()) {
  20. // 读取下一个记号,它返回记号的类型
  21. QXmlStreamReader::TokenType type = reader.readNext();
  22. // 下面便根据记号的类型来进行不同的输出
  23. if (type == QXmlStreamReader::StartDocument)
  24. qDebug() << reader.documentEncoding()
  25. << reader.documentVersion();
  26. if (type == QXmlStreamReader::StartElement) {
  27. qDebug() << "<" << reader.name() << ">";
  28. if (reader.attributes().hasAttribute("id"))
  29. qDebug() << reader.attributes().value("id");
  30. }
  31. if (type == QXmlStreamReader::EndElement)
  32. qDebug() << "</" << reader.name() << ">";
  33. if (type == QXmlStreamReader::Characters
  34. && !reader.isWhitespace())
  35. qDebug() << reader.text();
  36. }
  37. // 如果读取过程中出现错误,那么输出错误信息
  38. if (reader.hasError()) {
  39. qDebug() << "error: " << reader.errorString();
  40. }
  41. file.close();
  42. return a.exec();
  43. }

复制代码

可以看到流读取器就是在一个循环中通过使用readNext()来不断读取记号的,这里可以对不同的记号和不同的内容进行不同的处理,既可以在本函数中进行,也可以在其他函数或者其他类中进行。可以将前面生成的my.xml文件复制到源码目录,然后运行程序,查看效果。
二、写入XML文档
与QXmlStreamReader对应的是QXmlStreamWriter,它通过一个简单的流API提供了一个XML写入器。QXmlStreamWriter的使用是十分简单的,只需要调用相应的记号的写入函数来写入相关数据即可。
将前面主函数的内容更改为:
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("../myXmlStream/my2.xml");
    if (!file.open(QFile::WriteOnly | QFile::Text))
    {
       qDebug() << "Error: cannot open file";
       return 1;
    }
    QXmlStreamWriter stream(&file);
    stream.setAutoFormatting(true);
    stream.writeStartDocument();
    stream.writeStartElement("bookmark");
    stream.writeAttribute("href", "http://qt.nokia.com/");
    stream.writeTextElement("title", "Qt Home");
    stream.writeEndElement();
    stream.writeEndDocument();
    file.close();
    qDebug() << "write finished!";
    return a.exec();
}
这里使用了setAutoFormatting(true)函数来自动设置格式,这样会自动换行和添加缩进。然后使用了writeStartDocument(),该函数会自动添加首行的XML说明(即<?xmlversion="1.0" encoding="UTF-8"?>),添加元素可以使用writeStartElement(),不过,这里要注意,一定要在元素的属性、文本等添加完成后,使用writeTextElement()来关闭前一个打开的元素。在最后使用writeEndDocument()来完成文档的写入。现在大家可以运行程序了,这时会在项目目录中生成一个XML文档。
结语

数据库和XML在很多程序中都经常用到,它们的使用也总是和数据的显示联系起来,所以学习好数据库的知识也是很重要的,它们可以说是密不可分的。相关内容,大家也可以参考《Qt Creator快速入门》的相关章节以及《Qt 及Qt Quick开发实战精解》的数据管理系统的例子,里面同时应用了数据库和XML。


涉及到的源码:  myXmlStream.zip (1.78 KB, 下载次数: 14) 

[Qt教程] 第30篇 XML(四)使用流读写XML相关推荐

  1. [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档

    [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档 楼主  发表于 2013-5-21 22:00:51 | 查看: 475| 回复: 0 使用DOM创建和操作XML文档 版权声明 该 ...

  2. [Qt教程] 第24篇 数据库(四)SQL查询模型QSqlQueryModel

    [Qt教程] 第24篇 数据库(四)SQL查询模型QSqlQueryModel 楼主  发表于 2013-5-21 14:33:47 | 查看: 869| 回复: 1 SQL查询模型QSqlQuery ...

  3. [Qt教程] 第27篇 XML(一)使用DOM读取XML文档

    [Qt教程] 第27篇 XML(一)使用DOM读取XML文档 楼主  发表于 2013-5-21 21:14:28 | 查看: 1001| 回复: 14 使用DOM读取XML文档 版权声明 该文章原创 ...

  4. [Qt教程] 第29篇 XML(三)Qt中的SAX

    [Qt教程] 第29篇 XML(三)Qt中的SAX 楼主  发表于 2013-5-21 22:27:59 | 查看: 615| 回复: 5 Qt中的SAX 版权声明 该文章原创于Qter开源社区(ww ...

  5. [Qt教程] 第34篇 网络(四)FTP(二)

    [Qt教程] 第34篇 网络(四)FTP(二) 楼主  发表于 2013-9-4 15:04:38 | 查看: 315| 回复: 9 FTP(二) 版权声明 该文章原创于作者yafeilinux,转载 ...

  6. [Qt教程] 第44篇 进阶(四)信号和槽

    [Qt教程] 第44篇 进阶(四)信号和槽 楼主  发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容 ...

  7. [Qt教程] 第14篇 2D绘图(四)绘制路径

    [Qt教程] 第14篇 2D绘图(四)绘制路径 楼主  发表于 2013-4-27 12:40:52 | 查看: 611| 回复: 0 绘制路径 版权声明 该文章原创于Qter开源社区(www.qte ...

  8. [Qt教程] 第47篇 进阶(七) 定制Qt帮助系统

    [Qt教程] 第47篇 进阶(七) 定制Qt帮助系统 楼主  发表于 2013-10-7 09:32:39 | 查看: 93| 回复: 0 定制Qt帮助系统 版权声明 该文章原创于Qter开源社区(w ...

  9. [Qt教程] 第46篇 进阶(六) 国际化

    [Qt教程] 第46篇 进阶(六) 国际化 楼主  发表于 2013-10-7 09:23:45 | 查看: 109| 回复: 0 国际化 版权声明 该文章原创于Qter开源社区 导语 在第2篇中讲述 ...

最新文章

  1. 观看马云网商大会视频的一些感想.
  2. Android NDK开发——人脸检测与静默活体检测
  3. TensorFlow for Hackers - Part III
  4. 跟着官方文档能学懂React Hooks就怪了
  5. activitimq集群搭建_activitmq+keepalived+nfs 非zk的高可用集群构建
  6. ASP.NET实现页面传值的几种方法
  7. scada系统集成_专家 | 浅析地铁综合监控系统集成门禁系统
  8. 使用sentencepiece模型替换词表
  9. java实例化是什么意思_什么是java实例化
  10. YYH的营救计划(NOIP模拟赛Round 6)
  11. 2021年中国游戏行业发展现状及行业发展趋势分析[图]
  12. AI MAX交互式开发使用方法说明(配合xshell)
  13. Linux内核源码高速下载地址
  14. 杭电1856——并差集
  15. 未來用工新趨勢_未来人工智能,有什么新的发展趋势?
  16. 2014 WOT全球软件技术峰会深圳站
  17. PP熔喷、线烧、折叠滤芯保安过滤器
  18. 找出数组中第k大小的数,输出数所在的位置
  19. 外航空姐异国情感生活:空姐之恋
  20. 未雨绸缪:Java高级架构进阶必学之 ⑥ 大知识要点附视频学习资料

热门文章

  1. Android UI开发第二篇——多级列表(ExpandableListView)
  2. python 将excel文件转换为txt文件_python利用pandas将excel文件转换为txt文件的方法
  3. linux 优化内存分配,Linux性能优化 第三章 性能工具:系统内存
  4. android有关的笔记,android学习笔记1——webview相关
  5. C#中的深复制与浅复制
  6. 软件保障与测试课程实践记录:贪吃蛇小程序
  7. vue -resource 文件提交提示process,或者拦截处理
  8. 剑指offer55 字符流中第一个不重复的字符(最典型错误)
  9. openstack架构及组件特点
  10. RSA 公钥加密——私钥解密