读取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</纬度>
        </工作所处位置的经纬度>
    </工作信息>
</学校信息>
相关推荐
曹牧2 天前
Oracle:xml转义
xml·数据库·oracle
曹牧2 天前
Java:XML转义
xml·java·开发语言
摇滚侠2 天前
Spring 零基础入门到进阶 基于注解管理 Bean 38-43
xml·java·后端·spring·intellij-idea
San813_LDD2 天前
[深度学习] 数据序列化格式对比:以日志级别配置为例
xml·java·前端
金融支付架构实战指南3 天前
CQRS + 命令模式 + 事件驱动 + 数据库持久化
数据库·ddd·命令模式·领域驱动模型
金融支付架构实战指南3 天前
CQRS 命令 vs GOF 命令模式
ddd·命令模式·领域驱动模型
摇滚侠3 天前
Spring 零基础入门到进阶 基于 XML 的声明式事务 71
xml·数据库·spring
hoiii1873 天前
Qt 实现屏幕截图功能
开发语言·qt·命令模式
摇滚侠3 天前
Spring 零基础入门到进阶 基于 XML 管理 Bean 14-28
xml·数据库·spring
摇滚侠4 天前
Spring 零基础入门到进阶 基于 XML 管理 Bean 29-37
xml·java·数据库·后端·spring·intellij-idea