QT读写xml方法之QXmlStreamWriter

.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文件格式如下:
在这里插入图片描述
运行效果图:
在这里插入图片描述

在Windows下,可以使用Qt自带的QXmlStreamWriter和QXmlStreamReader类来读写XML文件。 以下是一个简单的示例代码,演示如何使用QXmlStreamWriter和QXmlStreamReader来读写XML文件: ```c++ #include <QFile> #include <QXmlStreamWriter> #include <QXmlStreamReader> #include <QDebug> void writeXml() { // 打开XML文件 QFile file("example.xml"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qCritical() << "Failed to open file!"; return; } // 创建XML写入器 QXmlStreamWriter writer(&file); // 写入XML文件头 writer.writeStartDocument(); // 写入根元素 writer.writeStartElement("root"); // 写入子元素和属性 writer.writeStartElement("person"); writer.writeAttribute("id", "1"); writer.writeTextElement("name", "Alice"); writer.writeTextElement("age", "20"); writer.writeEndElement(); writer.writeStartElement("person"); writer.writeAttribute("id", "2"); writer.writeTextElement("name", "Bob"); writer.writeTextElement("age", "30"); writer.writeEndElement(); // 写入根元素结束标记 writer.writeEndElement(); // 写入XML文件结束标记 writer.writeEndDocument(); // 关闭文件和XML写入器 file.close(); writer.clear(); } void readXml() { // 打开XML文件 QFile file("example.xml"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qCritical() << "Failed to open file!"; return; } // 创建XML读取器 QXmlStreamReader reader(&file); // 逐行读取XML文件内容 while (!reader.atEnd()) { // 读取下一个XML元素 QXmlStreamReader::TokenType token = reader.readNext(); if (token == QXmlStreamReader::StartElement) { // 如果是元素开始标签,输出元素名称和属性 qDebug() << "Element: " << reader.name(); QXmlStreamAttributes attrs = reader.attributes(); for (int i = 0; i < attrs.count(); i++) { qDebug() << " Attribute: " << attrs[i].name() << "=" << attrs[i].value(); } } else if (token == QXmlStreamReader::Characters) { // 如果是纯文本内容,输出文本 qDebug() << "Text: " << reader.text(); } } // 关闭文件和XML读取器 file.close(); reader.clear(); } int main() { writeXml(); readXml(); return 0; } ``` 这个示例代码会在Windows下创建名为“example.xml”的XML文件,并写入一些元素和属性。然后再读取这个XML文件,并输出其中的元素名称、属性和文本内容。如果XML文件不存在或无法打开,程序会输出错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值