Seite 1 von 1
[gelöst]qt + xml + xm - dateien
Verfasst: 7. September 2007 10:32
von CaptnChaos
ich brauche mal einen crashkurs in xml.
Wie lese ich diese XML-Daten aus einer Datei aus und speichere sie in vernünftige Variablen?
Bitte Codebeispiel.
Code: Alles auswählen
<FUSE>
<LIST>[LOW:HIGH:EXTENDED]</LIST>
<LOW>
<NMB_FUSE_BITS>8</NMB_FUSE_BITS>
<FUSE7>
<NAME>CKDIV8</NAME>
<TEXT>Divide clock by 8</TEXT>
<DEFAULT>0</DEFAULT>
</FUSE7>
<FUSE6>
<NAME>CKOUT</NAME>
<TEXT>Clock output</TEXT>
<DEFAULT>1</DEFAULT>
</FUSE6>
<FUSE5>
<NAME>SUT1</NAME>
<TEXT>Select start-up time</TEXT>
<DEFAULT>1</DEFAULT>
</FUSE5>
</LOW>
</FUSE>
Verfasst: 7. September 2007 10:44
von Christian81
Was meinst du mit einer 'vernüftigen Variablen'?
Ich würde mir mal etwas von hier durchlesen:
http://doc.trolltech.com/4.3/qtxml.html
Verfasst: 7. September 2007 10:59
von CaptnChaos
habs jetzt so gemacht, aber der liest nicht das was ich will.... ich bin zu doof dafür...
Code: Alles auswählen
void FuseReader::Load(QString dev)
{
fileName = "f"+dev+".xml";
QDomDocument doc;
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly))
return;
if(!doc.setContent(&file)) {
file.close();
return;
}
file.close();
QDomElement docElem = doc.documentElement();
QDomNode n = docElem.firstChild();
while(!n.isNull())
{
QDomElement e = n.toElement(); // try to convert the node to an element.
if(!e.isNull()) {
QDomNode n2 = e.firstChild();
while(!n2.isNull())
{
qDebug(n2.nodeName().toAscii());
QDomElement e2 = n2.toElement();
//qDebug(n2.nodeValue().toAscii());
if(!e2.isNull())
{
// the node really is an element.
allFuses.append(e2.attribute("MASK", "0x00") + e2.attribute("VALUE", "0x00") + e2.attribute("TEXT", "grmpf"));
qDebug(allFuses.last().toAscii());
}
n2 = n2.nextSibling();
}
}
n = n.nextSibling();
}
}
Verfasst: 7. September 2007 11:06
von Christian81
aber der liest nicht das was ich will
Super Aussage - glaubt ihr wir haben ne Glaskugel hier?
Verfasst: 7. September 2007 11:18
von CaptnChaos
ich möchte die variablen von MASK, VALUE und TEXT lesen. Der liesst aber garnix. wenn ich das so mache, hat der das wenigstens schonmal als nodeName (MASK;VALUE und TEXT):
Code: Alles auswählen
void FuseReader::Load(QString dev)
{
fileName = "f"+dev+".xml";
QDomDocument doc;
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly))
return;
if(!doc.setContent(&file)) {
file.close();
return;
}
file.close();
QDomElement docElem = doc.documentElement();
QDomNode n = docElem.firstChild();
while(!n.isNull())
{
QDomElement e = n.toElement(); // try to convert the node to an element.
if(!e.isNull()) {
QDomNode n2 = e.firstChild();
while(!n2.isNull())
{
qDebug(n2.nodeName().toAscii());
QDomElement e2 = n2.toElement();
qDebug(e2.childNodes().at(2).nodeName().toAscii());
qDebug(e2.childNodes().at(2).nodeValue().toAscii());
if(!e2.isNull())
{
QDomNode n3 = e2.firstChild();
while(!n3.isNull())
{
allFuses.append(n3.nodeName() + "=" + n3.nodeValue());
qDebug(allFuses.last().toAscii());
n3 = n3.nextSibling();
}
}
n2 = n2.nextSibling();
}
}
n = n.nextSibling();
}
}
tut mir ja leid, aber ich dachte man könnte erkennen, das ich an die Variablen will....
Verfasst: 7. September 2007 11:33
von gerome69
KernelPanic hat geschrieben:
Code: Alles auswählen
allFuses.append(e2.attribute("MASK", "0x00") + e2.attribute("VALUE", "0x00") + e2.attribute("TEXT", "grmpf"));
qDebug(allFuses.last().toAscii());
Ich würde sagen: MASK, VALUE und TEXT sind doch keine Attribute, sondern eigenständige Elemente in deinem XML. Und deren Wert steht dann immer im nächsten Text-Element. Du mußt den TokenType untersuchen.
Bei den Examples gibt es doch was brauchbares.
Ansonsten hilft dir dieser Code sicher weiter. Aus ganz anderem Zusammenhang, aber du siehst wie man die Nodes richtig ausliest:
Code: Alles auswählen
#include <QtXml>
#include <QtCore>
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
QFile xmlFile("gdl.xml");
if (!xmlFile.open(QIODevice::ReadOnly)) {
printf("Can not open input file!\n");
return EXIT_FAILURE;
}
QFile outFile("gdl_out.xml");
if (!outFile.open(QIODevice::WriteOnly)) {
printf("Can not open output file!\n");
return EXIT_FAILURE;
}
QXmlStreamReader xmlReader(&xmlFile);
QXmlStreamWriter xmlWriter(&outFile);
QXmlStreamReader::TokenType tokenType;
while (!xmlReader.atEnd()) {
tokenType=xmlReader.readNext();
switch (tokenType) {
case QXmlStreamReader::StartElement: printf("<%s>", xmlReader.name().toString().toAscii().data());
break;
case QXmlStreamReader::EndElement: printf("</%s>\n", xmlReader.name().toString().toAscii().data());
break;
case QXmlStreamReader::Characters: if (xmlReader.text().toString().trimmed()!="") printf("%s", xmlReader.text().toString().toAscii().data());
break;
default:
break;
}
xmlWriter.writeCurrentToken(xmlReader);
}
if (xmlReader.hasError()) {
printf(QString("An error occured in line %1, column %2: Error %3, %4\n").arg(xmlReader.lineNumber()).arg(xmlReader.columnNumber()).arg(xmlReader.error()).arg(xmlReader.errorString()).toAscii().data());
}
return EXIT_SUCCESS;
}
Gruß, Gérôme
Verfasst: 7. September 2007 11:49
von CaptnChaos
ja, ok dann liest er etwas, auch die Variablen, aber wie mache ich das mit QDomNodes und QDomElements?
Das scheint mir doch komfortabler.
Verfasst: 7. September 2007 11:53
von gerome69
KernelPanic hat geschrieben:ja, ok dann liest er etwas, auch die Variablen, aber wie mache ich das mit QDomNodes und QDomElements?
Das scheint mir doch komfortabler.
Ich würde eher sagen: unnötig komplizierter. Du hast eine klar definierte XML-Struktur mit lauter Geschwister-Elementen. Dafür reicht der QxmlSimpleReader doch völlig aus.
Mehr Hilfe geb ich jetzt aber nicht, der Rest ist doch wohl nicht schwer rauszufinden.
G.
Verfasst: 7. September 2007 12:34
von CaptnChaos
habs schon geschafft!