Qt - QDom - XML parsen



  • Hallo mal wieder.
    Ich habe ein *.XML mit folgendem Aufbau:

    <ClientCfg>
        <BasicCfg>
            <Polls>1</Polls> 
            <Logging>on</Logging> 
        </BasicCfg>
        <Client>
            <IP>127.0.0.1</IP> 
            <PORT>5555</PORT> 
        </Client>
        <Server>
            <IP>127.0.0.1</IP> 
            <PORT>4501</PORT> 
        </Server>
    </ClientCfg>
    

    Und ich brauche die Werte von Polls, Logging und die IP+Port von Client und Server. Aber ich kriegs nicht gebacken.

    Kann wer helfen?



  • Ich habs:

    for(int index = 0; index < m_qsCfgList.size(); ++index)
    	{
    		QDomNodeList tmpList;
    		tmpList = m_pCfgDoc->elementsByTagName(m_qsCfgList.at(index));
    
    		if(tmpList.length() != 0)
    		{
    
    			QDomNode tmpNode;
    			tmpNode = tmpList.item(0).firstChild();
    
    			QString tmpValue;
    
    			if(tmpNode.isText())
    			{
    				QDomText tmpText;
    				tmpText = tmpNode.toText();
    
    				tmpValue = tmpText.nodeValue();
    			}
    
    		}
    	}
    

    Und das steht in der QStringList:

    m_qsCfgList << "PollsPerSecond" << "Logging" << "IP" << "PORT" << "IP" << "PORT";
    

    EDIT:
    Funzt leider noch nicht ganz. Die Werte des Server bleiben leider noch auf der Strecke.



  • Ich hab einfach aus Bequemlichkeit die Namen in der QStringist verändert auf:

    m_qsCfgList << "PollsPerSecond" << "Logging" << "IP" << "PORT" << "ClientIP" << "ClientPort" << "ServerIP" << "ServerPort";
    

    Nicht die optimale Lösung, wär aber für Verbeserungvorschläge immer offen.



  • Versuche es mal mit setContent.
    Dann hast du alles in einen DomDocument und kannst darauf aufbauen..

    QString XMLinput
    QDomDocument docu;
            QString errorStr;
            int errorLine;
            int errorColumn;
    
            if (!docu.setContent(XMLinput, true, &errorStr, &errorLine, &errorColumn))
            {
                    QString xmlerr ="Line " + QString::number(errorLine);
                            xmlerr+= ", column " + QString::number(errorColumn);
                            xmlerr+= ", " + errorStr;
                    QMessageBox::critical(parent, "XML Error", xmlerr);
            }
            else
            {
    QDomElement root=docu.documentElement();
    if (root.tagName().lower() != "clientcfg")
    {
            QMessageBox::critical(parent, "XML Error", "This is not a clientcfg xml.");
            return;
    }
    ......
    

    danach arbeitest du dein DomDocu in DomNodes und Element um.
    Stuchworte:

    Domnode a = docu.firstChild()
    while (a.hasChildNodes() && a.isElement())
    if (a.nodeName().lower() == "basiccfg")
    {
    ...
    else if
    {
    ...
    }
    a=a.nextSibling();
    }//end while

    und so weiter.

    Ist manchmal nicht einfach aber man versteht es.
    cout << a.tagName() << a.text()
    helfen zu sehen wo der XML Baum grade ist.

    Gruss,
    Buggykite



  • [cpp]
    a.toElement().text();

    natürlich

    cu


Anmelden zum Antworten