1 QXmlStreamReader介绍
QXmlStreamReader是一个用于XML文档的类。它提供了一个快速的解析器,通过简单的流API来读取XML文档,特别适合实现一次解析器(即只需读取文档一次,然后像遍历器一样从头到尾一次性处理XML文档)。
QXmlStreamReader支持从QIODevice、QString或原始QByteArray中读取XML文档数据。
2 如何使用QXmlStreamReader
头文件:#include <QXmlStreamReader>
cmake:find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake:QT += core
3 XML文档介绍
XML全称是可扩展标记语言(Extensible Markup Language),XML是标准通用标记语言(SGML)的一个子集。XML主要用于标记电子文件,使其具有结构性。它可以用来标记数据、定义数据类型,是一种允许用户定义自己的标记语言的源语言。
XML文档格式一般包含以下几部分:
声明部分:XML文件的声明部分包括XML版本号和字符集声明,格式例子:。
根元素:一般情况下XML文件中的所有元素都包含在一个根元素中。根元素是XML文件的起点。
元素:XML文件中的元素包含一个开始标记、一个结束标记和中间的数据。元素的格式:data。其中element为元素的名称,data为元素的数据。
属性:XML文件中的元素可以包含属性,属性用于描述元素的特性。属性的格式:data。其中attribute为元素的某个属性名称,对应value是属性的值,元素可以包含多个属性值。
-
XML文档例子:
以下是一份国际化翻译中文简体XML文档例子,root是根元素,root元素的Language属性值是'SimpChinese'。
root根元素包括几个Text子元素,属性Code是唯一访问的Key,Text元素文本分别是翻译的中文。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 根元素 -->
<root Language='SimpChinese'>
<Text Key='S_ADD'>新建</Text>
<Text Key='S_DELETE'>删除</Text>
<Text Key='S_EDIT'>编辑</Text>
<Text Key='S_SAVE'>保存</Text>
<Text Key='S_QUERY'>查询</Text>
<!-- ...... -->
</root>
4 QXmlStreamReader解析XML文档方法
-
QXmlStreamReader构造函数:
QXmlStreamReader支持通过文件(QIODevice)、原始数据(QByteArray)和字符串(QString)等方式解析XML文档。
// 构造函数。
QXmlStreamReader(QIODevice *device)
QXmlStreamReader(const QByteArray &data)
QXmlStreamReader(const QString &data)
QXmlStreamReader(const char * data)
-
通过文件解析XML文档例子:
/**** 例子: ****/
#include <QFile>
#include <QXmlStreamReader>
// 打开XML文件。
QFile file("SimpChinese.xml");
file.open(QIODevice::ReadOnly);
// 创建QXmlStreamReader对象,并读取XML文档。
QXmlStreamReader xml_reader(&file);
-
QXmlStreamReader几个关键函数:
// 当前标记是否到文档结尾。
bool atEnd() const
// 当前标记是否解析到错误。
bool hasError() const
// 读取下一个标记。
QXmlStreamReader::TokenType readNext()
// 当前标记类型。
QXmlStreamReader::TokenType tokenType() const
// 当前标记是否文档开头。
bool isStartDocument() const
// 当前标记是否文档结尾。
bool isEndDocument() const
// 当前标记是否元素开头。
bool isStartElement() const
// 当前标记是否元素结尾。
bool isEndElement()
// 返回当前标记名称。
QStringRef name() const
// 返回当前标记的属性列表。
QXmlStreamAttributes attributes() const
-
QXmlStreamReader::TokenType标记类型:
QXmlStreamReader::TokenType标记类型用于表示XML流的读取状态。
QXmlStreamReader::TokenType宏定义如下:
QXmlStreamReader::NoToken 0 没有标志。
QXmlStreamReader::Invalid 1 无效的XML数据。
QXmlStreamReader::StartDocument 2 XML文档的开始。
QXmlStreamReader::EndDocument 3 XML文档的结束。
QXmlStreamReader::StartElement 4 元素的开始。
QXmlStreamReader::EndElement 5 元素的结束。
QXmlStreamReader::Characters 6 元素中的文本信息。
QXmlStreamReader::Comment 7 注释。
QXmlStreamReader::DTD 8 文档类型定义。
QXmlStreamReader::EntityReference 9 实体引用。
QXmlStreamReader::ProcessingInstruction 10 处理指令。
-
遍历元素属性:
/**** 例子: ****/
QXmlStreamReader xmlReader(&file);
//...
QXmlStreamAttributes attributes = xmlReader.attributes();
// 遍历元素所有属性。
for (const auto& attribute: attributes)
{
QString qstr_name = attribute.name().toString(); // 属性名称。
QString qstr_value = attribute.value().toString(); // 属性值。
qDebug() << "attribute " << qstr_name << " = " << qstr_value;
}
5 QXmlStreamReader解析XML文件完整示例
首先通过QFile打开(SimpChinese.xml)文件,再利用QFile创建一个QXmlStreamReader对象;然后用流式方式利用readNext()方法从头到尾解析XML文件内容。
-
示例代码:
#include <QCoreApplication>
#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 打开XML文件。
QFile file("SimpChinese.xml");
if (!file.open(QIODevice::ReadOnly))
{
return -1;
}
// 创建QXmlStreamReader对象,并读取XML数据。
QXmlStreamReader xml_reader(&file);
while (!xml_reader.atEnd() && !xml_reader.hasError())
{
// 读取下一个标记。
xml_reader.readNext();
// 根据标记类型进行处理。
if (xml_reader.isStartDocument())
{
// 文档开始标记。
qDebug() << "Start of document";
}
else if (xml_reader.isEndDocument())
{
// 文档结尾标记。
qDebug() << "End of document";
}
else if (xml_reader.isStartElement())
{
// 元素开始标记。对应于<element>。
qDebug() << "Start of element:" << xml_reader.name().toString();
// 元素属性。对应于<element attribute=value>。
QXmlStreamAttributes attributes = xml_reader.attributes();
// 遍历元素所有属性。
for (const auto& attribute: attributes)
{
QString qstr_name = attribute.name().toString(); // 属性名称。
QString qstr_value = attribute.value().toString(); // 属性值。
qDebug() << "attribute " << qstr_name << " = " << qstr_value;
}
}
else if (xml_reader.isEndElement())
{
// 元素结尾标记。对应于</element>。
qDebug() << "End of element:" << xml_reader.name().toString();
}
}
return 0;
}
-【End】-
#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。
喜欢本文章,记得点赞、分享、关注哦~