Qt的Xml操作QDomDocument

Qt的Xml操作QDomDocument

Qt对于Xml的支持是很好的,一些我们需要的操作应有尽有,下面简单介绍一下怎样使用。主要有以下几点使用:

  1. 写xml到文件
  2. 读xml
  3. 添加节点到xml
  4. 删除xml中某节点信息
  5. 修改xml中某节点信息

准备工作

  1. .pro加入QT += xml
  2. 需要include QDomDocument QTextStream QFile三个头文件

WriteXml

直接上代码

void writeXml()
{QDomDocument doc;QDomProcessingInstruction xmlInstruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"");QDomComment comment = doc.createComment(QString::fromLocal8Bit("离开是为了更好的归来"));QDomProcessingInstruction styleInstruction = doc.createProcessingInstruction("xml-stylesheet", "type=\"text/css\" href=\"style.css\"");doc.appendChild(xmlInstruction);  // 开始文档(XML 声明)doc.appendChild(comment);  // 注释doc.appendChild(styleInstruction);  // 处理指令// 根元素 <Blogs>QDomElement root = doc.createElement("Books");root.setAttribute("Version", "1.0");  // 属性doc.appendChild(root);// 元素 <Blog>QDomElement child = doc.createElement("Book");root.appendChild(child);// 元素 <作者>、<时间>、<个人说明>QDomElement author = doc.createElement(QString::fromLocal8Bit("作者"));QDomElement home = doc.createElement(QString::fromLocal8Bit("时间"));QDomElement instruction = doc.createElement(QString::fromLocal8Bit("个人说明"));child.appendChild(author);child.appendChild(home);child.appendChild(instruction);// 元素的文本数据QDomText authorText = doc.createTextNode(QString::fromLocal8Bit("Vincent"));QDomText homeText = doc.createTextNode("2017年4月13日");QDomText instructionText = doc.createTextNode(QString::fromLocal8Bit("大宋枢密院常任委员会_委员"));author.appendChild(authorText);home.appendChild(homeText);instruction.appendChild(instructionText);// 保存 XML 文件QString strFile("Books.xml");QFile file(strFile);// 只写模式打开文件if (file.open(QFile::WriteOnly | QFile::Text)){QTextStream out(&file);doc.save(out, QDomNode::EncodingFromDocument);file.close();}
}
void writeXML()
{//打开或创建文件QString fileName{"test.xml"};QFile file(fileName);//QIODevice::Truncate表示清空原来的内容if(!file.open(QFile::WriteOnly|QFile::Truncate))return;//创建xml文档在内存中QDomDocument doc;//添加处理命令QDomProcessingInstruction instruction;instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");//创建注释QDomComment comment;comment = doc.createComment(QString::fromLocal8Bit("离开是为了更好的归来"));QDomProcessingInstruction styleInstruction;styleInstruction= doc.createProcessingInstruction("xml-stylesheet", "type=\"text/css\" href=\"style.css\"");doc.appendChild(instruction); //文档开始声明doc.appendChild(comment);doc.appendChild(styleInstruction);  // 处理指令//添加根节点QDomElement root=doc.createElement("library");root.setAttribute("Version","2.1");doc.appendChild(root);//添加第一个子节点及其子元素QDomElement book=doc.createElement("book");//方式一:创建属性  其中键值对的值可以是各种类型book.setAttribute("id",1);//方式二:创建属性 值必须是字符串QDomAttr time=doc.createAttribute("time");time.setValue("2013/6/13");book.setAttributeNode(time);QDomElement title=doc.createElement("title"); //创建子元素QDomText text; //设置括号标签中间的值text=doc.createTextNode("C++ primer");book.appendChild(title);title.appendChild(text);QDomElement author=doc.createElement("author"); //创建子元素text=doc.createTextNode("Stanley Lippman");author.appendChild(text);book.appendChild(author);//添加节点book做为根节点的子节点root.appendChild(book);//添加第二个子节点及其子元素book=doc.createElement("book");book.setAttribute("id",2);time=doc.createAttribute("time");time.setValue("2007/5/25");book.setAttributeNode(time);title=doc.createElement("title");text=doc.createTextNode("Thinking in Java");book.appendChild(title);title.appendChild(text);author=doc.createElement("author");text=doc.createTextNode("Bruce Eckel");author.appendChild(text);book.appendChild(author);root.appendChild(book);//输出到文件QTextStream out_stream(&file);doc.save(out_stream,4); //缩进4格file.close();
}

ReadXml

上代码

void readXML()
{//打开或创建文件QFile file("test.xml");if(!file.open(QFile::ReadOnly))return;QDomDocument doc;//设置wangfei1.xml到文档if(!doc.setContent(&file)){file.close();return;}file.close();//返回根节点QDomElement root=doc.documentElement();qDebug()<<root.nodeName();//如果xml根元素有属性(Version)将输出,Vinsion是用户自定义的属性,没有继续执行下一条命令if (root.hasAttribute("Version"))  // 属性qDebug() << root.attribute("Version");/**********根元素之上(XML 声明、注释等)**********/QDomNode node = root.previousSibling();while (!node.isNull()){switch (node.nodeType()){case QDomNode::ProcessingInstructionNode :{QDomProcessingInstruction instruction = node.toProcessingInstruction();//输出处理指令,是用户自定义的,比如字符串“name”对应处理指令得到名字,这个命令是用户写的qDebug() << instruction.target() << instruction.data();if (QString::compare(instruction.target(), "xml") == 0) // 开始文档(XML 声明){//cout<<"处理命令xml"<<endl;// ...}else if (QString::compare(instruction.target(), "xml-stylesheet") == 0) // 处理指令{//cout<<"处理命令xml-stylesheet"<<endl;// ...}break;}case QDomNode::CommentNode :{QDomComment comment = node.toComment();qDebug() << comment.data();break;}default:break;}node = node.previousSibling();}//获得第一个子节点node=root.firstChild();while(!node.isNull())  //如果节点不空{if(node.isElement()) //如果节点是元素{//转换为元素QDomElement element=node.toElement();if (!element.isNull())// 节点的确是一个元素{//输出第一个节点,包括第一个节点的属性,这个属性需要指定属性值,才能输出,如果没有输出空qDebug()<<element.tagName()<<" "<<element.attribute("id")<<" "<<element.attribute("time");QDomNodeList list=element.childNodes();for(int i=0;i<list.count();++i){QDomNode n=list.at(i);//node = list.at(i);if(node.isElement()){qDebug()<<n.nodeName()<<":"<<n.toElement().text();element = n.toElement();//qDebug()<<element.nodeName()<<":"<<element.toElement().text();if (QString::compare(element.tagName(), QStringLiteral("作者")) == 0){// ...处理命令//cout<< "处理命令作者"<<endl;}else if (QString::compare(element.tagName(), QStringLiteral("时间")) == 0){//cout<<"处理命令时间"<<endl;// ...处理命令}else if (QString::compare(element.tagName(), QStringLiteral("个人说明")) == 0){//cout<<"处理命令个人说明"<<endl;// ...处理命令}}}}}//下一个兄弟节点node=node.nextSibling();}
}

AddXml

void addXML()
{//打开文件QFile file("test.xml");if(!file.open(QFile::ReadOnly))return;//增加一个一级子节点以及元素QDomDocument doc;if(!doc.setContent(&file)){file.close();return;}file.close();//创建根节点QDomElement root = doc.documentElement();//创建next子节点bookQDomElement book = doc.createElement("book");book.setAttribute("id",3);book.setAttribute("time","1813/1/27");QDomElement title = doc.createElement("title");QDomText text;text = doc.createTextNode("Pride and Prejudice");//添加text内容到title节点title.appendChild(text);//添加title到book节点book.appendChild(title);//添加book到根节点root.appendChild(book);if(!file.open(QFile::WriteOnly|QFile::Truncate))return;//输出到文件QTextStream out_stream(&file);doc.save(out_stream,4); //以缩进4格方式输出,也有其他输出方式(格式)file.close();
}

DeleteXml

void deleteXML()
{//打开文件QFile file("test.xml");if(!file.open(QFile::ReadOnly))return;//删除一个一级子节点及其元素,外层节点删除内层节点于此相同QDomDocument doc;if(!doc.setContent(&file)){file.close();return;}file.close();QDomElement root=doc.documentElement();//由标签名定位,本标签为book,以后可以是用string类型的字符串替换,实现动态QDomNodeList list=doc.elementsByTagName("book");//删除方式一,通过标签book后面的属性删除<book>到</book>for(int i=0;i<list.count();i++){//转化为元素QDomElement e=list.at(i).toElement();//找到time是2007/5/25这一条数据将其删除if(e.attribute("time")=="2007/5/25")root.removeChild(list.at(i));}//删除方式二,可以通过索引直接删除
//    root.removeChild(list.at(1));if(!file.open(QFile::WriteOnly|QFile::Truncate))return;//输出到文件QTextStream out_stream(&file);doc.save(out_stream,4); //缩进4格file.close();
}

AmendXml

void amendXML()
{//打开文件QFile file("wangfei1.xml");if(!file.open(QFile::ReadOnly))return;//更新一个标签项,如果知道xml的结构,直接定位到那个标签上定点更新//或者用遍历的方法去匹配tagname或者attribut,value来更新QDomDocument doc;//设置wangfei.xml读到doc文档if(!doc.setContent(&file)){file.close();return;}file.close();/***    知道xml结构,直接定位修改*   提取根节点**/QDomElement root=doc.documentElement();//以book标签存入list
//    QDomNodeList list=root.elementsByTagName("book");
//    QDomNode listNode=list.at(list.size()-2).firstChild();
//    QDomNode oldnode=listNode.firstChild();
//    //把title改成Emma
//    listNode.firstChild().setNodeValue("aaaaaaa");
//    QDomNode newnode=listNode.firstChild();
//    listNode.replaceChild(newnode,oldnode);//使用遍历方法选择要修改的元素
//    QDomNodeList lists =doc.childNodes();
//    QDomNodeList list=root.elementsByTagName("book");QDomNode node = root.firstChild();//QDomNodeList list=root.elementsByTagName("book");while(!node.isNull())  //如果节点不空{if(node.isElement()) //如果节点是元素{//转换为元素QDomElement element=node.toElement();if (!element.isNull() && element.attribute("id") == "3")// 节点的确是一个元素{//输出第一个节点,包括第一个节点的属性,这个属性需要指定属性值,才能输出,如果没有输出空//qDebug()<<element.tagName()<<" "<<element.attribute("id")<<" "<<element.attribute("time");QDomNodeList list=element.childNodes();for(int i=0;i<list.count();++i){QDomNode n=list.at(i);//node = list.at(i);if(node.isElement()){//qDebug()<<n.nodeName()<<":"<<n.toElement().text();element = n.toElement();//与上面qDebug效果相同//qDebug()<<element.nodeName()<<":"<<element.toElement().text();//这个if可以不需要,如果需要精确定位,以防数据相同所以要加这个嵌套ifif (QString::compare(element.tagName(), QStringLiteral("title")) == 0){if("Pride and Prejudice" == element.toElement().text()){// ...处理命令,在这个if里可以遍历想要的节点进行修改//新建一个旧的node缓存QDomNode oldNode = n.firstChild();n.firstChild().setNodeValue("changchun1");//新建一个新的newNode子节点QDomNode newNode = n.firstChild();//使用replaceChild替换noden.replaceChild(newNode,oldNode);}}else if (QString::compare(element.tagName(), QStringLiteral("时间")) == 0){//cout<<"处理命令时间"<<endl;// ...处理命令}else if (QString::compare(element.tagName(), QStringLiteral("个人说明")) == 0){//cout<<"处理命令个人说明"<<endl;// ...处理命令}}}}}//下一个兄弟节点node=node.nextSibling();}if(!file.open(QFile::WriteOnly|QFile::Truncate))return;//输出到文件QTextStream out_stream(&file);doc.save(out_stream,4); //缩进4格file.close();}

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

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

相关文章

2815:城堡问题

2815:城堡问题 查看提交统计提示提问 总时间限制: 1000ms 内存限制: 65536kB描述1 2 3 4 5 6 7 #############################1 # | # | # | | ######---#####---#---#####---#2 # # | # # # # ##---#####---#####---#####---#3 # …

冒泡排序法函数

文章目录冒泡排序法的函数实现使用教程冒泡排序法的函数实现 话不多说上代码&#xff0c;拿去直接用。 // 冒泡排序函数 /* * brief sort * param array为数组名称&#xff0c;length为数组的长度&#xff0c;order为1或0,1代表从小到大排序 * 0代表从大到小排序…

boost序列化(Serialization)

本文章转载自 http://m.blog.csdn.net/zj510/article/details/8105408 程序开发中&#xff0c;序列化是经常需要用到的。像一些相对高级语言&#xff0c;比如JAVA, C#都已经很好的支持了序列化&#xff0c;那么C呢&#xff1f;当然一个比较好的选择就是用Boost&#xff0c;这个…

java基础经典练习题

【程序1】 题目&#xff1a;古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; //这是一个菲波拉契数列问题 p…

ubuntu下wps不能输入中文

ubuntu下wps不能输入中文 原因是因为fcitx环境的原因&#xff0c;想了解fcitx的可以看这篇文章&#xff0c;链接。 使用脚本解决 将下面的脚本复制到新建的文件中&#xff0c;chmod加权限&#xff0c;然后执行即可。 #! /bin/bash #--------------------------------------…

常见的几种内排序算法以及实现(C语言)(转)

所有未排序的数组是经过检查合法的主要的内排序包括冒泡、插入、希尔、堆排序、归并、快速、桶排序等其C语言实现的源文件下载地址&#xff1a;http://download.csdn.net/detail/mcu_tian/9530227冒泡排序冒泡排序应该是排序中最简单的算法了主要思路如下&#xff1a;1&#xf…

常见编程命名缩写

命名缩写 通用缩写翻译控件缩写翻译addressaddr地址calendarcdr日历applicationapp应用程序messageDialogmsgdlg消息框asynchronizationasyn异步drawerdrw抽屉averageavg平均数buttonGroupbtngrp按钮分组bitmapbmp位图checkBoxchk复选框bufferbuf缓冲区containercntr容器chara…

funCode课程实训(C++ )

funcode是一个简单的游戏制作引擎&#xff0c;适合c初学者操作&#xff0c;可以帮助初学者更好的了解c环境&#xff0c;以及各种函数的实现&#xff0c;本学期我们用funcode作为C最后的课程设计&#xff0c;所以我就使用funcode制作一个打地鼠的小游戏。以下是对这个小程序的描…

Nodejs,Npm,React安装教程

React安装 1.下载node.js安装包 下载二进制包 选择比较稳定的版本进行安装&#xff0c;v8.9 2.安装 直接把文件解压复制到某个目录下&#xff0c; sudo cp -r node-v8.9.0 /opt/node #你下载的版本sudo touch /etc/profile.d/node.sh #新建一个脚本文件sudo gedit /etc/…

Ubuntu下的提示信息彩色显示

【问题】 虽然已经折腾过了&#xff1a; 【已解决】Ubuntu中让终端只显示当前路径&#xff0c;而不显示绝对路径 但是&#xff0c;终端中的prompt提示信息&#xff0c;不是彩色的&#xff0c;导致的结果是&#xff1a; 当终端中输出信息很多时&#xff1a; 【已解决】Ubun…

hustoj的搭建

最近开始接触服务器之类的&#xff0c;就自己搭建一个hustoj的服务器&#xff0c;hustoj系统的搭建在网上已经很完善了&#xff0c;这里我就简单的说一下&#xff0c;作为自己的学习笔记。 安装主要环境&#xff0c;Apache2&#xff0c;MySQL&#xff0c;php5和PHPmyadmin。 …

Shell字符串操作集合

字符操作字符串的长度获取字符串中某些字符的个数统计单词的个数bash提供的数组数据结构它是以数字为下标的和C语言从0开始的下一样awk里面的数组取子串匹配求子串sed有按行打印的功能记得用tr把空格换为行号tr来取子串head和tail查询字串子串替换tac 会将文本的内容倒置显示正…

百练4982 踩方格

总时间限制: 1000ms 内存限制: 65536kB描述有一个方格矩阵&#xff0c;矩阵边界在无穷远处。我们做如下假设&#xff1a;a. 每走一步时&#xff0c;只能从当前方格移动一格&#xff0c;走到某个相邻的方格上&#xff1b;b. 走过的格子立即塌陷无法再走第二次&#xff1b;…

Qt自定义QML模块

自定义QML模块 含义为将常用风格的Button&#xff0c;Text,RadioButton,或者自定义的控件作为一个控件进行使用&#xff0c;节省代码。 优点&#xff1a; 代码简洁&#xff0c;减少重复代码自定义的控件进行封装重复使用可以与QML自带的库区别开来优化项目结构 一、创建模块…

POJ3984 迷宫问题【BFS】

好长时间没有敲过代码了&#xff0c;感觉之前学过的都忘了&#xff0c;趁着这个暑假&#xff0c;打算把之前学习的东西都复习一下&#xff0c;当然得慢慢来&#xff0c;毕竟好长时间不敲代码了&#xff0c;怎么着都有些生疏&#xff0c;再加上之前学的也不咋地&#xff0c;相当…

宏定义基本用法

宏定义 不带参数 宏定义又称为宏代换、宏替换&#xff0c;简称“宏”。 格式&#xff1a; #define 标识符 字符串其中的标识符就是所谓的符号常量&#xff0c;也称为“宏名”。 预处理&#xff08;预编译&#xff09;工作也叫做宏展开&#xff1a;将宏名替换为字符串。 掌…

广度优先搜索练习之神奇的电梯

广度优先搜索练习之神奇的电梯 Time Limit: 1000ms Memory limit: 65536K 题目描述 有一座已知层数为n的高楼&#xff0c;这座高楼的特殊之处在于只能靠电梯去上下楼&#xff0c;所以要去到某一层要非常耽误时间&#xff0c;然而更悲哀的是&#xff0c;这座高楼的电梯是限号…

ubuntu安装proxychains及自动补全

proxychains ProxyChains是本人目前为止用到的最方便的代理工具。 inux下代理一般是通过http_proxy和https_proxy这两个环境变量&#xff0c;但是很多软件并不使用这两个变量&#xff0c;导致流量无法走代理。在不使用vpn的前提下&#xff0c;linux并没有转发所有流量的真全局…

快速幂讲解

快速幂的目的就是做到快速求幂&#xff0c;假设我们要求a^b,按照朴素算法就是把a连乘b次&#xff0c;这样一来时间复杂度是O(b)也即是O(n)级别&#xff0c;快速幂能做到O(logn)&#xff0c;快了好多好多。它的原理如下&#xff1a; 假设我们要求a^b&#xff0c;那么其实b是可以…

如何查询资料

如何查询资料技术资料及问题查询查询方法分类查找提取关键字GitHub项目优先使用Google搜索引擎Copy Paste论文查找询问主管 测试修改使用总结分享 公司信息查询国内公司国外公司 如何查询资料 技术资料及问题查询 查询方法 资料与解决办法的查询大致分为7大类。 1.分类查…