QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写

版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写     本文地址:http://techieliang.com/2017/12/714/

文章目录

1. 介绍

帮助文档:QXmlStreamReaderQXmlStreamWriter

除此以外读取时还需要使用QXmlStreamAttributes

1.1. QXml-Token标记类型

Constant Value Description
QXmlStreamReader::NoToken 0 The reader has not yet read anything.
QXmlStreamReader::Invalid 1 An error has occurred, reported in error() and errorString().
QXmlStreamReader::StartDocument 2 The reader reports the XML version number in documentVersion(), and the encoding as specified in the XML document in documentEncoding(). If the document is declared standalone, isStandaloneDocument() returns true; otherwise it returns false.
QXmlStreamReader::EndDocument 3 The reader reports the end of the document.
QXmlStreamReader::StartElement 4 The reader reports the start of an element with namespaceUri() and name(). Empty elements are also reported as StartElement, followed directly by EndElement. The convenience function readElementText() can be called to concatenate all content until the corresponding EndElement. Attributes are reported in attributes(), namespace declarations in namespaceDeclarations().
QXmlStreamReader::EndElement 5 The reader reports the end of an element with namespaceUri() and name().
QXmlStreamReader::Characters 6 The reader reports characters in text(). If the characters are all white-space, isWhitespace() returns true. If the characters stem from a CDATA section, isCDATA() returns true.
QXmlStreamReader::Comment 7 The reader reports a comment in text().
QXmlStreamReader::DTD 8 The reader reports a DTD in text(), notation declarations in notationDeclarations(), and entity declarations in entityDeclarations(). Details of the DTD declaration are reported in in dtdName(), dtdPublicId(), and dtdSystemId().
QXmlStreamReader::EntityReference 9 The reader reports an entity reference that could not be resolved. The name of the reference is reported in name(), the replacement text in text().
QXmlStreamReader::ProcessingInstruction 10 The reader reports a processing instruction in processingInstructionTarget() and processingInstructionData().

主要是用StartDocumentEndDocument文档开始结束,StartElementEndElement元素开始结束、Characters特征

1.2. 范例xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <bookmark href="http://qt-project.org/">
  3. <title>Qt Project</title>
  4. </bookmark>

第一行为StartDocument

bookmark、title为StartElement,/bookmark、/title为EndElement

href为attributes的一项,可以有多项,通过QXmlStreamAttributes::value获取后面的地址内容

Qt Project是title这个element的charcters

2. 写xml

  1. #include <QCoreApplication>
  2. #include <QFile>
  3. #include <QXmlStreamWriter>
  4. int main2(int argc, char *argv[]) {
  5. QCoreApplication a(argc, argv);
  6. QFile file("test.xml");
  7. if(file.open(QIODevice::WriteOnly | QIODevice::Text)) {
  8. QXmlStreamWriter stream(&file);
  9. stream.setAutoFormatting(true);
  10. stream.writeStartDocument();
  11. stream.writeStartElement("bookmark");
  12. stream.writeAttribute("href", "http://qt-project.org/");
  13. stream.writeTextElement("title", "Qt Project");
  14. stream.writeEndElement();
  15. stream.writeEndDocument();
  16. file.close();
  17. }
  18. return 0;
  19. }

写并不复杂,按顺序写即可,注意区分Attribute和Element,如果是一个小节用StartElement,如果是单行的类似于<title>Qt Project</title>可以直接用writeTextElement。

QXmlStreamWriter只是格式操作,并不提供文件操作,需要利用QFile建立文件并传递指针,也可以提供QString的指针,这样最终的xml信息会赋值到QString中。

3. 读xml

  1. #include <QCoreApplication>
  2. #include <QFile>
  3. #include <QXmlStreamReader>
  4. #include <QDebug>
  5. int main(int argc, char *argv[]) {
  6. QCoreApplication a(argc, argv);
  7. QFile file("test.xml");
  8. if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  9. QXmlStreamReader xml(&file);
  10. while (!xml.atEnd() && !xml.hasError()) {//循环逐行读取
  11. QXmlStreamReader::TokenType token = xml.readNext();
  12. if(token == QXmlStreamReader::StartDocument)//文件开始跳过
  13. continue;
  14. if(token == QXmlStreamReader::StartElement) {//StartElement类型,主要针对bookmark和title
  15. if(xml.name() == "bookmark") {//bookmark读取,其下attributes有但只有一个
  16. qDebug()<<"StartElement-"<<xml.name();
  17. QXmlStreamAttributes attributes = xml.attributes();
  18. if(attributes.hasAttribute("href")) {//针对href的attribute做判断
  19. qDebug()<<"Attributes-"<<attributes.value("href");//返回值是QStringRef
  20. }
  21. //多个attributes在这里增加更多的if
  22. continue;
  23. }
  24. if(xml.name() == "title") {//title
  25. xml.readNext();//没有attributes,理应直接进入while,此处偷懒了
  26. if(xml.isCharacters()) //可以做Characters判断也可以直接用text
  27. qDebug()<<"title-Characters-"<<xml.text();
  28. }
  29. }
  30. }
  31. if (xml.hasError()) {
  32. //范例,判断枚举类型,写出错误字符串
  33. if(xml.error() == QXmlStreamReader::CustomError) {
  34. //可以直接写出错误字符串
  35. qDebug()<<"error:" <<xml.errorString();
  36. }
  37. }
  38. }
  39. return 0;
  40. }
  • 上述代码都没判断EndElement,不建议这样
  • 建议进入每一个StartElement都直接开启一个while循环,直到循环到EndElement,从何保证对一个开头到结尾的完整操作,而不是像上述代码吧title放在和bookmark同级的循环内,并没有标明title包含于bookmark的关系,这样容易导致错误。
  • 注意xml中每一个<>括住的项都作为一个标记,都占用一次readNext,其开头均为name,其后可能有attribute及对应value。
  • 每两个<>XXX<>之间的XXX均作为一个Characters标记,也占用一次readNext,也就是上文中仍有未打印出的Character(“\n??? “换行符和四个空格、纯换行符):因为QXml以”\r”作为换行识别那么在前后两行的<><>之间还会余留一个\n;在title前的缩进也会当做一项Character。因此建议保证完整的包含关系并做好isXXX或者token枚举类型的判断以免被干扰。

3.1. 其他

除上述xml操作以外,Qt还提供了Qt XML模块,用于更高级的xml操作,提供了高速及使用便利的操作函数(不可兼得呀)

高速的SAX方法读取,QXmlSimpleReader及相关类

使用便捷的DOM方式:QDomDocument及相关类

使用这两个方法,由于是用的非core模块,需要在pro中添加qt += xml

时间: 2024-11-05 15:54:50

QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写的相关文章

爪哇国新游记之十三----XML文件读写

/** * XML读写示例 * @author hx * */ public class XmlReaderWriter{ /** * 读取一个XML文件,返回一个雇员链表 * @param fileName * @return */ public List<Employee> readXml(String fileName){ List<Employee> employees=new ArrayList<Employee>(); SAXReader reader =

Win环境下的文件读写

在win环境下,有许多方法可以对文件进行读写操作,如MFC 中的CFile类,及一些开源的项目如QT中的QFile.开源的好得是可以多平台,而MFC只是微软自家的东西,对于想写跨平台的人,最好不用MFC. 最近在写开发时,突然碰到了一个问题,也是与读写文件有关,不过用的是C的方法,而不是C++,问题的表现是用C 中的Open创建的文件都是只读的,平常很少用这个方法所在网上找了下,才发现这个函数还有一个权限参数,默认是只读.现将C方式下的两种文件操作归纳下 open比起fopen是更低级别的IO操

Qt对xml文件的读写

最近研究了一下qt下对xml文件的读写,小计一下,成为自己的知识. main函数调用: 1 #include <QApplication> 2 #include "readconfig.h" 3 #include "writeconfig.h" 4 5 int main(int argc,char **argv) 6 { 7 QApplication a(argc,argv); 8 9 //ReadConfig readConfig; 10 11 //r

Qt解析XML文件(QXmlStreamReader)

(2013-08-03 10:53:53) 转载▼ 如何使用QXmlStreamReader来解析格式良好的XML,Qt的文档中指出,它是一种更快.更方便的Qt自己的SAX解析器(QXmlSimpleReader)的替代,它也较快,在某种情况下,比DOM(QDomDocument)更方便. XML文件: 解析方法: void ParseXML::parseXML(QString file_name) { if(file_name.isEmpty()) return; QFile *file =

.NET下XML文件的读写

一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的XML文档的读写操作.首先,我会向大家介绍.Net框架中与XML相关的命名空间和其中的重要类.其次,我还会给出有关的实例以使读者更进一步的了解XML文档的读写操作的具体方法. 二.XML命名空间和相关类简介: 在深入进行.Net框架下的XML文档的操作之前,我想很有必要向大家介绍.Net框架中与XML

Java中的的XML文件读写

读取xml文件: public static void getFamilyMemebers(){ DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); dbf.setIgnoringElementContentWhitespace(true); try { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(xmlPath); //

利用 Qt 读取 XML 文件的方法

XML 是可扩展标记语言(Extensible Markup Language)的缩写.XML 文件由内容和标记组成,通过以标记包围内容的方式将大部分内容包含在元素中. Qt 中提供了多种读取XML文件的方法,这里简单的记录一下用 QDomDocument 读取的步骤.为什么使用QDomDocument 呢,因为XML 本身就是一以树状结构组织数据的,而DOM 那是将数据组织为树状结构,最适合直观地展示XML数据. 下面的代码是Qt 帮助文件中自带的例子代码: QDomDocument doc(

用Qt读取xml文件,程序执行到 if(!doc.setContent(&amp;file)) 时候出错

看霍亚飞的那本<Qt Creator快速入门>,然后就照着写那个DOM方式读取xml文件的例子出这样的错误. 一开始大家都以为自己的路径会有问题,其实在之前open的时候没问题,怎么可能到后面这里才出问题呢?(自己也在这里绕了很多弯弯) 通过其他方式了解这个函数的原理,其实就是创建一个树,将xml格式的数据保存到一个树一样结构的doc里面去.也就是说,我们在创建这个树的时候出错了,定位一下就知道自己的XML文件是不是错了. 换一个xml,网上下下吧,比较一下发现,原来第一行的<?xml 

Go语言下的文件读写操作

在Go语言中,文件是使用一个os.File类的对象指针表示的,也可以称这指针为文件句柄(filehandle),os.Stdin和os.Stdout也是属于这个*os.File类型的. 下面举例说明 package main import (     "bufio"     "fmt"     "io"     "os" ) func main() {     inputFile, inputError := os.Open(