首页 > 其他分享 >Qt XML读写之 QXmlStreamReader、QXmlStreamWriter

Qt XML读写之 QXmlStreamReader、QXmlStreamWriter

时间:2023-05-09 17:22:57浏览次数:47  
标签:XML xml Qt QFile writer file QXmlStreamReader

Overview

QtXML将不再接收额外的功能。对于迭代地读取或编写XML文档(SAX),Qt建议使用Qt Core的QXmlStreamReader和QXmlStreamWriter类。这些类既易于使用,又更符合XML标准。
但是遗憾的是如果想修改更新XML文档,这个模块没有提供解决方案,还只能使用QDomDocument。
QXmlStreamReader类提供了一个快速解析器,通过一个简单的流API读取格式良好的XML。
QXmlStreamReader的典型循环是这样的:

  QXmlStreamReader xml;
  ...
  while (!xml.atEnd()) {
        xml.readNext();
        ... // do processing
  }
  if (xml.hasError()) {
        ... // do error handling
  }

头文件

#include <QXmlStreamReader> 
#include <QXmlStreamWriter>

示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <tag id="1" time="2002/1/1">
        <name>test1</name>
        <value>100</value>
        <!--the first one-->
    </tag>
    <tag id="2" time="2019/2/2">
        <name>test2</name>
        <value>200</value>
    </tag>
</root>

QXmlStreamReader

QString strFile("test1.xml");
    QFile file(strFile);
    if (!file.open(QFile::ReadOnly | QFile::Text)) { 
        return;
    }
    QXmlStreamReader reader(&file);
    while (!reader.atEnd()) {
        QXmlStreamReader::TokenType nType = reader.readNext();
        if (nType == QXmlStreamReader::StartElement) {
            QString tagStr = reader.name().toString();
            qDebug() << reader.name().toString();
            if (QString::compare(tagStr, QStringLiteral("tag")) == 0)
            {
                QXmlStreamAttributes  Attributes = reader.attributes();
                if (Attributes.hasAttribute("id")) {
                    qDebug() << Attributes.value("id").toString();
                }
                if (Attributes.hasAttribute("time")) {
                    qDebug() << Attributes.value("time").toString();
                }
            }
            else if (QString::compare(tagStr, QStringLiteral("root")) == 0)
            {
                
            }
            else
            {
                qDebug() << reader.readElementText();
            }
        }
        else
        {
            if (reader.isStartDocument())
            {
                qDebug() << reader.documentVersion().toString();
                qDebug() << reader.documentEncoding().toString();
            }
            if (reader.isComment())
            {

            }
        }
    }

QXmlStreamWriter

QFile file("test1.xml");
    if (!file.open(QFile::WriteOnly | QFile::Text)) { 
        return;
    }
    QXmlStreamWriter writer(&file);
    writer.setCodec("UTF-8");  // XML 编码
    writer.setAutoFormatting(true); // 自动格式化
    writer.writeStartDocument("1.0", true);  // 开始文档(XML 声明)
    writer.writeStartElement("root");  // 开始根元素 
    writer.writeStartElement("tag");  // 开始子元素 

    writer.writeAttribute("id", "1");  // 属性
    writer.writeAttribute("time", "2002/1/1");  // 属性

    writer.writeTextElement("name", "test1");
    writer.writeTextElement("value", "100");
    writer.writeComment("the first one");
    writer.writeEndElement(); //结束子元素

    writer.writeStartElement("tag");
    writer.writeAttribute("id", "2");  // 属性
    writer.writeAttribute("time", "2019/2/2");  // 属性
    writer.writeTextElement("name", "test2");
    writer.writeTextElement("value", "200");

    writer.writeEndElement();  // 结束子元素 </Blog>
    writer.writeEndElement();  // 结束根元素 </Blogs>
    writer.writeEndDocument();  // 结束文档
    file.close();

参考链接

qxmlstreamwriter
qxmlstreamreader
Modify an XML file QXMLStreamReader/Writer

标签:XML,xml,Qt,QFile,writer,file,QXmlStreamReader
From: https://www.cnblogs.com/yg1990/p/17385697.html

相关文章

  • MQTT-保留消息和遗嘱消息
    保留消息为什么需要保留消息        如果不考虑持久会话的因素,那么MQTT订阅只有在客户端连接之后才能创建,所以服务端不能提前预知某个主题会被哪些服务端订阅或者某个客户端会订阅哪些主题,所以当消息到达服务端之后,服务端只会把消息分发给当前已经存在的订阅者,......
  • QT 获取下载文件大小
    1开发环境linux版本:统信UOS1030(可以认为是特殊的ubuntu)开发语言:C++QT:5.9.92实现代码头文件#include<QtNetwork>Qt.pro中需要加对应一行QT+=network函数代码:intgetFileInfoSize(QStringurl){qDebug()<<"getFileInfoSizeurl:"<<url.toSt......
  • 【PyQt6】Python实现QComboBox显示文本与对应值不同的方法
    问题实现QComboBox显示文本与对应值不同的方法。比如下拉框显示“正确”和“错误”,但程序中想要获取“1”和“0”,但又不想再根据显示内容来判断。解决#设置combobox.addItem("正确",1)combobox.addItem("错误",0)#获取text=combobox.currentText()#正确/错误val......
  • Qt音视频开发45-音视频类结构体参数的设计
    一、前言视频监控内核组件重构和完善花了一年多时间,整个组件个人认为设计的最好的部分就是各种结构体参数的设计,而且分门别类,有枚举值,也有窗体相关的结构体参数,解码相关的结构体参数,同时将部分常用的结构体参数的获取和设置单独提供了函数,参阅海康大华等大厂的sdk的设计方式,也是......
  • QT设置窗口边框圆角
    1.直接设置样式  setStyleSheet("border:5pxsolidred;border-radius:10px")2.this->setAttribute(Qt::WA_TranslucentBackground);//设置窗口背景透明this->setWindowFlags(Qt::FramelessWindowHint);//设置无边框窗口 voidSystemWarnDialog::paintEvent(Q......
  • CMake+Visual Studio构建Qt程序
    转载:https://www.codenong.com/cs106288798/转载:https://zhuanlan.zhihu.com/p/400804242一、编写代码文件main.cpp#include<QApplication>#include"Mainwindow.h"intmain(intargc,char*argv[]){QApplicationapp(argc,argv);MainWindowmain......
  • QT5 QJson与QString相互转换
    QT5QJson与QString相互转换QString转QJsonQJsonObjectMainWindow::QstringToJson(QStringjsonString){QJsonDocumentjsonDocument=QJsonDocument::fromJson(jsonString.toLocal8Bit().data());if(jsonDocument.isNull()){qDebug()<<"StringNULL&......
  • 【Oracle】使用xmlagg(xmlparse(content()).getclobval()拼接信息
    使用xmlagg(xmlparse(content()).getclobval()拼接信息简单来说格式如下xmlagg(xmlparse(content(内容||分割符)).getclobval()内容就是使用显示的数据部分,分隔符不同效果不同,分隔符可以使用chr()函数无分隔符xmlagg(xmlparse(content('这是一个字段:'||v.supercode||'、......
  • Qt隐式共享
    看了关于Qt隐式共享的介绍,很像之前学习的智能指针,复制对象的时候引用计数+1。(1) 深拷贝 : 即就是生成对象的一个完整的复制品;(2)浅拷贝:只是一个引用复制(比如仅仅复制指向共享数据的指针)。(3)隐式共享:也叫做写时复制(copyonwrite)。Qt中的很多C++类通过使用隐式数据共享......
  • Qt XML 读写
    QtXML读写XML简介XML(ExtensibleMarkupLanguage)是一种类似于HTML,但是没有使用预定义标记的语言。有许多基于XML的语言,包括XHTML、MathML、SVG、RSS和RDF(en-US)。XML声明<?xmlversion="1.0"encoding="UTF-8"?>注释<!--Comment-->实体像HTML一样,XML......