Здравствуйте, имеется парсер:
C++ (Qt) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| #ifndef XMLPARSER_H
#define XMLPARSER_H
#include <QtCore>
#include <QString>
#include <QtXml>
#include <vector>
#include <QVector>
/*!
\file
\brief Класс парсинга xml файла database.xml
\date Начало модернизации лето 2022 года
*/
class XmlParser
{
public:
/*!
* \brief ListElements - Функция записи элементов xml файла по тегу в std::vector
* \param element - Параметр для получения элементов по тегу.
* \param tagName - Тег xml файла.
*/
std::vector<QDomElement> ListElements(QDomElement element, QString tagName);
//QDomElement getByTagName();
/*!
* \brief open - Функция открытия xml файла.
* \param path - Параметр пути файла.
*/
bool open(QString path);
/*!
* \brief getRoot - Функция, возвращающая элементы.
*/
QDomElement getRoot() const;
private:
QDomElement root;
};
#endif // XMLPARSER_H |
|
C++ (Qt) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| #include "xmlparser.h"
std::vector<QDomElement> XmlParser::ListElements(QDomElement root, QString tagName)
{
///< Получаем элементы по тегу.
QDomNodeList items = root.elementsByTagName(tagName);
///< Cоздаем массив, который будем заполнять.
std::vector<QDomElement> itemList;
///< Добавляем элементы в itemList.
for (int i = 0;i < items.count(); i++)
{
QDomNode itemNode = items.at(i);
if (itemNode.isElement())
itemList.push_back(itemNode.toElement());
}
return itemList;
}
bool XmlParser::open(QString path)
{
QDomDocument document;
QFile file(path);
///< Если файл не удалось открыть - программа вернет false.
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
///< Если XML-документ имеет ошибки - программа вернет false
if (!document.setContent(&file))
return false;
///< Освобождаем ресурсы.
file.close();
///< Присваиваем первый элемент в переменную root.
this->root = document.firstChildElement();
///< Возвращаем true.
return true;
}
QDomElement XmlParser::getRoot() const
{
return root;
} |
|
Обращение в mainwindow.cpp:
C++ (Qt) |
1
2
3
4
5
| if (xml.open("database.xml")) {
qDebug() << "[Information] Идёт чтение database.xml... Данные успешно получены!";
dbworker = xml.ListElements(xml.getRoot(), "cluster"); //присваиваем тег
DBtagWorker = xml.ListElements(xml.getRoot(), "base"); //присваиваем тег
dbworker[0].attribute("pwd") //вот так вот можно вытаскивать данные атрибутов, они записываются абсолютно все из xml |
|
В чем, собственно, загвоздка? Вот xml:
XML |
1
2
3
4
5
6
7
8
9
10
11
12
13
| <?xml version="1.0" encoding="UTF-8"?>
<setting>
<cluster hostname="127.0.0.1" vhost="127.0.0.1" shost="127.0.0.1" port="5432" options="connect_timeout=1">
<base dbname="da"/>
<base dbname="test"/>
<base dbname="kek"/>
</cluster>
<cluster hostname="127.23.23.1" vhost="127.23.23.1" shost="127.23.23.1" port="5432" options="connect_timeout=1">
<base dbname="test"/>
<base dbname="qqq"/>
<base dbname="rrr"/>
</cluster>
</setting> |
|
Мне нужно сделать так, чтобы значения base брались от тега <cluster> до </cluster>. То есть:
Для первого тега, значения должны быть da, test, kek, а для другого тега: test, qqq, rrr. Как это можно реализовать?
Добавлено через 1 минуту
На данном этапе они записываются просто в кучу в вектор