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 whileund 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