Создайте QDirIterator для перебора всех файлов в каталоге. Вы можете добавить фильтр, так что он будет искать файлы только в формате entry_ number .xml.
. Используйте QXmlStreamReader для итерации всех элементовXML-файлПоскольку вы знаете формат XML-файла, вы можете просто искать ваши конкретные элементы.
Добавить новую запись в вашу таблицу. в этом случае я использовал QTableWidget, так как было неясно, используете ли вы это или QTableView (в следующий раз, пожалуйста, включите часть кода, который у вас уже есть).
Отформатируйте таблицу какнеобходимо.

MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QFile>
#include <QDirIterator>
#include <QXmlStreamReader>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
void parseDataEntry(const QString dataPath);
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Setup table
ui->tableWidget->setColumnCount(4);
ui->tableWidget->setHorizontalHeaderLabels(QStringList{"Patient ID","Name", "Surname", "LastSession"});
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// Our data path
QString path = QCoreApplication::applicationDirPath()+"/data/";
// Filter only files that fit our naming convention.
QStringList qdiFilter("entry_*.xml");
// Iterate through all found files, parse each file to be added to the table.
QDirIterator qdi( path, qdiFilter, QDir::Files);
while (qdi.hasNext())
{
parseDataEntry(qdi.next());
}
}
void MainWindow::parseDataEntry(const QString dataPath)
{
QString patientID, firstName, surName, lastSession = "";
// Load our XML file.
QFile *xmlFile;
xmlFile = new QFile(dataPath);
if(!xmlFile->open(QIODevice::ReadOnly | QIODevice::Text))
{
QMessageBox::critical(this,
"Error Loading Patient Data File",
QString("Could not load the patient XML data file at:\r\n %0").arg(dataPath),
QMessageBox::Ok);
return;
}
// Create an XML reader.
QXmlStreamReader *xmlReader;
xmlReader = new QXmlStreamReader(xmlFile);
// Parse each element of the XML until we reach the end.
while(!xmlReader->atEnd() && !xmlReader->hasError()) {
// Read next element
QXmlStreamReader::TokenType token = xmlReader->readNext();
// If token is just StartDocument - go to next
if(token == QXmlStreamReader::StartDocument) {
continue;
}
// If token is StartElement - read it
if(token == QXmlStreamReader::StartElement) {
if(xmlReader->name() == "Name") {
firstName = xmlReader->readElementText();
} else if(xmlReader->name() == "Surname") {
surName = xmlReader->readElementText();
}
else if(xmlReader->name() == "Patient_ID") {
patientID = xmlReader->readElementText();
}
else if(xmlReader->name() == "Date") {
lastSession = xmlReader->readElementText();
}
}
}
if(xmlReader->hasError()) {
QMessageBox::critical(this,
"Error Parsing Patient Data File",
QString("Error reading the patient file at:\r\n %0,\r\nError: %1").arg(dataPath,
xmlReader->errorString()),
QMessageBox::Ok);
return;
}
// close reader and flush file
xmlReader->clear();
xmlFile->close();
// Delete
delete xmlFile;
delete xmlReader;
// Add a new row to the table, with the data we parsed.
ui->tableWidget->insertRow(ui->tableWidget->rowCount());
ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1,
0,
new QTableWidgetItem(patientID));
ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1,
1,
new QTableWidgetItem(firstName));
ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1,
2,
new QTableWidgetItem(surName));
ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1,
3,
new QTableWidgetItem(lastSession));
}
MainWindow::~MainWindow()
{
delete ui;
}