[gelöst]qt + xml + xm - dateien

Alles rund um die Programmierung mit Qt
Antworten
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

[gelöst]qt + xml + xm - dateien

Beitrag 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>
Zuletzt geändert von CaptnChaos am 7. September 2007 14:28, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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();
 	}
   
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

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 »

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 »

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 »

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 »

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.
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

habs schon geschafft!
Antworten