.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#define FilePath "C:/temp/" //存放路径
namespace Ui {
class Widget;
}
struct Student
{
int Id;
int age;
QString sex;
QString name;
};
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
//读取按钮点击槽函数
void on_btn_readxml_clicked();
//写入按钮点击槽函数
void on_btn_writexml_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDir>
#include <QFile>
#include <QList>
#include <QXmlStreamWriter>
#pragma execution_character_set("utf-8")
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
//读取按钮点击槽函数
void Widget::on_btn_readxml_clicked()
{
//清空列表
for (int i = ui->tableWidget->rowCount() - 1; i >= 0; i--)
{
ui->tableWidget->removeRow(i);
}
QString fileName = "test.xml";
QString path = QString(FilePath) + fileName;
//打开文件
QFile file(path);
if (!file.open(QFile::ReadOnly))
{
QMessageBox::information(this, QString("标题"), QString("文件打开失败"));
return;
}
QFileInfo fileInfo(path);
QList<Student*> v_list;
QXmlStreamReader xmlreader(&file);
xmlreader.readNext();
//解析xml
while (!xmlreader.atEnd())
{
xmlreader.readNext();
if (xmlreader.isStartElement() && xmlreader.name() == "Student")
{
Student *v_stu = new Student();
v_stu->Id = xmlreader.attributes().value("Id").toInt();
v_stu->age = xmlreader.attributes().value("age").toInt();
v_stu->sex = xmlreader.attributes().value("sex").toString();
v_stu->name = xmlreader.readElementText();
v_list.append(v_stu);
}
}
//如果解析出错
if (xmlreader.hasError())
{
QString errorStr = xmlreader.errorString();
file.close();
return;
}
file.close();
//显示到列表
for each (Student* stu in v_list)
{
int row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);
ui->tableWidget->setItem(row, 0, new QTableWidgetItem(QString::number(stu->Id)));
ui->tableWidget->setItem(row, 1, new QTableWidgetItem(stu->name));
ui->tableWidget->setItem(row, 2, new QTableWidgetItem(stu->sex));
ui->tableWidget->setItem(row, 3, new QTableWidgetItem(QString::number(stu->age)));
}
}
//写入按钮点击槽函数
void Widget::on_btn_writexml_clicked()
{
QString fileName = "test.xml";
QString path = QString(FilePath) + fileName;
QFile file(path);
//打开文件
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::information(this, QString("标题"), QString("文件打开失败"));
return;
}
int rows = ui->tableWidget->rowCount();
//写入文件
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
writer.writeStartElement("Students");
for (int i = 0; i < rows; i++)
{
writer.writeStartElement("Student");
writer.writeAttribute("Id", ui->tableWidget->item(i, 0)->text());
writer.writeAttribute("age", ui->tableWidget->item(i, 2)->text());
writer.writeAttribute("sex", ui->tableWidget->item(i, 3)->text());
writer.writeCDATA(ui->tableWidget->item(i, 1)->text());
writer.writeEndElement();
}
writer.writeEndElement();
writer.writeEndDocument();
file.close();
QMessageBox::information(this, QString("标题"), QString("写入成功"));
}
xml文件格式如下:
运行效果图: