博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
qt读写xml文件
阅读量:2193 次
发布时间:2019-05-02

本文共 4646 字,大约阅读时间需要 15 分钟。

http://blog.csdn.net/xiexingshishu/article/details/45177023

1、DOM方式

写xml文件,以QDomText方式写,代码如下

[cpp] 
 
  1. QFile file("d:/test.txt");  
  2. file.open(QIODevice::WriteOnly);  
  3.   
  4. QDomDocument doc;  
  5. QDomProcessingInstruction instruction;  
  6.   
  7. instruction = doc.createProcessingInstruction("xml""version = \'1.0\'");  
  8. doc.appendChild(instruction);  
  9. QDomElement root = doc.createElement("html");  
  10. doc.appendChild(root);  
  11.   
  12. QDomElement data;  
  13. QDomElement tmp;  
  14. QDomText text;  
  15.   
  16. data = doc.createElement("title");  
  17. text = doc.createTextNode(QStringLiteral("多看"));  
  18. data.appendChild(text);  
  19. root.appendChild(data);  
  20.   
  21. tmp = doc.createElement("book");  
  22. text = doc.createTextNode(QStringLiteral("小说"));  
  23. tmp.appendChild(text);  
  24. root.appendChild(tmp);  
  25.   
  26.   
  27. QTextStream out(&file);  
  28. doc.save(out, 4);  
  29.   
  30. file.close();  

读代码为

[cpp] 
 
  1. QFile file("d:/test.txt");  
  2. file.open(QIODevice::ReadOnly);  
  3. QDomDocument doc;  
  4. doc.setContent(&file);  
  5. QDomElement root = doc.documentElement();  
  6. for (QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling()) {  
  7.     QDomElement element = node.toElement();  
  8.     QString tagName = element.tagName();  
  9.     if (tagName == "title") {  
  10.         qDebug() << element.text();  
  11.     } else if (tagName == "book") {  
  12.         qDebug() << element.text();  
  13.     }  
  14. }  
  15. file.close();  

以QDomAttr方式写:

[cpp] 
 
  1. QFile file("d:/test.txt");  
  2. file.open(QIODevice::WriteOnly);  
  3.   
  4. QDomDocument doc;  
  5. QDomProcessingInstruction instruction;  
  6.   
  7. instruction = doc.createProcessingInstruction("xml""version = \'1.0\'");  
  8. doc.appendChild(instruction);  
  9. QDomElement root = doc.createElement("html");  
  10. doc.appendChild(root);  
  11.   
  12. QDomAttr data;  
  13. QDomAttr tmp;  
  14.   
  15. data = doc.createAttribute("title");  
  16. data.setValue(QStringLiteral("多看"));  
  17. root.setAttributeNode(data);  
  18.   
  19. tmp = doc.createAttribute("book");  
  20. tmp.setValue(QStringLiteral("小说"));  
  21. root.setAttributeNode(tmp);  
  22.   
  23.   
  24. QTextStream out(&file);  
  25. doc.save(out, 4);  
  26.   
  27. file.close();  

读QDomAttr

[cpp] 
 
  1. QFile file("d:/test.txt");  
  2. file.open(QIODevice::ReadOnly);  
  3. QDomDocument doc;  
  4. doc.setContent(&file);  
  5. QDomElement root = doc.documentElement();  
  6.   
  7. qDebug() << root.attribute("title");  
  8. qDebug() << root.attribute("book");  
  9.   
  10. file.close();  

2、用QXmlStreamReader和QXmlStreamWriter

写文件,设置相关联的文件,用writeStartDocument来开始,用writeEndDocument来结束

用writeStartElement和writeEndElement来表示元素的开始和结束,需要成对使用

<name>a</name>形式,用writeTextElement

<name a=""/>形式,用writeAttribute

[cpp] 
 
  1. QFile file("test.txt"); file.open(QIODevice::writeOnly);  
  2. QXmlStreamWriter xmlstreamwriter(&file);  
  3. xmlstreamwriter.setAutoFormatting(true);  
  4. xmlstreamwriter.writeStartDocument();  
  5. xmlstreamwriter.writeStartElement("xml");  
  6. xmlstreamwriter.writeStartElement("round");  
  7. xmlstreamwriter.writeAttribute("id", mRoundId);  
  8. xmlstreamwriter.writeAttribute("tableid", mTableId);  
  9. //player1  
  10. xmlstreamwriter.writeStartElement("player1");  
  11. xmlstreamwriter.writeAttribute("framescore", mPlayer1Frame);  
  12. xmlstreamwriter.writeAttribute("points", mPlayer1Point);  
  13. xmlstreamwriter.writeAttribute("break", mPlayer1ContinuePoint);  
  14.   xmlstreamwriter.writeCharacters("Hello World");   //添加内容  
  15. xmlstreamwriter.writeEndElement();  
  16. //player2  
  17. xmlstreamwriter.writeStartElement("player2");  
  18. xmlstreamwriter.writeAttribute("framescore", mPlayer2Frame);  
  19. xmlstreamwriter.writeAttribute("points", mPlayer2Point);  
  20. xmlstreamwriter.writeAttribute("break", mPlayer2ContinuePoint);  
  21. xmlstreamwriter.writeEndElement();  
  22. xmlstreamwriter.writeEndElement();  
  23. xmlstreamwriter.writeEndElement();  
  24. xmlstreamwriter.writeEndDocument(); file.close();  
结果如下:

[cpp] 
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <xml>  
  3.     <round id="" tableid="1">  
  4.         <player1 framescore="" points="" break="">Hello World</player1>  
  5.         <player2 framescore="" points="" break=""/>  
  6.     </round>  
  7. </xml>  

读文件时,用isStartElement来判断标志的起始

<name a=""></name>形式,用attributes().value("a")

<name>a</name>形式,用readElementText

在读取时,是通过循环,while (!reader.atEnd()) {reader.readNext();.....;}

[cpp] 
 
  1. QFile file("test.txt");  
  2. file.open(QIODevice::ReadOnly);  
  3.   
  4. QXmlStreamReader reader(&file);  
  5.   
  6. while (!reader.atEnd()) {  
  7.     reader.readNext();  
  8.     if (reader.isStartElement()) {  
  9.         if (reader.name() == "round") {  
  10.             qDebug() << reader.attributes().value("id").toString();  
  11.             qDebug() << reader.attributes().value("tableid").toString();  
  12.         } else if (reader.name() == "player1") {  
  13.             qDebug() << reader.attributes().value("framescore").toString();  
  14.             qDebug() << reader.attributes().value("points").toString();  
  15.             qDebug() << reader.attributes().value("break").toString();  
  16.             qDebug() << reader.readElementText();  
  17.         } else if (reader.name() == "player2") {  
  18.             qDebug() << reader.attributes().value("framescore").toString();  
  19.             qDebug() << reader.attributes().value("points").toString();  
  20.             qDebug() << reader.attributes().value("break").toString();  
  21.             qDebug() << reader.readElementText();  
  22.         }  
  23.     }  
  24. }  
  25. file.close();  
结果如下

[html] 
 
  1. ""   
  2. "1"   
  3. ""   
  4. ""   
  5. ""   
  6. "Hello World"   
  7. ""   
  8. ""   
  9. ""   
  10. ""   

你可能感兴趣的文章
深入理解JVM虚拟机4:Java class介绍与解析实践
查看>>
深入理解JVM虚拟机5:虚拟机字节码执行引擎
查看>>
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
深入理解JVM虚拟机9:JVM监控工具与诊断实践
查看>>
深入理解JVM虚拟机10:JVM常用参数以及调优实践
查看>>
深入理解JVM虚拟机11:Java内存异常原理与实践
查看>>
深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
查看>>
深入理解JVM虚拟机13:再谈四种引用及GC实践
查看>>
Spring源码剖析1:Spring概述
查看>>
Spring源码剖析2:初探Spring IOC核心流程
查看>>
Spring源码剖析3:Spring IOC容器的加载过程
查看>>
Spring源码剖析4:懒加载的单例Bean获取过程分析
查看>>
Spring源码剖析5:JDK和cglib动态代理原理详解
查看>>
Spring源码剖析6:Spring AOP概述
查看>>
Spring源码剖析7:AOP实现原理详解
查看>>
Spring源码剖析8:Spring事务概述
查看>>
Spring源码剖析9:Spring事务源码剖析
查看>>
重新学习Mysql数据库1:无废话MySQL入门
查看>>
探索Redis设计与实现2:Redis内部数据结构详解——dict
查看>>