خاصة إذا كان هذا البرنامج يتحكم في جهاز معين ، وتحتاج إلى إنشاء إجراء حسب حالة الجهاز أو بعد مرور بعض الوقت. هذا هو المكان الذي يأتي فيه 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> مع عدة عناصر ، كل منها يحتوي على سطرين: اسم العلامة وقيمتها.