Analyse XML simple dans Qt

Très souvent, dans un projet, vous devez créer une configuration qui peut être facilement modifiée sans recompilation.



Surtout si ce programme contrôle un certain appareil et que vous devez créer une action en fonction de l'état de l'appareil ou après un certain temps. C'est là que XML entre en jeu.



Il existe une configuration XML simple:
<?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>

      
      







Tâche: analyser un fichier simple à l'aide de Qt, à savoir QXmlStreamReader.



Ouvrez la configuration:



    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);

      
      





Trouvez la balise souhaitée (etaps) et recherchez la balise etap imbriquée:



    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));
        }
    }

      
      





analyser l'intérieur de la balise etap et tout ajouter à QMap <QString, QString>:



vérifiez si nous y sommes:



    QMap<QString, QString> etap;
    if (xml.tokenType() != QXmlStreamReader::StartElement && xml.name() == "etap")
        return etap;

      
      





analyser chaque tag imbriqué dans etap et l'ajouter à 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();
    }

      
      





ajout à 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());
}


      
      





En conséquence, nous obtenons un QMap <QString, QString> avec plusieurs éléments, dont chacun contient deux chaînes: le nom de la balise et sa valeur.



All Articles