使用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</纬度>
</工作所处位置的经纬度>
</工作信息>
</学校信息>