读取xml的内容并显示在textEdit中,导出xml文件

使用QXmlStreamReader方法读取xml文件

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItemModel>
#include <QtXml>
std::vector<std::map<QString, QString>> dataVector;



MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 按钮的槽函数
void MainWindow::on_pushButton_clicked()
{
    QString FilePath = "E:/QT_project/test_xml/ChairXML.xml";
    ShowContent(FilePath);
}

// 读取某个路径的xml文件
void MainWindow::ShowContent(QString FilePath)
{
    LoadXmlContent(FilePath);
}

// 使用QXmlStreamReader方法,并将所有信息显示在textEdit中
bool MainWindow::LoadXmlContent(QString FilePath)
{
    QFile file(FilePath);
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "Can not open file。";
        return false;
    }

    dataVector.clear();

    QXmlStreamReader reader;//创建一个阅读器
    reader.setDevice(&file);//设置需要读取的文件

    int count = 0;
    while(!reader.atEnd())//如果不到结尾
    {
        QXmlStreamReader::TokenType type=reader.readNext();//获取一个记号

        if(type==QXmlStreamReader::StartDocument)//读取XML说明
        {
            qDebug()<<reader.documentVersion()<<"  "<<reader.documentEncoding();//读取版本号和编码类型
        }

        if(type==QXmlStreamReader::StartElement)//获取元素
        {
            count++;
				
			// 将标签显示在ui上
            QString key = reader.name().toString();
            ui->textEdit->append(key);

            if(reader.attributes().hasAttribute("id"))//如果有属性  
            {
                count++;
                // qDebug()<<reader.attributes().value("id"); // 打印输出属性
                QString value = reader.attributes().value("id").toString();
                ui->textEdit->append(value);
            }
        }

        if(type==QXmlStreamReader::EndElement)//获取结束元素
        {
           qDebug()<<reader.name();
           QString name = reader.name().toString();
           ui->textEdit->append(name);
        }

        if(type==QXmlStreamReader::Characters&&!reader.isWhitespace())
        {
            count++;
            // qDebug()<<reader.text(); //打印读取内容
            QString value = reader.text().toString();
            ui->textEdit->append(value);
        }
    }

    if(reader.hasError())
    {
        qDebug()<<"error:"<<reader.errorString();  // 打印报错信息
    }

    file.close();//关闭文件
}

导出xml文件

cpp 复制代码
// 保存按钮,导出XML文件
void MainWindow::output_xml()
{

    QFile file("/home/user/output_task.xml");

    if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        qDebug()<<"文件写入失败!";
    }

    QXmlStreamWriter Writer;
    Writer.setDevice(&file);//获取流
    Writer.setAutoFormatting(true);
    Writer.writeStartDocument();//添加XML说明(版本号和编码信息


    /*  XML写入信息主要用的函数
    Writer.writeStartElement("节点1"); 开始一个节点
    Writer.writeAttribute("节点1", "信息0");//开始一个带有信息的节点
    Writer.writeTextElement("节点1的信息", "信息1");
    Writer.writeTextElement("节点1的信息", "信息2");
    Writer.writeEndElement();//结束一个节点(开始和结束必须一一对应)
    */

    // 写入数据
    Writer.writeStartElement("学校信息");//写入节点

        // 示例1
        Writer.writeStartElement("人物信息");
            Writer.writeTextElement("人物ID", "1"); //写入节点属性,只能放QString!
            Writer.writeTextElement("人物名称", "某人");
            Writer.writeTextElement("人物类型", "类型1");
            Writer.writeTextElement("人物说明", "无说明");
        Writer.writeEndElement();

        // 示例2
        Writer.writeStartElement("工作信息");
            Writer.writeTextElement("工作名称", "IT工作者");
            Writer.writeTextElement("所属省份", "湖南省");
            Writer.writeTextElement("工作类型", "算法");
            Writer.writeStartElement("工作所处位置的经纬度"); //可以在节点里再嵌入节点
                Writer.writeTextElement("经度", "东经101");
                Writer.writeTextElement("纬度", "北纬202");
            Writer.writeEndElement();
        Writer.writeEndElement();

    Writer.writeEndElement();  //结束节点


    //结束整个的文件的编辑
    Writer.writeEndDocument();
    file.close();//关闭文件
}

导出的xml如下所示:

cpp 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<学校信息>
    <人物信息>
        <人物ID>1</任务组ID>
        <人物名称>某人</任务组名称>
        <人物类型>类型1</任务组类型>
        <人物说明>无说明</任务组说明>
    </人物信息>
    <工作信息>
        <工作名称>IT工作者</部队名称>
        <所属省份>湖南省</所属国家>
        <工作类型>算法</部队类型>
        <工作所处位置的经纬度>
            <经度>东经101</经度>
            <纬度>北纬202</纬度>
        </工作所处位置的经纬度>
    </工作信息>
</学校信息>
相关推荐
郑重其事,鹏程万里7 小时前
commons-digester3(XML解析框架)
xml·java
七牛云行业应用8 小时前
实战GPT-5:用“XML三明治”和“完美循环”重构你的提示
xml·gpt·重构
跌入凡尘的张公子8 小时前
通过hutool生成xml
xml
optimistic_chen9 小时前
【Java EE进阶 --- SpringBoot】Mybatis操作数据库(基础二)
xml·数据库·spring boot·笔记·java-ee·mybatis
Lucky_Turtle2 天前
【Java Xml】Apache Commons Digester3解析
xml·java·apache
莫陌尛.2 天前
xml 方式声明式事务案例
xml
m0_728033132 天前
JavaWeb——(web.xml)中的(url-pattern)
xml·前端
笨手笨脚の3 天前
设计模式-命令模式
设计模式·命令模式·行为型设计模式
有梦想的攻城狮3 天前
Maven中的settings.xml文件配置详解
xml·java·maven·settings.xml
web前端神器5 天前
webpack,vite,node等启动服务时运行一段时间命令窗口就卡住
命令模式·命令