Qt之生成XML(QXmlStreamWriter)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 简述QXmlStreamWriter 类提供了一个使用简单的流 API,用于写入 XML,与之相对应的是 QXmlStreamReader(读取 XML)。正如其相关类,它可以在 setDevice() 指定的 QIODevice 上操作。API 很简单明了:对于想要写的每个 XML 标签或事件,QXmlStreamWriter 都提供了一个专门的函数。简

简述

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 的命名空间支持,并使用重载的方法,而不是使用限定名称。命名空间 http://www.w3.org/XML/1998/namespace 是隐式的,并映射到前缀 xml。

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

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

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

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

使用

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--纯正开源之美,有趣、好玩、靠谱。。。-->
<?xml-stylesheet type="text/css" href="style.css"?>
<!DOCTYPE Blogs [ <!ENTITY Copyright "Copyright 2016《Qt实战一二三》"> <!ELEMENT Blogs (Blog)> <!ELEMENT Blog (作者,主页,个人说明)> <!ELEMENT 作者     (#PCDATA)> <!ELEMENT 主页     (#PCDATA)> <!ELEMENT 个人说明  (#PCDATA)> ]>
<Blogs Version="1.0">
    <Blog>
        <作者>一去丶二三里</作者>
        <主页>http://blog.csdn.net/liang19890820</主页>
        <个人说明>青春不老,奋斗不止!</个人说明>&Copyright;<![CDATA[<Qt分享&&交流>368241647</Qt分享&&交流>]]>&gt;<Empty/>
    </Blog>
</Blogs>

第一行: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("<!DOCTYPE Blogs [ <!ENTITY Copyright \"Copyright 2016《Qt实战一二三》\"> <!ELEMENT Blogs (Blog)> <!ELEMENT Blog (作者,主页,个人说明)> <!ELEMENT 作者     (#PCDATA)> <!ELEMENT 主页     (#PCDATA)> <!ELEMENT 个人说明  (#PCDATA)> ]>"));

    writer.writeStartElement("Blogs");  // 开始根元素 <Blogs>
    writer.writeAttribute("Version", "1.0");  // 属性

    writer.writeStartElement("Blog");  // 开始子元素 <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("<Qt分享&&交流>368241647</Qt分享&&交流>"));
    writer.writeCharacters(">");
    writer.writeEmptyElement(QString::fromLocal8Bit("Empty"));  // 空元素
    writer.writeEndElement();  // 结束子元素 </Blog>

    writer.writeEndElement();  // 结束根元素 </Blogs>
    writer.writeEndDocument();  // 结束文档

    file.close();  // 关闭文件
}

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

更多参考

目录
相关文章
|
XML 数据格式
|
XML JavaScript API
Qt通过Doc模式读取XML并设计一个增删改查方便的操作类
Qt通过Doc模式读取XML并设计一个增删改查方便的操作类
196 0
|
XML JavaScript 数据格式
QT Dom方式操作XML
本文提供了读者已知的XML文件语法结构,对xml基础知识不作介绍,仅介绍了QT操作xml的方法之一。
289 0
|
XML 数据格式
QT5.2 QDomDocument操作xml
QT5.2 QDomDocument操作xml
203 0
QT5.2 QDomDocument操作xml
|
XML 数据格式
Qt 利用XML文档,写一个程序集合 二
接上一篇文章 https://blog.csdn.net/z609932088/article/details/80774663 XML文件的读写
214 0
Qt 利用XML文档,写一个程序集合 二
|
XML 数据格式
Qt 利用XML文档,写一个程序集合 一
接到领导需求安排,说公司未来的硬件设备会越来越多,与每个设备对应的设备检测和设置程序也会增多。导致软甲太多,不好掌控。所以希望做一个完整的软件,但是呢,每个子程序还得独立,应为每个用户购买的设备不是一样的。
118 0
Qt 利用XML文档,写一个程序集合 一
|
XML 编解码 JSON
Qt-QML-C++交互实现文件IO系统-后继-读取XML文件和创建XML文件
在前面两篇中,大致完成了一个文件IO的读和写操作。前面两篇文章链接
328 0
Qt-QML-C++交互实现文件IO系统-后继-读取XML文件和创建XML文件
|
XML 数据格式
Qt 利用XML文档,写一个程序集合 四
接上一个 启动外部程序 https://blog.csdn.net/z609932088/article/details/80775086
95 0
|
XML 数据格式
Qt 利用XML文档,写一个程序集合 三
接上一篇 https://blog.csdn.net/z609932088/article/details/80774950
109 0
|
XML 存储 JavaScript
QT开发(四十一)——XML文件解析基础
  一、XML文档简介   XML(Extensible Markup Language,可扩展标记语言),是一种通用的文本格式,被广泛运用于数据交换和数据存储,而不是显示数据。XML的标签没有被预定义,用户需要在使用时自行进行定义。XML是W3C(万维网联盟)的推荐标准。相对于数据库表格的二维表示,XML使用的树形结构更能表现出数据的包含关系,作为一种文本文件格式,XML简单明了的特性使得它在信息存储和描述领域非常流行。
607 0