72 XML流读取XML
为什么用流读写XML?
从Qt 4.3开始引入了两个新的类来读取和写入XML文档: QXmlStreamReader和QXmlStreamWriter。
QXmlStreamReader类提供了一个快速的解析器通过一个简单的流API来读取格式良好的XML文档,它是作为Qt的SAX解析器的替代品的身份出现的,因为它比SAX解析器更快更方便。流读取器的基本原理就是将XML文档报告为一个记号(tokens)流,应用程序代码自身来驱动循环,在需要的时候可以从读取器中一个接一个的拉出记号。这个是通过调用readNext()函数实现的,它可以读取下一个记号,然后返回一个记号类型,它由QXmlStreamReader::TokenType定义,其所有取值如表所列。然后可以使用isStartElement()和text()等函数来判断这个记号是否包含需要的信息。
与QXmlStreamReader对应的是QXmlStreamWriter,它通过一个简单的流API提供了一个XML写入器。QXmlStreamWriter的使用也是十分简单的,只需要调用相应的记号的写入函数来写入相关数据即可。
XML流包含两个部分QXmlStreamReader和和QXmlStreamWriter。 QXmlStream Reader 类提供了一个快速的解析器.它通过一个简单的流API 来读取格式良好的XML 文挡,它是作为Qt 的SAX 解析器的替代品身份出现的,因为它比SAX 解析器更快更方便。
在SAX 中,应用程序必须提供处理器(回调函数)来从解析器获得所谓的XML 事件;而QXmlStreamReader是应用程序代码向身来驱动循环,在需要的时候可以从读取器中一个接一个地拉出记号。
流读取XML
流读取是通过调用readNext ()函数实现的. 它可以读取下一个记号,然后返回一个记号类型;它由枚举变量QXmlStreamReader : : Token Type 定义。然后可以使用isStartElement()和text()等函数来判断这个记号是否包含需要的信息。使用这种主动拉取记号的方式最大的好处就是可以构建递归解析器,也就是可以在不同的函数或者类中来处理XML 文档中的不同记号。
QFile file("../myxmlstream/my.xml");
if (!file.open(QFile::ReadOnly | QFile::Text)) {
qDebug()<<"Error: cannot open file"; return 1; }
QXmlStreamReader reader;
reader.setDevice(&file); // 设置文件,这时会将流设置为初始状态
while (!reader.atEnd()) { // 如果没有读到文档结尾,而且没有出现错误
// 读取下一个记号,它返回记号的类型
QXmlStreamReader::TokenType type = reader.readNext();
// 下面便根据记号的类型来进行不同的输出
if (type == QXmlStreamReader::StartDocument)
qDebug() << reader.documentEncoding() << reader.documentVersion();
if (type == QXmlStreamReader::StartElement) {
qDebug() << "<" << reader.name() << ">";
if (reader.attributes().hasAttribute("id"))
qDebug() << reader.attributes().value("id"); }
if (type == QXmlStreamReader::EndElement)
qDebug() << "</" << reader.name() << ">";
if (type == QXmlStreamReader::Characters && !reader.isWhitespace())
qDebug() << reader.text(); }
// 如果读取过程中出现错误,那么输出错误信息
if (reader.hasError()) { qDebug() << "error: " << reader.errorString();}
file.close();
流写入XML
与QXmlStreamReader对应的是QXmlStreamWriter,它通过一个简单的流API提供了一个XML 写人器。QXmlStreamWriter的使用也十分简单,只需要调用相应记号的写入函数来写入相关数据即可。
QFile file("../myxmlstream/my2.xml");
if (!file.open(QFile::WriteOnly | QFile::Text))
{
qDebug() << "Error: cannot open file";
return 1;
}
QXmlStreamWriter stream(&file);
stream.setAutoFormatting(true);
stream.writeStartDocument();
stream.writeStartElement("bookmark");
stream.writeAttribute("href", "http://www.qt.io/");
stream.writeTextElement("title", "Qt Home");
stream.writeEndElement();
stream.writeEndDocument();
file.close();
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ABAP和JavaScript的懒加载,单例和桥接模式的实现和比较
- ExecutorCompletionService源码学习
- Erlang和RabbitMQ的windows环境配置
- ScheduledThreadPoolExecutor源码学习
- Github创建您的私服
- SAP BSP应用有状态和无状态行为差异比较
- Executors源码学习
- Java注解学习
- 使用ES5,ES6和SAP ABAP实现非波拉契数列Fibonacci
- SpringBoot整合自定义注解
- nginx被动检测
- Python获取股票历史数据
- 实习第四周
- 浅谈推进有赞全站 HTTPS 项目-工程篇
- Checks autowiring problems in a bean class问题解决