Penguraian XML sederhana di Qt

Cukup sering dalam sebuah proyek, Anda perlu membuat konfigurasi yang dapat dengan mudah diubah tanpa kompilasi ulang.



Terutama jika program ini mengontrol perangkat tertentu, dan Anda perlu membuat tindakan tergantung pada status perangkat atau setelah beberapa waktu. Di sinilah XML masuk.



Ada konfigurasi xml sederhana:
<?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>

      
      







Tugas: mengurai file sederhana menggunakan Qt, yaitu QXmlStreamReader.



Buka konfigurasi:



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

      
      





Temukan tag yang diinginkan (etaps) dan temukan tag etap bertingkat:



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

      
      





parse di dalam etap tag dan tambahkan semuanya ke QMap <QString, QString>:



periksa apakah kita ada di sana:



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

      
      





parse setiap tag bersarang di etap dan tambahkan ke 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();
    }

      
      





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


      
      





Hasilnya, kita mendapatkan QMap <QString, QString> dengan beberapa elemen, yang masing-masing berisi dua string: nama tag dan nilainya.



All Articles