Qtでの単純なXML解析

多くの場合、再コンパイルせずに簡単に変更できる構成をプロジェクトに作成する必要があります。



特に、このプログラムが特定のデバイスを制御していて、デバイスの状態に応じて、またはしばらくしてからアクションを作成する必要がある場合。これが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>が得られます。各要素には、タグの名前とその値の2行が含まれています。



All Articles