Русский
Русский
English
Статистика
Реклама

Простой парсинг XML в Qt

Достаточно часто в проекте нужно создать конфигурацию, которую можно легко изменять без перекомпилирования.
Особенно, если эта программа управляет неким устройством, и необходимо создать действовать в зависимости от состояния устройства или же через какое то время. Тут на помощь приходит XML.


Есть простой xml-конфиг:
<?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
К списку статей
Опубликовано: 11.12.2020 00:18:41
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Чулан

Qt

Xml

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru