Einfache XML-Analyse in Qt

Sehr oft müssen Sie in einem Projekt eine Konfiguration erstellen, die ohne erneutes Kompilieren leicht geändert werden kann.



Insbesondere, wenn dieses Programm ein bestimmtes Gerät steuert und Sie abhängig vom Status des Geräts oder nach einiger Zeit eine Aktion erstellen müssen. Hier kommt XML ins Spiel.



Es gibt eine einfache XML-Konfiguration:
<?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>

      
      







Aufgabe: Analysieren Sie eine einfache Datei mit Qt, nämlich QXmlStreamReader.



Öffnen Sie die Konfiguration:



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

      
      





Suchen Sie das gewünschte Tag (etaps) und das verschachtelte etap-Tag:



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

      
      





Analysieren Sie das etap-Tag und fügen Sie alles zu QMap <QString, QString> hinzu:



Überprüfen Sie, ob wir dort sind:



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

      
      





Analysieren Sie jedes in etap verschachtelte Tag und fügen Sie es zu QMap hinzu:



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

      
      





Hinzufügen zu 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());
}


      
      





Als Ergebnis erhalten wir eine QMap <QString, QString> mit mehreren Elementen, von denen jedes zwei Zeichenfolgen enthält: den Tag-Namen und seinen Wert.



All Articles