23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
1

Парсинг xml документа

26.09.2022, 17:27. Показов 738. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, имеется парсер:
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 минуту
На данном этапе они записываются просто в кучу в вектор
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2022, 17:27
Ответы с готовыми решениями:

парсинг XML
Есть XML документ &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; -&lt;etaps&gt; -&lt;etap id=&quot;1&quot;&gt; ...

Парсинг XML
Здравствуйте. Столкнулся с проблемой, думал сам разберусь , но оказалось что без помощи никак. Мне...

Парсинг xml
Всем привет! Прошу кто знает подскажите уже голова кипит не могу бесит этот xml и QXmlStreamReader...

Xml парсинг. Не работает
Есть xml документ: &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;xml_file&gt; &lt;Test_Item&gt;...

Парсинг файла похожего на XML
есть файл который похож на XML, но теги свои пример(утрированый) &lt;aaaa&gt; &lt;bbb ccc=5&gt; &lt;/bbb&gt;...

1
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,101
Записей в блоге: 1
26.09.2022, 17:34 2
недавно доставал с xml данные для поля effectiveTime, может будет полезно:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
QString effectiveTimeDoc;
    QFile *file = new QFile(filePath);
    if (!file->open(QIODevice::ReadOnly | QIODevice::Text))
        return true;
    QXmlStreamReader xmlReader(file);
    while (!xmlReader.atEnd() && !xmlReader.hasError())
    {
        QXmlStreamReader::TokenType token = xmlReader.readNext();
        if (token == QXmlStreamReader::StartDocument)
            continue;
        if (token == QXmlStreamReader::StartElement)
        {
            if (xmlReader.name() == "effectiveTime")
                if(!xmlReader.attributes().isEmpty())
                    effectiveTimeDoc = xmlReader.attributes().at(0).value().toString();
        }
    }
    xmlReader.clear();
    file->close();
ПС: почему не используете для QDomElement QVector?
0
26.09.2022, 17:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2022, 17:34
Помогаю со студенческими работами здесь

Чтение XML-документа
Проходит без ошибок,какой функцией прописать ip адрес,пользователь,и пароль, и какие нужны команды...

Парсинг xml документа
Имеется документ типа &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot;?&gt; &lt;data&gt; &lt;users&gt; ...

Парсинг xml документа на Си
Здравствуйте! Подскажите пожалуйста статью или руководство где описывается как парсить xml...

Парсинг XML документа
Скажите пожалуйста что не так с этим простым кодом? не хочет дать мне XML документ, путь...

Парсинг XML документа
Добрый день! у меня есть xml файл и мне его надо разобрать и положить в таблицу.. Необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru