解析Xml文件并修改QDomDocument的值

背景:

我需要解决一个bug,需要我从xml中读取数据到QDomDocument,然后获取到我想要的目标信息,然后修改该信息。 

---------------------------------------------------------------------------------------------------------

Qt QDomComment读写Xml文件(含示例源码)_qt qdomdocument 操做xml-CSDN博客

QDomDocument类可以方便地读取和操作XML文件。优点:易于使用XML文档,缺点是相对较慢。

---------------------------------------------------------------------------------------------------

示例Xml文档 

XML 教程 | 菜鸟教程 (runoob.com)

<class><student sex="男" age="18"><id>01</id><name>张三</name></student><student sex="女" age="28"><id>02</id><name>李四</name></student>	
</class>

标签

标签内包含了要传递的信息

它必须成对出现,有开始标签就需要有结束标签。

Xml文件必须包含根元素,它是所有其它元素的父元素

XML文档由元素构成,每个元素包含开始标签,结束标签和元素内容。

例如:<id>02</id>

读取Xml文件的信息

        //XML文件路径QString path = QCoreApplication::applicationDirPath()+"/xxx.xml";qDebug()<<path;//打开XML文件QFile file(path);if(!file.open(QIODevice::ReadOnly)){qDebug()<<"File open faild!";return-1;}//创建QDomDocument对象,用于解析XMLQDomDocument doc;//通过QFile对象设置QDomDocument的内容if(!doc.setContent(&file)){file.close();return -1;}//关闭文件file.close();//解析XML//获取XML根结点QDomElement root = doc.documentElement();//遍历每个student结点//通过标签名获取结点列表QDomNodeList studentList = root.elementsByTagName("student");int listSize = studentList.size();for(int i = 0; i < listSize; ++i){//通过索引获取QDomElement对象QDomElement student = studentList.at(i).toElement();//获取sex属性值QString sex = student.attribute("sex");//获取age属性值QString age = student.attribute("age");/**函数原型为*QDomElement firstChildElement(const QString &tagName = QString()) const;*解析:参数tagName是可选的,表示要查询的子元素结点的标签名。如果指定了tagName,则返回*第一个匹配标签的子元素结点;如果没有指定tagName,则返回第一个子元素结点。**/QString studentID = student.firstChildElement("id").text();       //获取id元素节点的文本内容QString studentName = student.firstChildElement("name").text();   //获取name元素节点的文本内容qDebug()<<"student:";qDebug()<<"sex:"<<sex;qDebug()<<"age:"<<age;qDebug()<<"studentID:"<<studentID;qDebug()<<"studentName:"<<studentName;}

写入Xml文件(代码来自《Qt Creator快速入门》)

QDomDocument doc;QDomProcessingInstruction instruction;instruction = doc.createProcessingInstruction("xml","version = \"1.0\" encoding = \"UTF-8\"");doc.appendChild(instruction);QDomElement root = doc.createElement(QString("书库"));doc.appendChild(root);QDomElement book = doc.createElement(QString("图书"));QDomAttr id = doc.createAttribute(QString("编号"));id.setValue("1");book.setAttributeNode(id);QDomText text;QDomElement title = doc.createElement(QString("书名"));text = doc.createTextNode(QString("Qt"));title.appendChild(text);book.appendChild(title);QDomElement author = doc.createElement(QString("作者"));text = doc.createTextNode(QString("shiming"));author.appendChild(text);book.appendChild(author);root.appendChild(book);QFile file("my.xml");if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))return 0;QTextStream out(&file);doc.save(out,4);file.close();

 

修改书名为《Qt Creator快速入门》 ,作者改为霍亚飞

    //先把信息读取出来//XML文件路径QFile file("my.xml");if(!file.open(QIODevice::ReadOnly)){qDebug()<<"File open faild!";return -1;}//创建QDomDocument对象,用于解析XMLQDomDocument doc;//通过QFile对象设置QDomDocument的内容if(!doc.setContent(&file)){file.close();return -1;}//关闭文件file.close();//解析XML//获取XML根结点QDomElement root = doc.documentElement();QDomElement book = root.firstChildElement("图书");QDomElement bookName = book.firstChildElement("书名");bookName.firstChild().setNodeValue("Qt Creator快速入门");QDomElement author = book.firstChildElement("霍亚飞");author.firstChild().setNodeValue("sfsefes");if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))return 0;QTextStream out(&file);doc.save(out,4);file.close();

 

这里我继续使用Qt的.ui文件作为示例(它是以Xml文件的形式进行存储的)

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>731</width><height>460</height></rect></property><property name="windowTitle"><string>Graphics  View绘图</string></property><widget class="QWidget" name="centralWidget"><widget class="QWGraphicsView" name="View"><property name="geometry"><rect><x>10</x><y>10</y><width>600</width><height>400</height></rect></property><property name="renderHints"><set>QPainter::Antialiasing|QPainter::TextAntialiasing</set></property><property name="dragMode"><enum>QGraphicsView::RubberBandDrag</enum></property></widget></widget><widget class="QMenuBar" name="menuBar"><property name="geometry"><rect><x>0</x><y>0</y><width>731</width><height>30</height></rect></property></widget><widget class="QToolBar" name="mainToolBar"><property name="iconSize"><size><width>16</width><height>16</height></size></property><property name="toolButtonStyle"><enum>Qt::ToolButtonTextUnderIcon</enum></property><attribute name="toolBarArea"><enum>TopToolBarArea</enum></attribute><attribute name="toolBarBreak"><bool>false</bool></attribute><addaction name="actZoomIn"/><addaction name="actZoomOut"/><addaction name="actRestore"/><addaction name="separator"/><addaction name="actRotateLeft"/><addaction name="actRotateRight"/><addaction name="actEdit_Front"/><addaction name="actEdit_Back"/><addaction name="actGroup"/><addaction name="actGroupBreak"/><addaction name="separator"/><addaction name="actEdit_Delete"/><addaction name="separator"/><addaction name="actQuit"/></widget><widget class="QStatusBar" name="statusBar"/><widget class="QToolBar" name="toolBar"><property name="windowTitle"><string>toolBar</string></property><property name="allowedAreas"><set>Qt::LeftToolBarArea</set></property><property name="iconSize"><size><width>16</width><height>16</height></size></property><property name="toolButtonStyle"><enum>Qt::ToolButtonTextUnderIcon</enum></property><attribute name="toolBarArea"><enum>LeftToolBarArea</enum></attribute><attribute name="toolBarBreak"><bool>false</bool></attribute><addaction name="actItem_Rect"/><addaction name="actItem_Ellipse"/><addaction name="actItem_Circle"/><addaction name="actItem_Triangle"/><addaction name="actItem_Polygon"/><addaction name="actItem_Line"/><addaction name="actItem_Text"/></widget><action name="actItem_Rect"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/RECTANGL.BMP</normaloff>:/images/images/RECTANGL.BMP</iconset></property><property name="text"><string>矩形</string></property><property name="toolTip"><string>添加矩形</string></property></action><action name="actItem_Ellipse"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/ELLIPSE.BMP</normaloff>:/images/images/ELLIPSE.BMP</iconset></property><property name="text"><string>椭圆</string></property><property name="toolTip"><string>添加椭圆型</string></property></action><action name="actItem_Line"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/LINE.BMP</normaloff>:/images/images/LINE.BMP</iconset></property><property name="text"><string>直线</string></property><property name="toolTip"><string>添加直线</string></property></action><action name="actEdit_Delete"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/108.bmp</normaloff>:/images/images/108.bmp</iconset></property><property name="text"><string>删除</string></property><property name="toolTip"><string>删除选中的图元</string></property></action><action name="actQuit"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/132.bmp</normaloff>:/images/images/132.bmp</iconset></property><property name="text"><string>退出</string></property><property name="toolTip"><string>退出本系统</string></property></action><action name="actItem_Text"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/800.bmp</normaloff>:/images/images/800.bmp</iconset></property><property name="text"><string>文字</string></property><property name="toolTip"><string>添加文字</string></property></action><action name="actEdit_Front"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/528.bmp</normaloff>:/images/images/528.bmp</iconset></property><property name="text"><string>前置</string></property><property name="toolTip"><string>居于最前面</string></property></action><action name="actEdit_Back"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/526.bmp</normaloff>:/images/images/526.bmp</iconset></property><property name="text"><string>后置</string></property><property name="toolTip"><string>居于最后面</string></property></action><action name="actItem_Polygon"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/FREEFORM.BMP</normaloff>:/images/images/FREEFORM.BMP</iconset></property><property name="text"><string>梯形</string></property><property name="toolTip"><string>添加梯形</string></property></action><action name="actZoomIn"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/zoomin.png</normaloff>:/images/images/zoomin.png</iconset></property><property name="text"><string>放大</string></property><property name="toolTip"><string>放大</string></property></action><action name="actZoomOut"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/zoomout.png</normaloff>:/images/images/zoomout.png</iconset></property><property name="text"><string>缩小</string></property><property name="toolTip"><string>缩小</string></property></action><action name="actRotateLeft"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/rotateleft.png</normaloff>:/images/images/rotateleft.png</iconset></property><property name="text"><string>左旋转</string></property><property name="toolTip"><string>左旋转</string></property></action><action name="actRotateRight"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/rotateright.png</normaloff>:/images/images/rotateright.png</iconset></property><property name="text"><string>右旋转</string></property><property name="toolTip"><string>右旋转</string></property></action><action name="actRestore"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/420.bmp</normaloff>:/images/images/420.bmp</iconset></property><property name="text"><string>恢复</string></property><property name="toolTip"><string>恢复大小</string></property></action><action name="actGroup"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/UNGROUP.BMP</normaloff>:/images/images/UNGROUP.BMP</iconset></property><property name="text"><string>组合</string></property><property name="toolTip"><string>组合</string></property></action><action name="actGroupBreak"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/128.bmp</normaloff>:/images/images/128.bmp</iconset></property><property name="text"><string>打散</string></property><property name="toolTip"><string>取消组合</string></property></action><action name="actItem_Circle"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/08.JPG</normaloff>:/images/images/08.JPG</iconset></property><property name="text"><string>圆形</string></property><property name="toolTip"><string>圆形</string></property></action><action name="actItem_Triangle"><property name="icon"><iconset resource="res.qrc"><normaloff>:/images/images/Icon1242.ico</normaloff>:/images/images/Icon1242.ico</iconset></property><property name="text"><string>三角形</string></property><property name="toolTip"><string>三角形</string></property></action></widget><layoutdefault spacing="6" margin="11"/><customwidgets><customwidget><class>QWGraphicsView</class><extends>QGraphicsView</extends><header location="global">qwgraphicsview.h</header></customwidget></customwidgets><resources><include location="res.qrc"/></resources><connections><connection><sender>actQuit</sender><signal>triggered()</signal><receiver>MainWindow</receiver><slot>close()</slot><hints><hint type="sourcelabel"><x>-1</x><y>-1</y></hint><hint type="destinationlabel"><x>302</x><y>153</y></hint></hints></connection></connections>
</ui>

还是有难度的。

最外层是标签ui

内部是

class

widget

layoutdefault

customwidgets

resources

connections

------------------------------------------------

widget内包含

property

widget

action

--------------------------------------------------------

我读取一下:

  <property name="geometry"><rect><x>0</x><y>0</y><width>731</width><height>460</height></rect></property><property name="windowTitle"><string>Graphics  View绘图</string></property>

这一段信息吧

读取.ui文件的代码

        //解析XMLQDomNode firstNode = doc.firstChild();qDebug()<<"版本和编码信息:"<<firstNode.nodeName()<<firstNode.nodeValue(); // "xml" "version='1.0' encoding='UTF-8'"qDebug()<<"是否是Xml说明:"<<firstNode.isProcessingInstruction();QDomElement ui = doc.documentElement();qDebug()<<"root tag:"<<ui.tagName();qDebug()<<"root nodeType:"<<ui.nodeType();    //QDomNode::ElementNode	1qDebug()<<"root hasChildNodes:"<<ui.hasChildNodes();    //trueqDebug()<<"root childNodes count:"<<ui.childNodes().count();    //6qDebug()<<"root hasAttributes:"<<ui.hasAttributes();    //trueqDebug()<<"root hasAttribute version:"<<ui.hasAttribute("version"); //trueQDomElement xWidget = ui.firstChildElement("widget");qDebug()<<"widget hasAttribute name:"<<xWidget.hasAttribute("name");    //trueqDebug()<<"widget hasAttribute class:"<<xWidget.hasAttribute("class");  //trueQDomElement xProperty = xWidget.firstChildElement("property");while(!xProperty.isNull()){qDebug()<<xProperty.attribute("name");xProperty = xProperty.nextSiblingElement("property");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE中ECharts提示框tooltip自动切换

目录 前言1导入插件2定义参数3 插件API 前言 使用VUE开发的数据大屏统计&#xff0c;又需要将 echarts的提示框 tooltip 实现自动切换&#xff0c;网上有个很简单的插件&#xff08;echarts-tooltip-auto-show&#xff09;&#xff0c;使用教程简单分享给大家。 自动每隔几秒切…

哦华为仓颉语言

本来我不太想说的&#xff0c;奈何有不少粉丝提问提到了这语言&#xff0c;目前的情况我不透露太多&#xff0c;看过这课程C实现一门计算机编程语言到手撸虚拟机实战的懂的自然懂。 在互联网领域几乎大部分应用软件运行在X86 LINUX上居多&#xff0c;如果你有问题可以先学习这…

多版本python环境中,让python3固定指向其中一个python可执行文件

如果你只安装一个python环境&#xff0c;那么一般可执行文件名就叫python.exe和pythonw.exe 但是如果你有多个python环境时&#xff0c;可执行文件名是需要进行修改的&#xff0c;使得在安装库和调用时能够分辨python环境&#xff0c;比如我的电脑中装有python3.10和python2.x …

BUUCTF[堆][of_by_one]

堆中of_by_one 介绍&#xff1a; 严格来说 off-by-one 漏洞是一种特殊的溢出漏洞&#xff0c;off-by-one 指程序向缓冲区中写入时&#xff0c;写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节。溢出字节为可控制任意字节 &#xff1a;通过修改大小(size…

Spring AOP源码篇四之 数据库事务

了解了Spring AOP执行过程&#xff0c;再看Spring事务源码其实非常简单。 首先从简单使用开始, 演示Spring事务使用过程 Xml配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十六章 Linux 第一个程序 HelloWorld

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

S271系列RTU在旅游景区人流监控中的应用案例

S271系列RTU在旅游景区人流监控中的应用案例 随着全球旅游业的迅猛发展&#xff0c;旅游景区的管理者越来越关注如何利用先进的技术手段提升游客体验、优化管理效率以及确保安全。S271系列RTU作为一款先进的无线工业物联网设备&#xff0c;在旅游景区的人流监控中展现出了其独…

数据结构:顺序表+链表

数据结构&#xff1a;顺序表链表 一。顺序表&#xff1a; 首先在了解顺序表和链表之前&#xff0c;先了解一下线性表&#xff0c;**线性表&#xff08;linear list&#xff09;**是n个具有相同特征元素的有限序列 &#xff0c;在逻辑上是线性结构&#xff0c;也就是一条连续的…

WPF依赖附加属性

依赖附加属性的定义 基本过程&#xff1a;声明、注册、包装 依赖附加属性必须在依赖对象&#xff0c;附加属性不一定&#xff0c;关注的是被附加的对象是否是依赖对象 快捷方式&#xff1a;propa tab 关键字&#xff1a;RegisterAttached // 方法封装 public static int …

Unity3d C#实现基于UGUI ScrollRect的轮播图效果功能(含源码)

前言 轮播功能是一种常见的页面组件&#xff0c;用于在页面中显示多张图片/素材并自动或手动进行切换&#xff0c;以提高页面的美观度和用户体验。主要的功能是&#xff1a;自动/手动切换;平滑的切换效果;导航指示器等。可惜Unity的UGUI系统里没有现成的实现该功能&#xff0c…

第五次作业(多表联合查询)

新增员工表emp和部门表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (102,销售…

初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言 C是一种通用的编程语言&#xff0c;被广泛用于开发各种应用程序&#xff0c;包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展&#xff0c;添加了许多新特性和功能&#xff0c;并支持面向对象编程。C可以在不同的平台上编译和运行&#xff0c;具有高效性、可…

开放式耳机哪个品牌比较好?2024最值得推荐的火爆机型!!

在这个快节奏的时代&#xff0c;我们都在寻找那些既能让我们享受音乐&#xff0c;又能保持对外界感知的音频设备。开放式耳机以其独特的设计&#xff0c;满足了这一需求&#xff0c;它们让你在享受音乐的同时&#xff0c;还能听到周围环境的声音&#xff0c;无论是安全出行还是…

华为、H3C、锐捷、思科四大设备厂商交换机配置命令总结合辑

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 一直以来&#xff0c;对于华为、H3C、锐捷、思科交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;四…

谱瑞科技高速传输接口芯片选型应用

谱瑞科技股份有限公司为一专供多种普及显示器以及个人计算机、消费性电子产品与显示面板所使用之高速讯号传输接口标准之混和信号 IC 芯片之领导供货商。谱瑞公司成立于 2005 年为一无自有晶圆厂之半导体公司&#xff0c;并于 2011 年股票在台湾柜台买卖中心正式挂牌交易(股票代…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

【删库跑路】一次删除pip下载的所有第三方库方法

进入命令行&#xff0c;先list看下库存 pip list导出所有的第三方库至一文件列表 pip freeze >requirements.txt按照列表卸载所有库 pip uninstall -r requirements.txt -y再list看下&#xff0c;可见库存已清空

1、课程导学(react+区块链实战)

1、课程导学&#xff08;react区块链实战&#xff09; 1&#xff0c;课程概述&#xff08;1&#xff09;课程安排&#xff08;2&#xff09;学习前提&#xff08;3&#xff09;讲授方式&#xff08;4&#xff09;课程收获 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符缓冲流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;写一行行分隔符&#xff0c;行分隔符字符串由系统属性定义 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;读一行文字&#xff0c;结果包含行的内容的字…

AI赋能OFFICE 智能化办公利器!

ONLYOFFICE在线编辑器的最新版本8.1已经发布&#xff0c;整个套件带来了30多个新功能和432个bug修复。这个文档编辑器无疑成为了办公软件中的翘楚。它不仅支持处理文本文档、电子表格、演示文稿、可填写的表单和PDF&#xff0c;还允许多人在线协作&#xff0c;并支持AI集成&…