[Чулан] Простой парсинг XML в Qt
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Достаточно часто в проекте нужно создать конфигурацию, которую можно легко изменять без перекомпилирования.
Особенно, если эта программа управляет неким устройством, и необходимо создать действовать в зависимости от состояния устройства или же через какое то время. Тут на помощь приходит XML.
Есть простой xml-конфиг:
SPL
<?xml version="1.0" encoding="UTF-8" ?>
<etaps>
<etap id="1">
<name>Первый</name>
<firststage>1</firststage>
<laststage>9</laststage>
<pausestage>10</pausestage>
<etappause>5</etappause>
</etap>
<etap id="2">
<name>Второй</name>
<firststage>10</firststage>
<laststage>20</laststage>
<pausestage>15</pausestage>
<etappause>2</etappause>
</etap>
<etap id="3">
<name>Последний</name>
<firststage>21</firststage>
<laststage>50</laststage>
<pausestage>15</pausestage>
<etappause>3</etappause>
</etap>
</etaps>
Задача: распарсить простой файл средсвами Qt, а именно QXmlStreamReader.
Открываем конфиг:
QFile* file = new QFile("config.xml");
if (!file->open(QIODevice::ReadOnly | QIODevice::Text))
{
emit Log(tr("Невозможно открыть XML-конфиг"), LOG_LEVEL_ERROR);
return false;
}
QXmlStreamReader xml(file);
Ищем нужный тег (etaps) и находим вложенный тег etap:
while (!xml.atEnd() && !xml.hasError())
{
QXmlStreamReader::TokenType token = xml.readNext();
if (token == QXmlStreamReader::StartDocument)
continue;
if (token == QXmlStreamReader::StartElement)
{
if (xml.name() == "etaps")
continue;
if (xml.name() == "etap")
XMLConf.append(parseEtap(xml));
}
}
парсим внутри тега etap и добавляем все в QMap<QString, QString>:
проверяем, там ли мы находимся:
QMap<QString, QString> etap;
if (xml.tokenType() != QXmlStreamReader::StartElement && xml.name() == "etap")
return etap;
парсим каждый вложенный в etap тег и добавляем в QMap:
QXmlStreamAttributes attributes = xml.attributes();
if (attributes.hasAttribute("id"))
etap["id"] = attributes.value("id").toString();
xml.readNext();
while (!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "etap"))
{
if (xml.tokenType() == QXmlStreamReader::StartElement)
{
if (xml.name() == "name")
addElementDataToMap(xml, etap);
if (xml.name() == "firststage")
addElementDataToMap(xml, etap);
if (xml.name() == "laststage")
addElementDataToMap(xml, etap);
if (xml.name() == "pausestage")
addElementDataToMap(xml, etap);
if (xml.name() == "etappause")
addElementDataToMap(xml, etap);
}
xml.readNext();
}
добавление в QMap
void addElementDataToMap(QXmlStreamReader& xml, QMap<QString, QString>& map) const
{
if (xml.tokenType() != QXmlStreamReader::StartElement)
return;
QString elementName = xml.name().toString();
xml.readNext();
map.insert(elementName, xml.text().toString());
}
В итоге мы получаем QMap<QString, QString> с несколькими элементами, в каждом из которых две строки: название тега и его значение.
===========
Источник:
habr.com
===========
Похожие новости:
- [Программирование] Вышла версия 6.0 интегрированной среды разработки Qt
- [Умный дом, DIY или Сделай сам] Как сделать так, чтобы умные лампочки не глупели при перебоях питания
- Релиз фреймворка Qt 6.0
- Выпуск aqtinstall 0.10, альтернативного установщика Qt
- [Чулан] Зачем коронавирусу человек?
- [Чулан] Объявлены лауреаты Премии Рунета 2020
- [Apache, Big Data, Хранение данных, Микросервисы] Импорт ЕГРЮЛ ФНС средствами Apache NiFi. Шаг 2 — преобразование XML в JSON
- [Анализ и проектирование систем, Программирование микроконтроллеров, Управление проектами, Производство и разработка электроники, Транспорт] Опыт разработки системы управления для железнодорожной техники на отечественных микроконтроллерах
- [Open source, .NET, XML, C#] Конвертируем doc в docx и xml на C#
- [Разработка под MacOS, Разработка под Linux, Разработка под Windows, Визуальное программирование] Фреймворки и библиотеки для кроссплатформенной разработки десктопных программ
Теги для поиска: #_chulan (Чулан), #_qt, #_xml, #_chulan (
Чулан
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 21:26
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Достаточно часто в проекте нужно создать конфигурацию, которую можно легко изменять без перекомпилирования. Особенно, если эта программа управляет неким устройством, и необходимо создать действовать в зависимости от состояния устройства или же через какое то время. Тут на помощь приходит XML. Есть простой xml-конфиг:SPL<?xml version="1.0" encoding="UTF-8" ?>
<etaps> <etap id="1"> <name>Первый</name> <firststage>1</firststage> <laststage>9</laststage> <pausestage>10</pausestage> <etappause>5</etappause> </etap> <etap id="2"> <name>Второй</name> <firststage>10</firststage> <laststage>20</laststage> <pausestage>15</pausestage> <etappause>2</etappause> </etap> <etap id="3"> <name>Последний</name> <firststage>21</firststage> <laststage>50</laststage> <pausestage>15</pausestage> <etappause>3</etappause> </etap> </etaps> Задача: распарсить простой файл средсвами Qt, а именно QXmlStreamReader. Открываем конфиг: QFile* file = new QFile("config.xml");
if (!file->open(QIODevice::ReadOnly | QIODevice::Text)) { emit Log(tr("Невозможно открыть XML-конфиг"), LOG_LEVEL_ERROR); return false; } QXmlStreamReader xml(file); Ищем нужный тег (etaps) и находим вложенный тег etap: while (!xml.atEnd() && !xml.hasError())
{ QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartDocument) continue; if (token == QXmlStreamReader::StartElement) { if (xml.name() == "etaps") continue; if (xml.name() == "etap") XMLConf.append(parseEtap(xml)); } } парсим внутри тега etap и добавляем все в QMap<QString, QString>: проверяем, там ли мы находимся: QMap<QString, QString> etap;
if (xml.tokenType() != QXmlStreamReader::StartElement && xml.name() == "etap") return etap; парсим каждый вложенный в etap тег и добавляем в QMap: QXmlStreamAttributes attributes = xml.attributes();
if (attributes.hasAttribute("id")) etap["id"] = attributes.value("id").toString(); xml.readNext(); while (!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "etap")) { if (xml.tokenType() == QXmlStreamReader::StartElement) { if (xml.name() == "name") addElementDataToMap(xml, etap); if (xml.name() == "firststage") addElementDataToMap(xml, etap); if (xml.name() == "laststage") addElementDataToMap(xml, etap); if (xml.name() == "pausestage") addElementDataToMap(xml, etap); if (xml.name() == "etappause") addElementDataToMap(xml, etap); } xml.readNext(); } добавление в QMap void addElementDataToMap(QXmlStreamReader& xml, QMap<QString, QString>& map) const
{ if (xml.tokenType() != QXmlStreamReader::StartElement) return; QString elementName = xml.name().toString(); xml.readNext(); map.insert(elementName, xml.text().toString()); } В итоге мы получаем QMap<QString, QString> с несколькими элементами, в каждом из которых две строки: название тега и его значение. =========== Источник: habr.com =========== Похожие новости:
Чулан ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 21:26
Часовой пояс: UTC + 5