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.