qt提供了三种方式解析xml,不过如果想实现对xml文件进行增、删、改等操作,还是DOM方式最方便。

项目配置

pro文件里面添加QT+=xml

include <QtXml>,也可以include <QDomDocument>

pro文件:

  1. QT       += core xml
  2. QT       -= gui
  3. TARGET = xmltest
  4. CONFIG   += console
  5. CONFIG   -= app_bundle
  6. TEMPLATE = app
  7. SOURCES += main.cpp

代码

main.cpp

  1. #include <QCoreApplication>
  2. #include <QtXml> //也可以include <QDomDocument>
  3. //写xml
  4. void WriteXml()
  5. {
  6. //打开或创建文件
  7. QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
  8. if(!file.open(QFile::WriteOnly|QFile::Truncate)) //可以用QIODevice,Truncate表示清空原来的内容
  9. return;
  10. QDomDocument doc;
  11. //写入xml头部
  12. QDomProcessingInstruction instruction; //添加处理命令
  13. instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
  14. doc.appendChild(instruction);
  15. //添加根节点
  16. QDomElement root=doc.createElement("library");
  17. doc.appendChild(root);
  18. //添加第一个子节点及其子元素
  19. QDomElement book=doc.createElement("book");
  20. book.setAttribute("id",1); //方式一:创建属性  其中键值对的值可以是各种类型
  21. QDomAttr time=doc.createAttribute("time"); //方式二:创建属性 值必须是字符串
  22. time.setValue("2013/6/13");
  23. book.setAttributeNode(time);
  24. QDomElement title=doc.createElement("title"); //创建子元素
  25. QDomText text; //设置括号标签中间的值
  26. text=doc.createTextNode("C++ primer");
  27. book.appendChild(title);
  28. title.appendChild(text);
  29. QDomElement author=doc.createElement("author"); //创建子元素
  30. text=doc.createTextNode("Stanley Lippman");
  31. author.appendChild(text);
  32. book.appendChild(author);
  33. root.appendChild(book);
  34. //添加第二个子节点及其子元素,部分变量只需重新赋值
  35. book=doc.createElement("book");
  36. book.setAttribute("id",2);
  37. time=doc.createAttribute("time");
  38. time.setValue("2007/5/25");
  39. book.setAttributeNode(time);
  40. title=doc.createElement("title");
  41. text=doc.createTextNode("Thinking in Java");
  42. book.appendChild(title);
  43. title.appendChild(text);
  44. author=doc.createElement("author");
  45. text=doc.createTextNode("Bruce Eckel");
  46. author.appendChild(text);
  47. book.appendChild(author);
  48. root.appendChild(book);
  49. //输出到文件
  50. QTextStream out_stream(&file);
  51. doc.save(out_stream,4); //缩进4格
  52. file.close();
  53. }
  54. //读xml
  55. void ReadXml()
  56. {
  57. //打开或创建文件
  58. QFile file("test.xml"); //相对路径、绝对路径、资源路径都行
  59. if(!file.open(QFile::ReadOnly))
  60. return;
  61. QDomDocument doc;
  62. if(!doc.setContent(&file))
  63. {
  64. file.close();
  65. return;
  66. }
  67. file.close();
  68. QDomElement root=doc.documentElement(); //返回根节点
  69. qDebug()<<root.nodeName();
  70. QDomNode node=root.firstChild(); //获得第一个子节点
  71. while(!node.isNull())  //如果节点不空
  72. {
  73. if(node.isElement()) //如果节点是元素
  74. {
  75. QDomElement e=node.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
  76. qDebug()<<e.tagName()<<" "<<e.attribute("id")<<" "<<e.attribute("time"); //打印键值对,tagName和nodeName是一个东西
  77. QDomNodeList list=e.childNodes();
  78. for(int i=0;i<list.count();i++) //遍历子元素,count和size都可以用,可用于标签数计数
  79. {
  80. QDomNode n=list.at(i);
  81. if(node.isElement())
  82. qDebug()<<n.nodeName()<<":"<<n.toElement().text();
  83. }
  84. }
  85. node=node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
  86. }
  87. }
  88. //增加xml内容
  89. void AddXml()
  90. {
  91. //打开文件
  92. QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
  93. if(!file.open(QFile::ReadOnly))
  94. return;
  95. //增加一个一级子节点以及元素
  96. QDomDocument doc;
  97. if(!doc.setContent(&file))
  98. {
  99. file.close();
  100. return;
  101. }
  102. file.close();
  103. QDomElement root=doc.documentElement();
  104. QDomElement book=doc.createElement("book");
  105. book.setAttribute("id",3);
  106. book.setAttribute("time","1813/1/27");
  107. QDomElement title=doc.createElement("title");
  108. QDomText text;
  109. text=doc.createTextNode("Pride and Prejudice");
  110. title.appendChild(text);
  111. book.appendChild(title);
  112. QDomElement author=doc.createElement("author");
  113. text=doc.createTextNode("Jane Austen");
  114. author.appendChild(text);
  115. book.appendChild(author);
  116. root.appendChild(book);
  117. if(!file.open(QFile::WriteOnly|QFile::Truncate)) //先读进来,再重写,如果不用truncate就是在后面追加内容,就无效了
  118. return;
  119. //输出到文件
  120. QTextStream out_stream(&file);
  121. doc.save(out_stream,4); //缩进4格
  122. file.close();
  123. }
  124. //删减xml内容
  125. void RemoveXml()
  126. {
  127. //打开文件
  128. QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
  129. if(!file.open(QFile::ReadOnly))
  130. return;
  131. //删除一个一级子节点及其元素,外层节点删除内层节点于此相同
  132. QDomDocument doc;
  133. if(!doc.setContent(&file))
  134. {
  135. file.close();
  136. return;
  137. }
  138. file.close();  //一定要记得关掉啊,不然无法完成操作
  139. QDomElement root=doc.documentElement();
  140. QDomNodeList list=doc.elementsByTagName("book"); //由标签名定位
  141. for(int i=0;i<list.count();i++)
  142. {
  143. QDomElement e=list.at(i).toElement();
  144. if(e.attribute("time")=="2007/5/25")  //以属性名定位,类似于hash的方式
  145. root.removeChild(list.at(i));
  146. }
  147. if(!file.open(QFile::WriteOnly|QFile::Truncate))
  148. return;
  149. //输出到文件
  150. QTextStream out_stream(&file);
  151. doc.save(out_stream,4); //缩进4格
  152. file.close();
  153. }
  154. //更新xml内容
  155. void UpdateXml()
  156. {
  157. //打开文件
  158. QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
  159. if(!file.open(QFile::ReadOnly))
  160. return;
  161. //更新一个标签项,如果知道xml的结构,直接定位到那个标签上定点更新
  162. //或者用遍历的方法去匹配tagname或者attribut,value来更新
  163. QDomDocument doc;
  164. if(!doc.setContent(&file))
  165. {
  166. file.close();
  167. return;
  168. }
  169. file.close();
  170. QDomElement root=doc.documentElement();
  171. QDomNodeList list=root.elementsByTagName("book");
  172. QDomNode node=list.at(list.size()-1).firstChild(); //定位到第三个一级子节点的子元素
  173. QDomNode oldnode=node.firstChild(); //标签之间的内容作为节点的子节点出现,当前是Pride and Projudice
  174. node.firstChild().setNodeValue("Emma");
  175. QDomNode newnode=node.firstChild();
  176. node.replaceChild(newnode,oldnode);
  177. if(!file.open(QFile::WriteOnly|QFile::Truncate))
  178. return;
  179. //输出到文件
  180. QTextStream out_stream(&file);
  181. doc.save(out_stream,4); //缩进4格
  182. file.close();
  183. }
  184. int main(int argc, char *argv[])
  185. {
  186. qDebug()<<"write xml to file...";
  187. WriteXml();
  188. qDebug()<<"read xml to display...";
  189. ReadXml();
  190. qDebug()<<"add contents to xml...";
  191. AddXml();
  192. qDebug()<<"remove contents from xml...";
  193. RemoveXml();
  194. qDebug()<<"update contents to xml...";
  195. UpdateXml();
  196. return 0;
  197. }

写xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <library>
  3. <book id="1" time="2013/6/13">
  4. <title>C++ primer</title>
  5. <author>Stanley Lippman</author>
  6. </book>
  7. <book id="2" time="2007/5/25">
  8. <title>Thinking in Java</title>
  9. <author>Bruce Eckel</author>
  10. </book>
  11. </library>

增加内容xml

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <library>
  3. <book time="2013/6/13" id="1">
  4. <title>C++ primer</title>
  5. <author>Stanley Lippman</author>
  6. </book>
  7. <book time="2007/5/25" id="2">
  8. <title>Thinking in Java</title>
  9. <author>Bruce Eckel</author>
  10. </book>
  11. <book time="1813/1/27" id="3">
  12. <title>Pride and Prejudice</title>
  13. <author>Jane Austen</author>
  14. </book>
  15. </library>

删除内容xml

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <library>
  3. <book time="2013/6/13" id="1">
  4. <title>C++ primer</title>
  5. <author>Stanley Lippman</author>
  6. </book>
  7. <book time="1813/1/27" id="3">
  8. <title>Pride and Prejudice</title>
  9. <author>Jane Austen</author>
  10. </book>
  11. </library>

更新xml

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <library>
  3. <book id="1" time="2013/6/13">
  4. <title>C++ primer</title>
  5. <author>Stanley Lippman</author>
  6. </book>
  7. <book id="3" time="1813/1/27">
  8. <title>Emma</title>
  9. <author>Jane Austen</author>
  10. </book>
  11. </library>
 
 

http://blog.csdn.net/u012234115/article/details/43203001

DOM解析xml实现读、写、增、删、改的更多相关文章

  1. xml--通过DOM解析XML

    此文章通过3个例子表示DOM方式解析XML的用法. 通过DOM解析XML必须要写的3行代码. step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器) step 2:获得具体的dom解 ...

  2. 用dom4j解析xml文件并执行增删改查操作

    转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...

  3. xml语法、DTD约束xml、Schema约束xml、DOM解析xml

    今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...

  4. Android之DOM解析XML

    一.DOM解析方法介绍 DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息 ...

  5. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  6. 简单谈谈dom解析xml和html

    前言 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.html,xml都是基于这个模型构造的.这也是一个W3C推出的标准.j ...

  7. Java从零开始学四十二(DOM解析XML)

    一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone ...

  8. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  9. Java解析XML文档(简单实例)——dom解析xml

      一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object ...

随机推荐

  1. mysql zip文件安装

    bin目录下执行mysqld -install再执行mysqld --initialize-insecure 启动服务:net start mysql

  2. [Grid Layout] Use auto-fill and auto-fit if the number of repeated grid tracks is not to be def

    What about the situation in which we aren’t specifying the number of columns or rows to be repeated? ...

  3. Linux命令具体解释(2) – mv

    文件位置:      mv: /bin/mv /usr/share/man/man1/mv.1.gz 名称:      mv - move (rename) files 使用方法:      mv [ ...

  4. Mysql存储过程中使用cursor

    一.表 学生表 CREATE TABLE `t_student` (    `stuNum` int(11) NOT NULL auto_increment,    `stuName` varchar ...

  5. CentOS使用(一)-----各种环境搭建

    使用virtual box虚拟机,镜像为CentOS-6.9-x86_64-LiveDVD.iso,使用SecureCRT远程连接. 安装CentOS系统之后,选择host-only连接模式,修改虚拟 ...

  6. HDU 1422 重温世界杯 - 贪心

    传送门 题目大意: 给一串数,又正有负,求每一个前缀都大于0的最长子串长度. 题目分析: 直接贪心:每次左端点向右推1,不断延伸右端点,更新答案. code #include<bits/stdc ...

  7. 通过一次SpringBoot打成war包部署到tomcat启动总结一般jar包冲突的解决方法

    启动时,报错信息如下: 28-Sep-2018 16:55:41.567 严重 [localhost-startStop-1] org.apache.catalina.core.StandardCon ...

  8. Web自动化工具对比

    首先说一下我对Web自动化测试与CS自动化测试的认识.从宏观对比都是通过脚本自动化完成功能的验证,区别不大.Web测试更为显著的浏览器兼容性.安全,以及与Web技术相关的表单测试.链接测试等,其实都是 ...

  9. 卷积神经网络(CNN)的细节问题(滤波器的大小选择)

    0. 滤波器的大小选择 大部分卷积神经网络都会采用逐层递增(1⇒ 3 ⇒ 5 ⇒ 7)的方式. 每经过一次池化层,卷积层过滤器的深度都会乘以 2: 1. 权值共享:减轻过拟合 & 降低计算量 ...

  10. sublime 内容高级搜索

    在发展中经常需要搜索内表面的文件.更好地想找到$video->getTitle() 在该文件中使用的表面.好了,这个时候就需要使用高级搜索功能,的操作,如以下: ctrl+shif+f纽带 例如 ...