QDomDocument类是用于处理XML文档的一个类。QDomDocument提供了对文档数据访问的一系列功能,主要功能包括如下:
解析XML文档:QDomDocument可以将XML文档解析为树形结构,每个节点都是一个QDomNode对象,可以通过QDomNode对象的方法来访问和修改节点属性和内容。
创建XML元素和文本节点:QDomDocument类提供了创建新元素(createElement)和创建新文本节点(createTextNode)的工厂方法。
生成XML文档:QDomDocument类提供了生成XML文档的方法,如toByteArray()和toString(),可以将生成的XML文档转换为字节数组或字符串。
查询和修改XML文档:QDomDocument类提供了一些常用的操作,如获取或设置元素的属性、获取或修改元素的内容等。
头文件:#include <QDomDocument>
cmake:find_package(Qt6 REQUIRED COMPONENTS Xml)
target_link_libraries(mytarget PRIVATE Qt6::Xml)
qmake:QT += xml
继承于:QDomNode
XML全称是可扩展标记语言(Extensible Markup Language),XML是标准通用标记语言(SGML)的一个子集。XML主要用于标记电子文件,使其具有结构性。它可以用来标记数据、定义数据类型,是一种允许用户定义自己的标记语言的源语言。
XML文本格式一般包含以下几部分:
声明部分:XML文件的声明部分包括XML版本号和字符集声明,格式例子:。
根元素:一般情况下XML文件中的所有元素都包含在一个根元素中。根元素是XML文件的起点。
元素:XML文件中的元素包含一个开始标记、一个结束标记和中间的数据。元素的格式:data。其中element为元素的名称,data为元素的数据。
属性:XML文件中的元素可以包含属性,属性用于描述元素的特性。属性的格式:data。其中attribute为元素的某个属性名称,对应value是属性的值,元素可以包含多个属性值。
以下XML文档例子,bookstore是根元素,它包含三个book子元素。每个book元素有一个type属性,同时都有一些子元素,如title、author、genre、price和description,这些子元素分别表示书的标题、作者、类型、价格和描述。
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book type="100">
<title>标杆人生</title>
<author>华理克</author>
<genre>哲理类</genre>
<price>25.99</price>
<description>第一本书。</description>
</book>
<book type="200">
<title>原则</title>
<author>瑞利欧</author>
<genre>管理类</genre>
<price>35.99</price>
<description>第二本书。</description>
</book>
<book type="300">
<title>系统之美</title>
<author>德内拉梅多斯</author>
<genre>管理学</genre>
<price>45.99</price>
<description>第三本书。</description>
</book>
</root>
第一个加入到QDomDocument文档的子节点为根节点。
/**** 例子: ****/
#include <QDomDocument>
// 创建QDomDocument对象。
QDomDocument doc;
// 创建根元素节点,并加到入QDomDocument文档中。
QDomNode root_element = doc.createElement("root");
doc.appendChild(root_element);
/**** 例子: ****/
// 创建普通子节点,并添加到根节点。
QDomNode child_node1 = doc.createElement("node1");
root_element.appendChild(child_node1);
child_node1.appendChild(doc.createTextNode("text data"));
/**** 例子: ****/
// 创建元素节点,并添加到根节点。
QDomElement child_node2 = doc.createElement("node2").toElement();
root_element.appendChild(child_node2);
// 设置子元素节点属性。
child_node2.setAttribute("type", "100");
// 设置子元素节点的内容。
child_node2.appendChild(doc.createTextNode("attribute node content"));
indent用于指定缩进空格个数,一般给4个即可。
QDomNode::EncodingPolicy用于指定序列化时使用的编码。
QDomNode::EncodingPolicy宏定义如下:
QDomNode::EncodingFromDocument 1 编码是从文档中获取。(默认)
QDomNode::EncodingFromTextStream 2 编码是从QTextStream中获取。
// 访问函数。
void save(QTextStream &stream, int indent, QDomNode::EncodingPolicy encodingPolicy=QDomNode::EncodingFromDocument) const
/**** 例子: ****/
#include <QFile>
#include <QTextStream>
// 将XML保存到文件。
QFile file("newExample.xml");
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream out(&file);
doc.save(out, 4); // 保存XML文件,并设置为4个空格的缩进。
file.close();
}
首先创建一个QDomDocument文档对象,创建一个root根元素节点。然后,分别添加一个普通文本子节点node1,一个带属性和文本节点的子节点node2,一个带属性和包括多个子元素的子节点node3。
最后,创建一个QFile通过,并且通过QTextStream流包装,再利用QDomDocument的save方法,装XML内容保存到"newExample.xml"文件。
#include <QCoreApplication>
#include <QDomDocument>
#include <QFile>
#include <QTextStream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建QDomDocument对象。
QDomDocument doc;
// 创建根节点。
QDomNode root_element = doc.createElement("root");
doc.appendChild(root_element);
// 创建普通子节点。
QDomNode child_node1 = doc.createElement("node1");
root_element.appendChild(child_node1);
// 设置子节点的内容。
child_node1.appendChild(doc.createTextNode("普通文本内容"));
// 创建带属性子节点。
QDomElement child_node2 = doc.createElement("node2").toElement();
root_element.appendChild(child_node2);
// 设置子节点属性。
child_node2.setAttribute("type", "100");
// 设置子节点的内容。
child_node2.appendChild(doc.createTextNode("属性节点内容"));
// 创建带属性子节点,下面再包括子节点。
QDomElement child_node3 = doc.createElement("node3").toElement();
root_element.appendChild(child_node3);
// 设置子节点属性。
child_node3.setAttribute("type", "200");
// 添加title子节点。
QDomNode title_node = doc.createElement("title");
title_node.appendChild(doc.createTextNode("QDomDocument sample"));
child_node3.appendChild(title_node);
// 添加author子节点。
QDomNode author_node = doc.createElement("author");
author_node.appendChild(doc.createTextNode("20YC编程"));
child_node3.appendChild(author_node);
// 将XML写入文件。
QFile file("newExample.xml");
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream out(&file);
// 保存XML文件,并设置为4个空格的缩进。
doc.save(out, 4);
file.close();
}
return 0;
}
运行这个程序将创建一个名为"newExample.xml"的XML文档文件。
newExample.xml内容如下:
<root>
<node1>普通文本内容</node1>
<node2 type="100">属性节点内容</node2>
<node3 type="200">
<title>QDomDocument sample</title>
<author>20YC编程</author>
</node3>
</root>
关注公众号下载本示例完整源码(02_QDomDocument_WriteXml.zip)。
-【End】-
#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。
喜欢本文章,记得点赞、分享、关注哦~