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

Qt的Xml操作QDomDocument相关推荐

  1. [QT操作XML]QT读写XML文件,QT修改XML文件

    [QT操作XML]QT读写XML文件 XML简介 QT操作XML,写入.读取.修改 XML效果演示 XML简介 概念:Extensible Markup Language 可扩展标记语言(可扩展:标签 ...

  2. 使用Qt创建XML文档及XML文档的增删改

    目录名字 使用Qt创建XML文档及XML文档的增删改 XML文档的操作 :QXml + QFile+QTextStream 创建XML的一般步骤: XML 文档的操作(添加.查找.更新.删除) 添加的 ...

  3. 一文搞定Qt读写excel以及qt读写xml数据

    一文搞定Qt读写excel以及qt读写xml数据 最终的实现效果图 RC_ICONS = logo.ico .pro文件同级目录下加入 logo.ico 图标文件,运行文件,文件的图标就被写入软件 u ...

  4. QT解析XML的三种方式

    1-QT QXmlStreamReader用法小结 解析常用到的函数含义: 1--导入一个xml文件或字符串的方式 //方式一QXmlStreamReader reader(sXMLContent); ...

  5. 【Qt】 XML流读写XML

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 读取XML文档 04. 写入XML文档 05. 预留 06. 附录 01. 概述 从Qt 4.3开始引入了两个新的类来读取 ...

  6. LINQ系列:LINQ to XML操作

    LINQ to XML操作XML文件的方法,如创建XML文件.添加新的元素到XML文件中.修改XML文件中的元素.删除XML文件中的元素等. 1. 创建XML文件 string xmlFilePath ...

  7. php操作xml类,PHP实现的XML操作类【XML Library】

    本文实例讲述了PHP实现的XML操作类.分享给大家供大家参考,具体如下: 这是一个接口程序,需要大量分析解析XML,PHP的xml_parse_into_struct()函数不能直接生成便于使用的数组 ...

  8. 【转】Qt之文件操作 QFile

    转载:http://blog.csdn.net/liuhongwei123888/article/details/6084761 今天学习QT的文件操作 1.QIODevice 直接继承自QObjec ...

  9. Open XML操作Excel导入数据

    项目中发现使用OleDb(using System.Data.OleDb)相关对象处理Excel导入功能,不是很稳定经常出问题,需要把这个问题解决掉.项目组提出使用OpenXML来处理Excel的导入 ...

最新文章

  1. 安利7款珍藏已久的windows软件,每一个都非常强大
  2. Java 小故事系列 导航
  3. vs2010 Qt插件报错Couldn't register all Qt4VSAddin command解决方案
  4. MySQL联合查询介绍
  5. Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c(04)
  6. view 判断显示 微信_微信小程序开发用户授权登录(上)
  7. 网页数据导出为Excel(带图片)
  8. 2009程序员考试大纲
  9. h5+js实现本地文件读取和写入-web前端教程
  10. 新电脑java开发常用环境安装下载教程收集--持续更新
  11. 一键在线生成朋友圈转发点赞截图教程
  12. Python生成文档(PDF, HTML)
  13. 设置360浏览器默认以极速模式打开
  14. Nlite后期处理技术小结
  15. Axure RP9 水平滑动效果制作
  16. 200行代码构建一个区块链
  17. python裁剪不规则区域_Python实现不规则图形填充的思路
  18. windows远程桌面占用CPU的处理办法
  19. 王者荣耀刷金币小程序
  20. 利用python进行数据分析-数据聚合与分组运算2

热门文章

  1. C语言 static - C语言零基础入门教程
  2. Python 浅拷贝和深拷贝 - Python零基础入门教程
  3. 计算机视觉实验数学形态学,计算机视觉形态学边缘检测.doc
  4. php session页面传值,PHP session在页面间传递的问题
  5. w7计算机的收藏夹里弄出桌面,Win7电脑桌面的便签怎么弄出来?
  6. jq设置保留两位小数_如何实现python中format函数保留指定位数的小数?
  7. python爬虫知识大全_Python爬虫入门有哪些基础知识点
  8. python字典的建立和输出_字典的创建和使用
  9. linux物理内存地址与iomem,一种Linux系统物理内存镜像文件分析方法_4
  10. ibm服务器 p5 硬盘,IBM虚拟化实战之p5服务器逻辑分区解读