Qt6.5示例:QDomDocument类封装XML文档和文件

发布时间:2024年01月16日

01 QDomDocument介绍

QDomDocument类是用于处理XML文档的一个类。QDomDocument提供了对文档数据访问的一系列功能,主要功能包括如下:

解析XML文档:QDomDocument可以将XML文档解析为树形结构,每个节点都是一个QDomNode对象,可以通过QDomNode对象的方法来访问和修改节点属性和内容。

创建XML元素和文本节点:QDomDocument类提供了创建新元素(createElement)和创建新文本节点(createTextNode)的工厂方法。

生成XML文档:QDomDocument类提供了生成XML文档的方法,如toByteArray()和toString(),可以将生成的XML文档转换为字节数组或字符串。

查询和修改XML文档:QDomDocument类提供了一些常用的操作,如获取或设置元素的属性、获取或修改元素的内容等。

02 如何使用QDomDocument

头文件:#include <QDomDocument>

cmake:find_package(Qt6 REQUIRED COMPONENTS Xml)

target_link_libraries(mytarget PRIVATE Qt6::Xml)

qmake:QT += xml

继承于:QDomNode

03 XML文档介绍

XML全称是可扩展标记语言(Extensible Markup Language),XML是标准通用标记语言(SGML)的一个子集。XML主要用于标记电子文件,使其具有结构性。它可以用来标记数据、定义数据类型,是一种允许用户定义自己的标记语言的源语言。

XML文本格式一般包含以下几部分:

声明部分:XML文件的声明部分包括XML版本号和字符集声明,格式例子:。

根元素:一般情况下XML文件中的所有元素都包含在一个根元素中。根元素是XML文件的起点。

元素:XML文件中的元素包含一个开始标记、一个结束标记和中间的数据。元素的格式:data。其中element为元素的名称,data为元素的数据。

属性:XML文件中的元素可以包含属性,属性用于描述元素的特性。属性的格式:data。其中attribute为元素的某个属性名称,对应value是属性的值,元素可以包含多个属性值。

  • XML文档示例:

以下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>

04 QDomDocument封装XML文档方法

  • 创建元素节点示例:

第一个加入到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"));
  • 保存XML文件示例:

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();
}

05 QDomDocument封装XML文件示例

首先创建一个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>

06?附录:完整源码

关注公众号下载本示例完整源码(02_QDomDocument_WriteXml.zip)。

-【End】-

#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。

喜欢本文章,记得点赞、分享、关注哦~

文章来源:https://blog.csdn.net/yanghz/article/details/135371733
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。