Qt6.5示例:QDomDocument类解析XML文档和文件

这篇具有很好参考价值的文章主要介绍了Qt6.5示例:QDomDocument类解析XML文档和文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qt6.5示例:QDomDocument类解析XML文档和文件,Qt6.5示例,xml,Qt解析XML,QDomDocument

01 QDomDocument介绍

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

解析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>
        
</bookstore>

04 QDomDocument解析XML文档方法

  • setContent方法:

QDomDocument支持通过文件(QIODevice)、原始数据(QByteArray)和字符串(QString)等方式解析XML。

// 访问函数。
bool setContent(QIODevice* dev, QString *errorMsg=nullptr, int *errorLine=nullptr, int *errorColumn=nullptr );
bool setContent(const QByteArray& text, QString *errorMsg=nullptr, int *errorLine=nullptr, int *errorColumn=nullptr );
bool setContent(const QString& text, QString *errorMsg=nullptr, int *errorLine=nullptr, int *errorColumn=nullptr );
bool setContent(QXmlInputSource *source, QString *errorMsg=nullptr, int *errorLine=nullptr, int *errorColumn=nullptr );
  • 打开XML文件示例:

文档类QDomDocument继承于QDomNode类。

/**** 例子: ****/

#include <QDomDocument>
#include <QFile>

// 打开XML文件。
QFile file("bookstore.xml");
file.open(QIODevice::ReadOnly);

// 创建 QDomDocument 对象。
QDomDocument doc;
doc.setContent(&file);
  • 获取根节点元素示例:

根节点QDomElement继承于QDomNode类。

/**** 例子: ****/

// 获取根节点元素。
QDomElement root_element = doc.documentElement();
  • 遍历子节点示例一:

/**** 例子: ****/

// 获取第一个子节点。
QDomNode node = root_element.firstChild();
while (!node.isNull())
{
    if (node.isElement())
    {
        // 解析元素节点。
        QDomElement element = node.toElement();
        QString name = element.tagName();
        QString text = element.text();
        // 元素属性。
        QDomNamedNodeMap arrtibutes = element.attributes();
    }
    else if (node.isText())
    {
        // 解析文本节点。
        QDomText text = node.toText();
        QString textValue = text.data();
    }
    else if (node.isAttr())
    {
        // 解析属性节点。   
        QDomAttr attr = node.toAttr();
        QString attrName = attr.name();
        QString attrValue = attr.value();
    }
    // else if (...) {}
    
    // 移动到下一个节点继续处理。
    node = node.nextSibling();
}
  • QDomNode::NodeType节点类型:

QDomNode::NodeType用于表示DOM(文档对象模型)节点类型。

QDomNode::NodeType宏定义如下:

QDomNode::ElementNode 1 元素节点。

QDomNode::AttributeNode 2 属性节点。

QDomNode::TextNode 3 文本节点。

QDomNode::CDATASectionNode 4 字符数据节点。

QDomNode::EntityReferenceNode 5 实体引用节点。

QDomNode::EntityNode 6 实体节点。

QDomNode::ProcessingInstructionNode 7 处理指令节点。

QDomNode::CommentNode 8 注释节点。

QDomNode::DocumentNode 9 文档节点。

QDomNode::DocumentTypeNode 10 文档类型节点。

QDomNode::DocumentFragmentNode 11 文档片段节点。

QDomNode::NotationNode 12 符号节点。

  • 遍历子节点示例二:

/**** 例子: ****/

// 获取子节点列表。
QDomNodeList child_nodes = root_element.childNodes();
// 遍历子元素。
for (int i=0; i<child_nodes.size(); ++i)
{
    QDomNode node = child_nodes.at(i);
    if (node.isElement())
    {
        // 解析元素。
        QDomElement element = node.toElement();
        QString name = element.tagName();
        QString text = element.text();
        // 元素属性。
        QDomNamedNodeMap arrtibutes = element.attributes();
    }
    // else if (...) {}    
}
  • 通过标签名称(节点名称)查询节点示例:

/**** 例子: ****/

// 通过标签名称,查找所有子节点。
QDomNodeList node_list = root_element.elementsByTagName("book");
// 遍历所有子节点。
for (int i=0; i<node_list.count(); ++i)
{
    QDomElement element = node_list.at(i).toElement();
    // 通过节点名称,再获取它的子节点。
    QDomElement title_element = element.namedItem("title").toElement();
    QDomElement author_element = element.namedItem("author").toElement();
    QString qstr_title = title_element.text();
    QString qstr_author = author_element.text();
    qDebug() << "book child: title = " << qstr_title << ", author = " << qstr_author;
}
  • 遍历元素属性列表示例:

/**** 例子: ****/

// 元素属性。
QDomNamedNodeMap arrtibutes = element.attributes();
// 遍历属性。
for (int i=0; i<arrtibutes.count(); ++i)
{
    // 属性节点。
    QDomAttr dom_attr = arrtibutes.item(i).toAttr();
    // 属性名称。
    QString arrtibute_name = dom_attr.name();
    // 属性值。
    QString arrtibute_value =dom_attr.value();
    qDebug() << "arrtibute: " << arrtibute_name << " = " << arrtibute_value;
}

05 QDomDocument解析XML文件完整示例

首先创建一个QFile对象,打开"bookstore.xml"文件。然后,我们创建一个QDomDocument对象,并将文件设备传递给它。接下来,我们获取根元素节点,然后遍历根元素所有子节点,并且根据子节点不同类型,做相应转换处理,并在屏幕上打印节点的名称,节点文本和节点属性值等功能。

  • 示例代码:

#include <QCoreApplication>
#include <QDomDocument>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    // 打开XML文件。
    QFile file("bookstore.xml");
    if (!file.open(QIODevice::ReadOnly))
    {
        return -1;    
    }
    
    // 创建QDomDocument对象。
    QDomDocument doc;
    if (!doc.setContent(&file)) // 指定解析QFile内容。
    {
        file.close();
        return -1;    
    }
    file.close();
    
    // 获取根节点。
    QDomElement root_element = doc.documentElement();
    
    // 遍历子节点并处理。
    QDomNode node = root_element.firstChild();
    while (!node.isNull())
    {
        if (node.isElement())
        {
            // 元素节点。
            QDomElement element = node.toElement();
            QString name = element.tagName();
            QString value = element.text();
            qDebug() << "isElement:" << node.nodeName() << ", " << name << " : " << value;

            // 元素属性和内容。            
            QDomNamedNodeMap arrtibutes = element.attributes();
            // 遍历元素属性。
            for (int i=0; i<arrtibutes.count(); ++i)
            {
                QDomNode arrtibute_node = arrtibutes.item(i);
                // 属性名称。
                QString arrtibute_name = arrtibute_node.nodeName();
                // 属性值。
                QString arrtibute_value = arrtibute_node.nodeValue();
                qDebug() << "arrtibute: " << arrtibute_name << " = " << arrtibute_value;
            }
            
            // 如果有子节点,可以继续处理。
            // ...
                    
        }
        else if (node.isText())
        {
            // 文本节点。
            QDomText dom_text = node.toText();
            // 文本内容。
            QString text = dom_text.data();
            qDebug() << "isText:" << node.nodeName() << " : " << text;
            
        }
        else if (node.isAttr())
        {
            // 属性节点。
            QDomAttr dom_attr = node.toAttr();
            // 属性名称。
            QString name = dom_attr.name();
            // 属性值。
            QString value = dom_attr.value();
            qDebug() << "isAttr:" << node.nodeName() << ", " << name << " = " << value;

        }
        // else if (...) {}
        // 更多节点类型处理逻辑。

        // 移动到下一个节点继续处理
        node = node.nextSibling();
    }
    
    return 0;
}

06 附录:完整源码

关注公众号下载本示例完整工程源码(01_QDomDocument_ReadXml.zip)。

Qt6.5示例:QDomDocument类解析XML文档和文件,Qt6.5示例,xml,Qt解析XML,QDomDocument

-【End】-

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

Qt6.5示例:QDomDocument类解析XML文档和文件,Qt6.5示例,xml,Qt解析XML,QDomDocument

喜欢本文章,记得点赞、分享、关注哦~文章来源地址https://www.toymoban.com/news/detail-807033.html

到了这里,关于Qt6.5示例:QDomDocument类解析XML文档和文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt xml解析之QXmlStreamReader

    项目中遇到需要解析某个方法返回的xml字符串,奈何C/C++中没有原生的方法可供调用,只能使用第三方库,搜了一圈资料发现都不好用。刚好项目中用的Qt,瞬间想到了Qt中提供的各种各样的函数,去仔细查了一下Qt中提供的函数——QXmlStreamReader,真救命稻草,几行代码就搞定

    2024年02月10日
    浏览(43)
  • C++QT开发——Xml、Json解析

    可扩展标记语言,标准通用标记语言(Extensible Markup Language)的子集,简称XML,是一种定义电子文档结构和描述其内容的国际标准语言,被设计用来传输和存储数据。 可扩展标记语言与Access],Oracle]和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:

    2024年02月06日
    浏览(47)
  • 【Java】Maven配置文件帮助文档(settings.xml 和 pom.xml)

    以下几个属性是 settings 属性的下一级属性: localRepository interactiveMode offline pluginGroups proxies servers mirrors profiles activeProfiles localRepository:本地仓库的路径,默认值为 ${user.home}/.m2/repository interactiveMode:表示Maven是否需要和用户交互以获得输入 offline:表示Maven是否需要在离线模式

    2024年02月13日
    浏览(55)
  • 探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义

    DTD 是文档类型定义(Document Type Definition)的缩写。DTD 定义了 XML 文档的结构以及合法的元素和属性。 通过使用 DTD,独立的团体可以就数据交换的标准 DTD 达成一致。 应用程序可以使用 DTD 来验证 XML 数据的有效性。 如果 DTD 在 XML 文件内声明,它必须包裹在 DOCTYPE 定义内:

    2024年04月26日
    浏览(37)
  • qt读写xml文件

    Qt使用XML模块,在.pro文件中添加 QT += xml Qt 提供了三种读 写  XML 文档的方法: QXmlStreamReader / QXmlStreamWriter: 一种快速的基于流的方式访问良格式 XML 文档 , 特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一

    2024年02月11日
    浏览(44)
  • 利用Qt输出XML文件

    使用Qt输出xml文件 写入生成的xml文件如下:

    2024年02月02日
    浏览(52)
  • qt xml文件写入读取

    ****************************************************************************** QT       += core gui xml ****************************************************************************** #include \\\"mainwindow.h\\\" #include QDomDocument #include QTextStream #include QFile #include QDebug MainWindow::MainWindow(QWidget *parent)     : QMainWindow(parent) {    

    2024年02月09日
    浏览(41)
  • Qt XML文件读、写、修改

    1.1 使用的库 1.2 主体语句 头部创建: 内容创建: 1.3 详细例子说明 .cpp文件

    2024年02月11日
    浏览(45)
  • Mapper.xml文件解析

     最近在做一个分布式项目,看到xml文件原先只是上网CV,还是要搞清楚吧! 下面是一个Mybatis的SQL映射文件的配置 这个元素定义了命名空间,用于标识这个映射文件对应的接口。在这里,命名空间指向了 cn.itedus.lottery.infrastructure.dao.IActivityDao 这个接口,表示这个映射文件用

    2024年02月10日
    浏览(43)
  • 解析XML文件

    什么是XML? xml指可扩展语言(extendsible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 xml被设计用来传输和存储数据。 xml是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。 它也是元标记语言,

    2024年02月06日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包