博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt之生成XML(QXmlStreamWriter)
阅读量:6792 次
发布时间:2019-06-26

本文共 3390 字,大约阅读时间需要 11 分钟。

简述

QXmlStreamWriter 类提供了一个使用简单的流 API,用于写入 XML,与之相对应的是 QXmlStreamReader(读取 XML)。

正如其相关类,它可以在 setDevice() 指定的 QIODevice 上操作。API 很简单明了:对于想要写的每个 XML 标签或事件,QXmlStreamWriter 都提供了一个专门的函数。

详细介绍

元素标签使用 writeStartElement() 打开,紧随其后的是 writeAttribute() 或 writeAttributes()、元素内容,然后使用 writeEndElement() 关闭标签。writeEmptyElement() 则可以写入空元素。

元素内容由字符、实体引用或嵌套元素组成,使用 writeCharacters() 写入,它还负责转义所有禁用的字符和字符序列、writeEntityReference() 或对 writeStartElement() 的后续调用。有一个很方便的函数 writeTextElement(),可用于元素仅写入文本信息。

QXmlStreamWriter 负责前缀命名空间,在编写元素或属性时,所有需要做的是指定 namespaceUri。假如必须遵守特定的前缀,可以通过调用 writeNamespace() 或者 writeDefaultNamespace() 手动声明名称空间,让 writer 强制使用它们。或者,可以绕过 QXmlStreamWriter 的命名空间支持,并使用重载的方法,而不是使用限定名称。命名空间 是隐式的,并映射到前缀 xml。

QXmlStreamWriter 可以自动格式化生成的 XML 数据,通过在元素之间的空白部分添加换行符和缩进,使得 XML 数据更易读,并且对于大多数源代码管理系统更容易使用。可以使用 autoFormatting 属性(默认被禁用)打开此功能,并使用 autoFormattingIndent 属性(包含空格或制表符的数量,默认是 4)进行自定义。

还有其它函数 writeCDATA()、writeComment()、writeProcessingInstruction()、writeDTD(),XML streams 链由 writeCurrentToken() 支持。

默认情况下,QXmlStreamWriter 以 UTF-8 编码 XML,如果使用其它编码,调用 setCodec() 。

如果在写入底层设备时发生错误,hasError() 会返回 true,并忽略后续的写入。

使用

下面,我们编写一个格式化的 XML 缩进:

]>
<作者>
一去丶二三里
<主页>
http://blog.csdn.net/liang19890820
<个人说明>
青春不老,奋斗不止!
&Copyright;368241647]]>>

第一行:XML 声明,它定义 XML 的版本(1.0)和所使用的编码(UTF-8)。

第二行:一个简单地注释(<!--纯正开源之美,有趣、好玩、靠谱。。。-->)。

第三行:处理指令,用来指挥解析引擎如何解析XML文档内容。例如,在 XML 文档中可以使用 xml-stylesheet 指令,通知 XML 解析引擎,应用 CSS 文件显示 XML 文档内容。

第四行开始:表示 DTD,携带一个有关自身格式的描述。

根元素是 <Blogs>,并包含属性 Version,其值为 “1.0”,文档中的所有 <Blog> 元素都被包含在 <Blogs> 中。<Blog> 元素,有 3 个子元素:<作者>< 主页><个人说明>。后紧跟着实体引用、CDATA (不应由 XML 解析器进行解析的文本数据)以及一个空元素 <Empty/>

源码如下:

void writeXML() {    QString strFile("Blogs.xml");    QFile file(strFile);    if (!file.open(QFile::WriteOnly | QFile::Text)) { // 只写模式打开文件        qDebug() << QString("Cannot write file %1(%2).").arg(strFile).arg(file.errorString());        return;    }    QXmlStreamWriter writer(&file);    // writer.setCodec("GBK");  // XML 编码    writer.setAutoFormatting(true); // 自动格式化    writer.writeStartDocument("1.0", true);  // 开始文档(XML 声明)    writer.writeComment(QString::fromLocal8Bit("纯正开源之美,有趣、好玩、靠谱。。。"));  // 注释    writer.writeProcessingInstruction("xml-stylesheet type=\"text/css\" href=\"style.css\"");  // 处理指令    // DTD    writer.writeDTD(QString::fromLocal8Bit(" 
]>")); writer.writeStartElement("Blogs"); // 开始根元素
writer.writeAttribute("Version", "1.0"); // 属性 writer.writeStartElement("Blog"); // 开始子元素
writer.writeTextElement(QString::fromLocal8Bit("作者"), QString::fromLocal8Bit("一去丶二三里")); writer.writeTextElement(QString::fromLocal8Bit("主页"), "http://blog.csdn.net/liang19890820"); writer.writeTextElement(QString::fromLocal8Bit("个人说明"), QString::fromLocal8Bit("青春不老,奋斗不止!")); writer.writeEntityReference("Copyright"); writer.writeCDATA(QString::fromLocal8Bit("
368241647
")); writer.writeCharacters(">"); writer.writeEmptyElement(QString::fromLocal8Bit("Empty")); // 空元素 writer.writeEndElement(); // 结束子元素
writer.writeEndElement(); // 结束根元素
writer.writeEndDocument(); // 结束文档 file.close(); // 关闭文件}

注意:使用 writeStartElement() 打开元素标签后,要有相应的 writeEndElement() 来关闭。

更多参考

你可能感兴趣的文章
智慧城市真的安全吗?看看这款APP的分析报告
查看>>
荷兰政府:保证不强制在产品中留有后门
查看>>
拥抱开源!解析IBM Power8与Hadoop的不解之缘
查看>>
你不是一个人在战斗 做安全的就得身兼数职
查看>>
为何终端防护对ICS如此重要
查看>>
爱数AnyBackup助力TDK核心业务系统数据保护
查看>>
Windows 10启动,如何一个命令备份和恢复多系统选择菜单
查看>>
SDN网络在大规模数据中心的实践
查看>>
大数据:大变革、大机遇
查看>>
Python并发编程:锁、信号量和条件变量
查看>>
Hadoop平台中SQL优化的四个思路
查看>>
私有云是真正的云吗
查看>>
《UNIXLinux程序设计教程》一1.5 示例程序和编译环境
查看>>
众怒难犯 三星在李在镕接班计划上采取迂回策略
查看>>
Mellanox亚太及中国区市场开发高级总监刘通 —— 未来3年内25G将成数据中心主流网络...
查看>>
禅城再探索 大数据产业化
查看>>
论UI架构在微服务中的重要性
查看>>
微软Office惊曝严重漏洞:修复方法在此
查看>>
日本研究人员实验成功100Gbps无线宽带连接
查看>>
Aqua Comms携手Ciena 测试海底光缆网络150Gbps波长传输
查看>>