qt xml解析与处理

news/2024/9/27 23:34:56 标签: xml, qt

一、QXMLStreamWriter

QXmlStreamWriter是Qt框架中提供的一个用于写入XML文档的类。它提供了一个简单的流API,允许开发者方便地生成符合XML规范的文档。

基本功能

  • 创建、修改和保存XML文件:使用QXmlStreamWriter,可以创建新的XML文件,修改现有的XML文件内容,并将结果保存到文件中。
  • 支持XML元素:包括节点、属性、命名空间等常见的XML元素。
  • 编码支持:默认情况下,QXmlStreamWriter以UTF-8编码XML,但可以通过setCodec()方法设置不同的编码。

常用函数:

使用方法

  1. 包含头文件:在使用QXmlStreamWriter之前,需要包含其头文件#include <QXmlStreamWriter>
  2. 设置写入设备:QXmlStreamWriter通过QIODevice来写入数据,因此需要先创建一个QIODevice对象(如QFile),并设置其为QXmlStreamWriter的写入设备。
  3. 写入XML内容:通过QXmlStreamWriter提供的各种方法,如writeStartDocument()、writeStartElement()、writeAttribute()、writeCharacters()、writeEndElement()和writeEndDocument()等,来构建XML文档的结构和内容。
  4. 关闭文件:完成写入后,应关闭QFile对象以释放资源。

二、QXmlStreamReader

QXmlStreamReader是Qt框架中的一个类,专门用于解析XML文档。它提供了一种基于流的、高效的读取XML数据的方式,特别适合处理大型XML文件或需要实时解析XML数据的场景。

常用函数

  • readNext():读取下一个标记,并返回其类型。
  • name():获取当前标记的名称(如果是元素标记)。
  • attributes():获取当前元素的属性集合(如果是StartElement)。
  • text():获取当前字符标记的文本内容(如果是Characters标记)。
  • isStartElement()isEndElement()等:判断当前标记的类型。
  • atEnd():判断是否已经读取到文档的末尾。
  • hasError():判断在解析过程中是否有错误发生。
  • errorString():获取发生的错误信息的字符串表示。

使用方法

  1. 创建对象:首先,需要创建一个QXmlStreamReader对象,并将其与要解析的XML文档关联起来。这可以通过将QFile对象(或其他QIODevice派生类的对象)传递给QXmlStreamReader的构造函数或调用setDevice()方法来实现。
  2. 读取标记:使用readNext()方法读取XML文档中的下一个标记。该方法会返回一个枚举值,表示读取到的标记类型(如StartElement、EndElement、Characters等)。
  3. 处理标记:根据readNext()返回的标记类型,使用相应的方法来获取和处理标记的信息。例如,如果读取到的是一个StartElement,可以使用name()获取元素名称,使用attributes()获取元素属性等。
  4. 循环读取:通常,会将readNext()方法放在一个循环中,直到读取到文档的末尾(atEnd()返回true)。
  5. 错误处理:在循环结束后,应检查是否有错误发生(hasError()返回true),如果有,则使用errorString()等方法获取错误信息并进行处理。

三、DEMO

output.xml

<?xml version="1.0" encoding="UTF-8"?>
<student>
    <id id="1">
        <name>王维</name>
        <age>15</age>
        <height>165</height>
        <weight>50</weight>
    </id>
</student>
void createXML(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        return ;
    }
    QXmlStreamWriter Writer;
    Writer.setDevice(&file);//获取流
    Writer.setAutoFormatting(true);
    Writer.writeStartDocument();//添加XML说明(版本号和编码信息
    Writer.writeStartElement("student");//写入起始元素
    Writer.writeStartElement("id");
    Writer.writeAttribute("id","1");//写入属性
    Writer.writeTextElement("name","王维");
    Writer.writeTextElement("age","15");
    Writer.writeTextElement("height","165");
    Writer.writeTextElement("weight","50");
    Writer.writeEndElement();//结束id元素编辑
    Writer.writeEndElement();//结束student元素编辑
    Writer.writeEndDocument();//结束整个的编辑
    file.close();//关闭文件
}

void parseXML(const QString &fileName) {
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning("Failed to open file.");
        return;
    }

    QXmlStreamReader reader(&file);

    while (!reader.atEnd() && !reader.hasError())
    {
        QXmlStreamReader::TokenType type = reader.readNext();
        if (type == QXmlStreamReader::StartDocument)
        {
            qDebug()<<reader.documentVersion()<<"  "<<reader.documentEncoding();//读取版本号和编码类型
            continue;
        }

        else if (type == QXmlStreamReader::StartElement)
        {
            qDebug() << "name:" << reader.name();//获取元素名
            if(reader.attributes().hasAttribute("id"))//如果有属性
            {
                qDebug() << "id:" << reader.attributes().value("id");//输出属性
            }
        }
        else if(type==QXmlStreamReader::EndElement)//获取结束元素
        {
            qDebug() << "end:" <<reader.name();
        }
        else if(type==QXmlStreamReader::Characters&&!reader.isWhitespace())
        {
            qDebug() << "text:" << reader.text();//读取内容
        }

    }

    if (reader.hasError()) {
        qWarning() << "XML Error:" << reader.errorString();
    }

    file.close();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    createXML("output.xml");
    parseXML("output.xml");

    return a.exec();
}

qq群交流:698593923

觉得有帮助的话,打赏一下呗。。

           


http://www.niftyadmin.cn/n/5679824.html

相关文章

《AI时代程序员的核心技能升级之路》

一、引言  随着AI技术的飞速发展&#xff0c;AIGC大语言模型如chatgpt、midjourney、claude等不断涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正经历着前所未有的变革。面对这一趋势&#xff0c;程序员应该如何应对&#xff1f;是专注于某个领域深耕…

【C++】 vector 迭代器失效问题

【C】 vector 迭代器失效问题 一. 迭代器失效问题分析二. 对于vector可能会导致其迭代器失效的操作有&#xff1a;1. 会引起其底层空间改变的操作&#xff0c;都有可能是迭代器失效2. 指定位置元素的删除操作--erase3. Linux下&#xff0c;g编译器对迭代器失效的检测并不是非常…

设备管理系统-TPM(PC+APP/PDA全流程)高保真Axure原型 源文件分享

随着科技的不断发展&#xff0c;企业对于设备管理的需求也日益增强。为了满足企业在设备管理方面的各种需求&#xff0c;站长为大家整理了一套设备管理系统TPM&#xff08;PCAPP/PDA全流程&#xff09;高保真Axure原型&#xff0c;通过这套原型&#xff0c;企业能够实现对设备的…

掌握Spring Boot数据库集成:用JPA和Hibernate构建高效数据交互与版本控制

在现代应用开发中&#xff0c;数据库操作是核心环节之一。Spring Boot提供了简化数据库集成的强大工具&#xff0c;而JPA&#xff08;Java Persistence API&#xff09;和Hibernate是两种非常流行的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;可以帮助我们将对象…

[数据结构] 二叉树题目 (二)

目录 一. 另一颗树的子树 1.1 题目 1.2 示例 1.3 分析 1.4 解决 二. 平衡二叉树 2.1 题目 2.2 示例 2.3 分析 2.4 解决 三. 二叉树的遍历和创建 3.1 题目 3.2 示例 3.3 解决 一. 另一颗树的子树572. 另一棵树的子树 - 力扣&#xff08;LeetCode&#xff09; 1.1…

Webpack优化问题

目录 打包流程swcthread-loaderhash升级插件 打包流程 webpack 的打包流程大致可以分为以下几个步骤&#xff1a; 初始化&#xff1a;webpack 通过配置文件和 Shell 参数&#xff0c;初始化参数&#xff0c;确定入口文件、输出路径、加 载器、插件等信息。接下来读取配置文件…

React学习笔记(3.0)

classnames优化类名控制 classnames是一个简单的JS库&#xff0c;可以非常方便的通过条件动态控制class类名的显示。 安装classnames&#xff1a; npm i classnames 导入&#xff1a; import classNames from classnames <div className{classNames(box3,{box2:11})}&g…