Qt6.5示例:QXmlStreamReader解析XML文档

本文介绍了C++中的QXmlStreamReader类,一种用于高效解析XML文档的工具,支持一次解析模式,展示了如何通过不同方式创建QXmlStreamReader对象,以及关键函数的使用和解析XML文件的完整示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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】-

#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。

喜欢本文章,记得点赞、分享、关注哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天恩软件工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值