Alles rund um die Programmierung mit Qt
CaptnChaos
Beiträge: 605 Registriert: 28. Juni 2007 15:01
Kontaktdaten:
Beitrag
von CaptnChaos » 7. September 2007 10:32
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>
Zuletzt geändert von
CaptnChaos am 7. September 2007 14:28, insgesamt 1-mal geändert.
CaptnChaos
Beiträge: 605 Registriert: 28. Juni 2007 15:01
Kontaktdaten:
Beitrag
von CaptnChaos » 7. September 2007 10:59
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();
}
}
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 7. September 2007 11:06
aber der liest nicht das was ich will
Super Aussage - glaubt ihr wir haben ne Glaskugel hier?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
CaptnChaos
Beiträge: 605 Registriert: 28. Juni 2007 15:01
Kontaktdaten:
Beitrag
von CaptnChaos » 7. September 2007 11:18
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....
gerome69
Beiträge: 188 Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:
Beitrag
von gerome69 » 7. September 2007 11:33
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
CaptnChaos
Beiträge: 605 Registriert: 28. Juni 2007 15:01
Kontaktdaten:
Beitrag
von CaptnChaos » 7. September 2007 11:49
ja, ok dann liest er etwas, auch die Variablen, aber wie mache ich das mit QDomNodes und QDomElements?
Das scheint mir doch komfortabler.
gerome69
Beiträge: 188 Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:
Beitrag
von gerome69 » 7. September 2007 11:53
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.