Qt使用QDom解析XML文件

Qt:QDom解析XML总结 Qt+XML界面设计(上) 拾枝杂谈 最近也是一直在用Qt+XML+qss开发界面,所以总结一下这套前端的架构模式。主要的构成就是用xml写出界面需要用到的控件以及布局,利用Qt中的QDom类对xml进行解析,解析并获取xml中参数后,创建Qt相关的控件,并且在qss中设计出具体的控件样式。最后得到一套完整的Qt+XML+qss界面架构模型,在整个模型中,界面的绘制直接依靠xml去实现即可,少部分代码添加进解析程序中,复用性尚可。 QDom简介 QDom其实是Qt中一个很大的类,写一天可能也写不完,其中包含着QDomcument 阅读详情

        QDom处理XML文件时,一次性读入整个XML文档,在内存中构造一棵树。我们可以访问这棵树,在树上移动,比如移动到下一个节点,或者返回到上一个节点,也可以修改这棵树,以及将这棵树保存为XML文件。

        在DOM树中有很多函数,这些函数很多都是返回QDomNode类型,我们可以通过函数isXXX(),如isAttr()等来判断节点类型,也可以通过toXXX()来转换节点类型。

帮助文档的示例:

QDomDocument d;
d.setContent(someXML);
QDomNode n = d.firstChild();
while (!n.isNull()) {
    if (n.isElement()) {
        QDomElement e = n.toElement();
        cout << "Element name: " << e.tagName() << Qt::endl;
        break;
    }
    n = n.nextSibling();
}

         下面示例演示解析一个XML文件,并可以修改XML文件项的参数值并写回XML文件。

主要代码:

void XmlFileRW::getXmlFile(QString path){

    mapNode.clear();
    if(tree != nullptr){
        disconnect(tree);
        tree->setParent(nullptr);
        delete tree;
    }

    tree = new QTreeWidget(this);
    tree->setStyleSheet("QTreeWidget::item{height:25px}");
    ui->mainLayout->addWidget(tree);
    QFile file(path);
    if(!file.open(QIODevice::ReadOnly)) return;
    if(!doc.setContent(&file)){
        file.close();
        return;
    }
    file.close();

    tree->clear();
    tree->setColumnCount(5);
    tree->setColumnWidth(0,350);
    tree->setColumnWidth(1,350);
    itemStart = new QTreeWidgetItem;
    itemStart->setText(0, "start to processing");
    tree->addTopLevelItem(itemStart);

    QDomElement docElem = doc.documentElement();
    QDomNode n = docElem.firstChild();
    while(!n.isNull()) {
        QDomElement e = n.toElement();
        if(!e.isNull()) {
//            qDebug() << e.tagName();
            QTreeWidgetItem *item = new QTreeWidgetItem(itemStart);
            item->setText(0,e.tagName());
            for(int i= 0; i < e.attributes().size(); i++){
//                qDebug() << e.attributes().item(i).nodeName();
//                qDebug() << e.attributes().item(i).nodeValue();
                item->setText(i+1,e.attributes().item(i).nodeName() + ":" + e.attributes().item(i).nodeValue());
            }
//            if(e.isText()) qDebug()<<"hh"<<e.text();
            mapNode[item] = e;
            traverXmlFile(e, item);
        }
        n = n.nextSibling();
    }
}

void XmlFileRW::traverXmlFile(QDomElement e, QTreeWidgetItem *parent){
    QDomNode n = e.firstChild();
    while(!n.isNull()) {
        QDomElement e = n.toElement();
        if(!e.isNull()) {
//            qDebug() << e.tagName();
            QTreeWidgetItem *item = new QTreeWidgetItem(parent);
            item->setText(0,e.tagName());
            for(int i= 0; i < e.attributes().size(); i++){
//                qDebug() << e.attributes().item(i).nodeName();
//                qDebug() << e.attributes().item(i).nodeValue();
                item->setText(i+1,"attributes:"+e.attributes().item(i).nodeName() + ":" + e.attributes().item(i).nodeValue());
            }
            QDomNode ee = e.firstChild();
            while (!ee.isNull()) {
                if(ee.isText())
                {
//                    qDebug() << ee.toText().nodeValue();
                    item->setText(e.attributes().size()+1,ee.toText().nodeValue());
                }
                ee = ee.nextSibling();
            }
//            connect(item,&QTreeWidgetItem::)
            mapNode[item] = e;
            traverXmlFile(e, item);
        }
        n = n.nextSibling();
    }
}

void XmlFileRW::slotfixMsg(QTreeWidgetItem *item, QString tagName, QString attributes, QString text){
    QLayoutItem *child;
     while ((child = ui->gridLayout->takeAt(0)) != 0)
     {
         if(child->widget())
         {
             child->widget()->setParent(NULL);
         }
         delete child->widget();
     }
     ui->gridLayout->setAlignment(Qt::AlignCenter);

     QLabel *tagLabel = new QLabel("TagName:");
     QLineEdit *tagEdit = new QLineEdit(tagName);
     ui->gridLayout->addWidget(tagLabel,0,0);
     ui->gridLayout->addWidget(tagEdit,0,1);

     QList<QLabel*> attrLabelList;
     QList<QLineEdit*> attrEditList;
     QStringList attr = attributes.split("||");
     attr.removeOne("");
     for(int i =0 ; i < attr.size();i++){
         if(attr.at(i).split(":").size() !=3) continue;
         QLabel *label = new QLabel(attr.at(i).split(":").at(1));
         QLineEdit *edit = new QLineEdit(attr.at(i).split(":").at(2));
         ui->gridLayout->addWidget(label,i+1,0);
         ui->gridLayout->addWidget(edit,i+1,1);
         attrLabelList.append(label);
         attrEditList.append(edit);
     }

     QLineEdit *txtEdit{nullptr};
     if(text != ""){
         QLabel *tagLabel = new QLabel("Text:");
         QLineEdit *tagEdit = new QLineEdit(text);
         ui->gridLayout->addWidget(tagLabel,attr.size()+1,0);
         ui->gridLayout->addWidget(tagEdit,attr.size()+1,1);
         txtEdit = tagEdit;
     }

     QPushButton *btn = new QPushButton("SaveChange");
     ui->gridLayout->addWidget(btn,attr.size()+2,0,1,2);
     connect(btn, &QPushButton::clicked, [=]{
         item->setText(0,tagEdit->text());
         mapNode[item].toElement().setTagName(tagEdit->text());

         for(int i = 0;i < attrLabelList.size(); i++){
             QString tmpAttrName = attrLabelList.at(i)->text();
             QString tmpAttrValue = attrEditList.at(i)->text();
             item->setText(i+1,"attributes:"+tmpAttrName+":"+tmpAttrValue);
             mapNode[item].toElement().removeAttribute(tmpAttrName);
             mapNode[item].toElement().setAttribute(tmpAttrName, tmpAttrValue);
         }

         if(txtEdit != nullptr && !mapNode[item].toElement().firstChild().isNull()){
             mapNode[item].toElement().firstChild().toText().setNodeValue(txtEdit->text());
             item->setText(attrLabelList.size()+1,txtEdit->text());
         }

         QFile file(xmlPath);
         if (!file.open(QFile::WriteOnly|QFile::Truncate | QFile::Text))//1.QFile::WriteOnly如果文件不存在,则创建;2.QFile::Truncate打开的同时清空
         {
             return false;
         }
         QTextStream stream(&file );
         stream.setCodec("utf-8");
         doc.save(stream,4,QDomNode::EncodingFromTextStream);
         file.close();
     });
}

演示截图(可以点击修改):

 示例代码地址:csdnDemo: 优快云博客示例代码存档

Qt解析XML相关(QDom方式) 以下两个函数可以直接查询XML节点(QDomNode)是否存在名字tagName的子节点,不需要遍历子节点  firstChildElement namedItem /** * Shortcut to avoid dealing with QDomNodeList * all the time. */ QDomNode namedItem 阅读详情

相关推荐

Qt 解析XML方式(一)DOM

一.简介 如果要使用xml解析,需要在 pro 文件中 添加 xml模块 需要用到的类 QDomDocument:表示整个XML文档。从概念上讲,它是文档树的根,并提供对文档数据的主要访问。 QDomElement:表示DOM树中的一个元素。 QDomNode:DOM树中所有节点的基类,DOM中的许多函数都返回QDomNode。 QDomAttr:表示QDomElement的一个属性。 采用DOM的方式,是将XML文件表示成一棵树,意思就是将xml文件读入到内存中。 优点:可以方便的操作内存中

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2005

QDom的概念

凡是开头加QDom前缀的都是代表节点类型。所以有,QDomElement代表一个Element节点,而QDomText代表一个Text节点。QDomNode类可以存储任意类型的节点。如果想进一步处理一个节点,首先必须把它转化为正确的数据类型。QDomNode调用toElement()以把它转化成QDomElement,然后调用tagName()来获得元素的标签名称。如果节点不是Element类型,那么toElement()函数就返回一个空QDomElement对象和一个空标签。

Spoon的博客 1590

Qt 之 XML

XML(EXtensible Markup Language - 可扩展标记语言)是一种用于记录多种数据类型的标记语言。使用 XML 可以将各类型的文档定义为容易读取的格式,便于用户读取。而且,在应用程序中使用 XML,可以轻松实现数据交换。

青春不老,奋斗不止! 1万+

qt的xml读写和QDomDocument、QDomElement、QDomNode、QDomNamedNodeMap讲解

关于xml存在节点中嵌入节点,多次嵌套,你可以通过nodeType()来判断类型然后根据类型进行转换,并且同时通过attributes()来判断字段数,来遍历获取值。转换后在来进行判断是否为其它类型,一直到nodeType()它为TextNode,就不用再转了,此时已经为最后一层了。根据类型转换后,可以通过nodeName()来获取节点名称,通过text()获取节点文本。拿到所有外部节点后,判断这个节点的类型,通过nodeType()获取节点类型,然后根据类型进行转换。

weixin_43246170的博客 2933

Qt 之解析 XML(QXmlStreamReader)

QXmlStreamReader 类提供了一个快速解析器,用于通过简单的流 API 读取格式良好的 XML。与之相对应的是 QXmlStreamWriter(写入 XML)。

青春不老,奋斗不止! 2万+

Qt 之 XML(DOM)

DOM(Document Object Model - 文档对象模型)定义了访问和操作 XML 文档的标准方法。

青春不老,奋斗不止! 9119

Qt解析Xml及excel

项目中经常使用Xml格式的文件及表格来保存数据,不免要对这些文件进行操作。本文简单介绍了Qt对Xml文件及excel文件的常用操作。 Qt 5.12.3+MinGW 64bit 一. Xml解析 Qt解析Xml大概有三种方式:QDOM,QXmlSimpleReader,QXmlStreamReader,本文使用第一种方式。 1. 配置 .pro文件里加Qt += xml;C++头文件中加#incl...

z_QaQ的博客 1034

Qt框架下基于DOM的XML解析教程

对于结构复杂的XML,使用DOM可能不是最佳选择。可以使用正则表达式或者第三方库来处理特定部分,或者自行开发基于规则的解析器。

weixin_33298352的博客 857

Qt之XML读写操作——含Demo

Qt之XML读写操作

ManagerUser的博客 2652

Twin Builder CFD 示例:构建、验证和评估静态 ROM

通过我们构建、验证和评估静态 ROM 的综合指南,释放 Twin Builder CFD 的潜力。

jkh920184196的博客 1102

OpenMV模块视觉测距(避障)+颜色识别+TFT-LCD显示(实现原理与代码分析)

上图所示代码实际运行的帧率比较低,主要原因有以下两个:1.硬件问题,博主使用的版本比较低,可以尝试使用高版本OpenMV2.图像滤波问题。之前加入图像滤波是想提高色块识别的准确性,但是相应的运算速度也会下降。

ediykk的博客 1万+

XML语言数据读写理解3

首先先把我们要读取的xml文件搞上来: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Appearance> <ROOT> <Mode> <firstEle> <A id = "1"> <T param1="42323" param2="2356" pa...

Dezeming的博客 6360

黑马程序员Pink的javaScript课程APIday4

本文摘要:介绍了JavaScript中日期对象的实例化方法(有参/无参)及三种获取时间戳的方式。讲解了DOM节点操作,包括节点查找(父、子、兄弟节点)、增加/克隆/删除节点的方法。详细说明了移动端touch事件和Swiper插件的使用,包括自动播放和小圆点配置。最后提及学成在线案例中表单验证和取消默认跳转的实现。

JLY19970726的博客 825

操作xml字符串_实战PyQt5: 127-处理XML文档

XML文档的简单和易扩展属性使其可以很方便地在任何程序中读/写数据。 比如在QT开发中,其常见的ui,qrc 后缀的文件都是一种XML格式的文档。QT提供类 QDomDocument来处理XML文档。QDomDocment简介QDomDOcument类代表整个XML文档。从概念上讲,它是文档树的根,并提供对文档的访问。由于元素(elment), 文本节点(text node), 注释(commen...

weixin_39603604的博客 252

Blender - Shrinkwrap - 更方便的制作贴合模型的表面来建模

Shrinkwrap 修改器 使用 Blender 想要快速建模可以贴合现有模型表面的效果:衣服、皮肤、等效果,可以使用 Shrinkwrap 修改器,这个修改器的名字其实按照英文上的理解,翻译为:收缩的包裹效果 应用 如这块铁皮,它要贴合机身弯曲的效果,可以先建好一个铁皮,再 Shrinkwrap 到一个指定的网格上 留意的参数 Target 要贴合的对象(目前我已知是可以贴合到网格对象上,实在是方便) VertexGroup 顶点组,和之前讲到过的,顶点组可以组设顶点的权重,意思这个可.

Jave.Lin 的学习笔记 6068

【MMDetection3.0实战】从零构建自定义数据集训练流程

本文详细介绍了使用MMDetection3.0框架从零开始构建自定义目标检测数据集的完整训练流程。内容涵盖环境配置、COCO格式数据准备、核心代码改造、模型配置与训练策略调优,以及最终的模型测试与验证,帮助开发者快速上手并训练自己的检测模型。

l6m7n8的博客 313

Qt XML的使用

Qt中对于XML文件的写入有两种方式,一个是使用QXmlStreamWriter,另一个则为使用Dom。stream流的形式相对来说更加灵活,而且适合处理大文件。Dom方式由于是将内容加载到了内存中进行操作,所以对于小内存设备则有一定得局限性。 根据《QtCreator快速入门》和网上的一些例子练习了Qt XML的使用,做一个记录,以下是采用Dom方式实现的 实现界面 编写的XML文件 ...

weixin_34160277的博客 273

OpenClaw实战系列04:Jira/Confluence深度集成实战指南

汇总 Confluence 空间 TEAM 下所有关于“性能优化”的文档,输出要点自然语言创建和查询 Jira 任务,无需离开聊天工具基于 Confluence 的私有知识库问答,让 AI 真正理解团队文档Jira 与 Confluence 联动,打通项目管理与知识管理定时同步与通知,自动化团队信息流转至此,你的 OpenClaw AI 助理已经不仅是一个聊天机器人,而是真正融入团队工作流的“智能项目管理助手”。下一期我们将带来OpenClaw 自定义技能开发实战。

PeterPan的博客 572

Qt C++ :XML文件处理工具 <QXml>模块

Qt XML处理模块提供多种解析方式,包括流式读写(QXmlStreamReader/Writer)、DOM模型(QDomDocument)和高级查询工具(QXmlQuery)。QDom模块适合小型XML文档的随机访问和修改,核心类包括QDomDocument、QDomElement等。具体操作涵盖:创建/加载文档、遍历节点、查询元素、增删改节点以及保存文件。

qq_39281631的博客 1186

从代码仓库到知识库:自动化构建与RAG技术实践

在软件工程领域,代码库的规模与复杂性日益增长,如何高效管理和利用其中的知识成为关键挑战。传统文档工具主要依赖注释提取API信息,而现代知识构建技术则通过抽象语法树(AST)解析、自然语言处理等手段,深入理解代码结构、调用关系和业务逻辑。其核心价值在于将非结构化代码转化为机器可理解、可检索的结构化知识,显著提升代码资产的可维护性和团队协作效率。这一过程通常涉及代码解析、信息提取、向量化表示和存储索引四个关键阶段,其中向量化技术将代码语义转化为高维向量,为语义搜索奠定基础。结合检索增强生成(RAG)架构,开发者

weixin_42545292的博客 411

【YOLOv11多模态融合改进】| CVPR2025 LCA轻量交叉注意力 双向模态交叉引导 + 双支路噪点抑制,兼顾纹理与热目标特征融合

可见光模态富含纹理、色彩、边缘细节,但夜间/低照度场景信噪比极低,暗区噪声泛滥;红外模态依靠热辐射凸显弱小目标、暗区物体轮廓,但缺失真实色彩与精细纹理。简单拼接/逐加融合仅做浅层特征叠加,无法建立可见光纹理、红外热特征的双向引导关联,两类模态互补信息无法精准互通;普通自注意力仅单模态内部建模,跨模态交互匮乏,红外热目标易被可见光暗噪声淹没,可见光有效纹理易被红外灰度信息覆盖;

Limiiiing的博客 115

QT 之DOM方式解析XML

DOM方式解析XML 一、DOM简介 1、DOM简介 DOM是Document Object Model的简写,即XML文档对象模型,是由W3C提出的一种处理XML文档的标准接口。 DOM 一次性读入整个XML文档,在内存中构造为一棵树(DOM树)将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些。能够在这棵树上进行导航,比如移动到下一节点或者返回上一节...

化天际的相遇---博客 3629

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

DOM方式:解析XML

DOM是Document Object。

zxf347085420的博客 1413

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

qt中xml的使用

1 XML简介XML是ExtensibleMarkup Language的缩写,即可扩展标记语言。它是一种用来创建的标记的标记语言。使用XML标记语言可以做到数据或数据结构在任何编程语言环境下的共享。XML中有格式正规的XML和有效的XML。XML文档的元素一般是由标记头、标记末和标记间的字符串数据构成。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。一般格式:&lt;quote&g...

全栈工程师 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

QT_DOM方式操作xml文件增删改查

DOM是Document ObjectModel的简写,即XML文档对象模型,是由W3C提出的一种处理XML文档的标准接口。 DOM 可以一次性读入整个XML文档,在内存中构造为一棵树(DOM树)将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些。能够在这棵树上进行导航,比如移动到下一节点或者返回上一节点,也可以对这棵树进行修改,或者是直接将这颗树保存为硬盘上的一个 XML 文件。......

Txwtech 2073

Qt中使用QDomDocument和QDomnode来读取xml

Qt中使用QDomDocument和QDomnode来读取xml

aoxuestudy的专栏 3578
上一篇: Qt中使用QXmlStreamReader处理XML文件
下一篇: Qt多线程之QThread
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值