QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写
本文标题:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写 本文地址:http://techieliang.com/2017/12/714/
1. 介绍
帮助文档:QXmlStreamReader、QXmlStreamWriter
除此以外读取时还需要使用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(). | 
主要是用StartDocument、EndDocument文档开始结束,StartElement、EndElement元素开始结束、Characters特征
1.2. 范例xml文件
- <?xml version="1.0" encoding="UTF-8"?>
 - <bookmark href="http://qt-project.org/">
 - <title>Qt Project</title>
 - </bookmark>
 
第一行为StartDocument
bookmark、title为StartElement,/bookmark、/title为EndElement
href为attributes的一项,可以有多项,通过QXmlStreamAttributes::value获取后面的地址内容
Qt Project是title这个element的charcters
2. 写xml
- #include <QCoreApplication>
 - #include <QFile>
 - #include <QXmlStreamWriter>
 - int main2(int argc, char *argv[]) {
 - QCoreApplication a(argc, argv);
 - QFile file("test.xml");
 - if(file.open(QIODevice::WriteOnly | QIODevice::Text)) {
 - QXmlStreamWriter stream(&file);
 - stream.setAutoFormatting(true);
 - stream.writeStartDocument();
 - stream.writeStartElement("bookmark");
 - stream.writeAttribute("href", "http://qt-project.org/");
 - stream.writeTextElement("title", "Qt Project");
 - stream.writeEndElement();
 - stream.writeEndDocument();
 - file.close();
 - }
 - return 0;
 - }
 
写并不复杂,按顺序写即可,注意区分Attribute和Element,如果是一个小节用StartElement,如果是单行的类似于<title>Qt Project</title>可以直接用writeTextElement。
QXmlStreamWriter只是格式操作,并不提供文件操作,需要利用QFile建立文件并传递指针,也可以提供QString的指针,这样最终的xml信息会赋值到QString中。
3. 读xml
- #include <QCoreApplication>
 - #include <QFile>
 - #include <QXmlStreamReader>
 - #include <QDebug>
 - int main(int argc, char *argv[]) {
 - QCoreApplication a(argc, argv);
 - QFile file("test.xml");
 - if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
 - QXmlStreamReader xml(&file);
 - while (!xml.atEnd() && !xml.hasError()) {//循环逐行读取
 - QXmlStreamReader::TokenType token = xml.readNext();
 - if(token == QXmlStreamReader::StartDocument)//文件开始跳过
 - continue;
 - if(token == QXmlStreamReader::StartElement) {//StartElement类型,主要针对bookmark和title
 - if(xml.name() == "bookmark") {//bookmark读取,其下attributes有但只有一个
 - qDebug()<<"StartElement-"<<xml.name();
 - QXmlStreamAttributes attributes = xml.attributes();
 - if(attributes.hasAttribute("href")) {//针对href的attribute做判断
 - qDebug()<<"Attributes-"<<attributes.value("href");//返回值是QStringRef
 - }
 - //多个attributes在这里增加更多的if
 - continue;
 - }
 - if(xml.name() == "title") {//title
 - xml.readNext();//没有attributes,理应直接进入while,此处偷懒了
 - if(xml.isCharacters()) //可以做Characters判断也可以直接用text
 - qDebug()<<"title-Characters-"<<xml.text();
 - }
 - }
 - }
 - if (xml.hasError()) {
 - //范例,判断枚举类型,写出错误字符串
 - if(xml.error() == QXmlStreamReader::CustomError) {
 - //可以直接写出错误字符串
 - qDebug()<<"error:" <<xml.errorString();
 - }
 - }
 - }
 - return 0;
 - }
 
- 上述代码都没判断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
QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写的更多相关文章
- 实现动态的XML文件读写操作
		
实现动态的XML文件读写操作(依然带干货) 前言 最近由于项目需求,需要读写操作XML文件,并且存储的XML文件格式会随着导入的数据不同而随时改变(当然导入的数据还是有一定约束的),这样我们要预先定义 ...
 - 实现动态的XML文件读写操作(依然带干货)
		
前言 最近由于项目需求,需要读写操作XML文件,并且存储的XML文件格式会随着导入的数据不同而随时改变(当然导入的数据还是有一定约束的),这样我们要预先定义好XML文件的格式就不太现实了,如何实现不管 ...
 - Qt解析XML文件(QXmlStreamReader)
		
(2013-08-03 10:53:53) 转载▼ 如何使用QXmlStreamReader来解析格式良好的XML,Qt的文档中指出,它是一种更快.更方便的Qt自己的SAX解析器(QXml ...
 - Qt对xml文件的读写
		
最近研究了一下qt下对xml文件的读写,小计一下,成为自己的知识. main函数调用: #include <QApplication> #include "readconfig. ...
 - .NET下XML文件的读写
		
一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的X ...
 - 初识---Qt解析XML文件(QDomDocument)
		
关于XML及其使用场景不在此多做介绍,今天主要介绍Qt中对于XML的解析.QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢? DOM(Document Ob ...
 - 爪哇国新游记之十三----XML文件读写
		
/** * XML读写示例 * @author hx * */ public class XmlReaderWriter{ /** * 读取一个XML文件,返回一个雇员链表 * @param file ...
 - [Unity基础]移动平台下的文件读写
		
From:http://blog.csdn.net/lyh916/article/details/52161633 参考链接: http://www.cnblogs.com/murongxiaopif ...
 - Qt之xml文件解析
		
XML文件简介 XML - EXtensible Markup Language,可拓展标记语言 Qt中加载XML模块 .pro 文件中添加 QT += xml Qt的XML访问方式 引用:https ...
 
随机推荐
- RUBY惯用方法(转)
			
RUBY惯用方法 目录 迭代 ||=赋值 程序入口 预设变量和特殊记号 inject 并行赋值 *的匹配 rescue简单用法 命名参数的默认值 精细duck typing控制 获取metaclass ...
 - BurpSuite—-Repeater模块(中继器)
			
一.简介 Burp Repeater 是一个手动修改并补发个别 HTTP 请求,并分析他们的响应的工具.它最大的用途就是和其他 Burp Suite 工具结合起来.你可以从目标站点地图,从 Burp ...
 - 嵌入式Linux 网络编程
			
涉及到的数据结构: 下面首先介绍两个重要的数据类型:sockaddr和sockaddr_in,这两个结构类型都是用来保存socket地址信息的 定义如下所示: struct sockaddr { un ...
 - 001---mysql
			
Mysql数据库 数据库相关概念 数据库服务器:运行数据管理软件的计算机 数据库:顾名思义数据仓库,是一个文件夹.存储多个文件(数据表) 数据表:对应一个文件,存储在数据库下 数据:对应文件中的每一行 ...
 - java入门---运算符&算术运算符&自增自减运算符&关系运算符&位运算符
			
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 ...
 - Java第五次实验报告
			
Java第五次实验报告 实验一 实验内容 两人一组结对编程: 参考 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC. ...
 - echarts x轴文字换行显示
			
xAxis : [ { splitLine:{show:false}, type : 'category', data : ['社交人际','沟通交流','心理认知','游戏玩耍','大小运动','生 ...
 - Mac Eclipse快捷键
			
Command + O:显示大纲Command + 1:快速修复Command + D:删除当前行Command + Option + ↓:复制当前行到下一行Command + Option + ↑: ...
 - Drupal8 新建第一个模块
			
参考: https://www.drupal.org/developing/modules/8 https://www.drupal.org/node/1915030 https://www.drup ...
 - Pandas v0.23.4手册汉化
			
Pandas手册汉化 此页面概述了所有公共pandas对象,函数和方法.pandas.*命名空间中公开的所有类和函数都是公共的. 一些子包是公共的,其中包括pandas.errors, pandas. ...