Problem mit speichern in QDomDocument

Alles rund um die Programmierung mit Qt
Antworten
qrk123
Beiträge: 32
Registriert: 4. Dezember 2009 13:19

Problem mit speichern in QDomDocument

Beitrag von qrk123 »

Hallo,

ich versuche ein Szenario-Tag in eine XML Datei einzufügen.

Folgenden Code nutze ich:

Code: Alles auswählen

void composer::saveSzenarios( QString newSzenario ) {

	QTextStream out(szenarioFile);
	QDomElement xmlSzenarios = szenarioDom.firstChildElement("szenarios");
   QDomElement sze = szenarioDom.createElement("szenario");
	QDomElement name = szenarioDom.createElement("name");
	QDomText t = szenarioDom.createTextNode( newSzenario );
	name.appendChild(t);
	xmlSzenarios.appendChild(sze); //Szenario einfügen
	szenarioDom.save(out, 5);
}
Danach verändert sich meine XML-Datei von:

Code: Alles auswählen

<szenarios>
  <szenario>
    <name>A</name> 
  </szenario>
  <szenario>
    <name>B</name> 
  </szenario>
</szenarios>
zu:

Code: Alles auswählen

<szenarios>
  <szenario>
    <name>A</name> 
  </szenario>
  <szenario>
    <name>B</name> 
  </szenario>
</szenarios><szenarios>
     <szenario>
          <name>A</name>
     </szenario>
     <szenario>
          <name>B</name>
     </szenario>
     <szenario/>
</szenarios>
allerdings ohne, dass ein neues Szenario hinzugefügt wird. Sieht jemand einen Fehler?

vielen Dank
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Nen Stream muss nicht unbedingt nen neupositionieren unterstuetzen.
Dementsprechend wird das DOM Dokument den STream nicht "zuruecksetzen" .
Ergo, es haengt seinen Content hinten an.
mit QTextStream out(szenarioFile) legst du implizit ein QFile(szenarioFile) an.
Ob du loeschen oder ueberschreiben willst, legst du mit den Parametern der "open" funktion der QFiles an, die du verwendest. QTextStream reicht diese weiter, wenn im CTor nen File angibst.

wenn du willst, das er das File ueberschreibt, und ned einfach anhaengt, versuch mal :
QTextStream out(szenarioFile,QIODevice::Truncate | QIODevice::Text | QIODevice::WriteOnly) ;

ciao ...
qrk123
Beiträge: 32
Registriert: 4. Dezember 2009 13:19

Beitrag von qrk123 »

QTextStream out(szenarioFile,QIODevice::Truncate | QIODevice::Text | QIODevice::WriteOnly) ;
Funktioniert leider nicht, da statt QFile nun File verwendet weden soll und das Fehler verursacht.

Gibt es keine Methode um eine bestehende XMLDatei zu ergänzen? muss man immer eine neue Datei erstellen? würde in meiner konkreten Anwendung keinen Sinn machen. Aber Einfügen der veränderten XML-Elemente in den Textstream verursacht immer ein Anhängen.

Kann ich irgendwie während der Laufzeit das alte QFile löschen und durch ein komplett neues ersetzen?
Ist doch ein relativ typischer Vorgang und sollte machbar sein :(
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

qrk123 hat geschrieben:QTextStream out(szenarioFile,QIODevice::Truncate | QIODevice::Text | QIODevice::WriteOnly) ;
Funktioniert leider nicht, da statt QFile nun File verwendet weden soll und das Fehler verursacht.
Was ist "File"? Und was ist jetzt szenarioFile? Wie wurde das geöffnet? Welche genaue Fehlermeldung erhältst du?
Gibt es keine Methode um eine bestehende XMLDatei zu ergänzen? muss man immer eine neue Datei erstellen? würde in meiner konkreten Anwendung keinen Sinn machen. Aber Einfügen der veränderten XML-Elemente in den Textstream verursacht immer ein Anhängen.
Wieder: welche Fehler? Und man kann ein XML-File nicht einfach um Elemente ergänzen, aus Dateisicht kannst du nicht "einfach so" deinen Dateischreibzeiger irgendwo in der Mitte platzieren, was einfügen ohne dass die XML-Daten hinter dem neu geschriebenen Schaden erleiden. Eine Datei auf der Festplatte ist etwas komplexer (zusammenhängende Blöcke, Fragmentierung, andere Dateien die davor/danach/dazwischen rumliegen, usw.)
Kann ich irgendwie während der Laufzeit das alte QFile löschen und durch ein komplett neues ersetzen?
Ist doch ein relativ typischer Vorgang und sollte machbar sein :(
Das nennt sich "Überschreiben", und wenn du keine Parameter wie "QIODevice::Append" angibst, sollte auch immer überschrieben werden. Wie öffnest du denn dein file?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

QTextStream out(szenarioFile,QIODevice::Truncate | QIODevice::Text | QIODevice::WriteOnly) ;
Funktioniert leider nicht, da statt QFile nun File verwendet weden soll und das Fehler verursacht.
Ich hab nix anderes gemacht, als an deinen CTor noch die Flags zum öffnen drangehangen.
Das sollte sehr wohl gehen :-)
Hasst du QFile schon geoeffnet vorher ?
(szenarioFile->open(...) irgendwo ?)
Und man kann ein XML-File nicht einfach um Elemente ergänzen
Jein !
Daten in der mitte einer Datei anfügen geht nur mit ganz wilden hacks auf BS ebene (Nodes verschieben). Aber das willst du ned wissen.
Das heisst fuer dich, du kannst auf dateien nur eigentlich nur Loeschen und neuschreiben, bzw hinten anhaengen ... oder gezielt stellen ueberschreiben.

Auf der Anderen seite, ein QDOmDocument serialisiert sich immer komplett ... also sobald du eine geaenderte XML datei ueber DOM speicherst, schreibt er die datei immer komplett, und "flickt" nicht nur rum.

Bei dom hantelt es sich um einen Baum aus Knoten ...
Ein QDOMDocument iss aber auch nix anderes als ein QDOmNode.

Um nun ein QDOMDocument in ein anderes reinzuhaengen, isss gar ned so viel notwendig mit dem wissen ^^
Aber wie genau das geht, verraet dir die Doku ....

Ciao ...
qrk123
Beiträge: 32
Registriert: 4. Dezember 2009 13:19

Beitrag von qrk123 »

Ich hänge es doch in ein anderes rein, die machen in der Doku auch nichts anderes als mit textstream und dann abspeichern, aber ne andere File überschreiben geht damit halt nicht. Hab sogar in die Doku geguckt...

Und genau, du hast nichts anderes gemacht als die Flags drangehängt, aber in der Doku steht FILE* stat QFile und kompilieren kann man anschließend auch nicht mehr, habs mit nem cast probiert. Lässt sich kompilieren, gibt anschließend aber Ausnahmefehler und genauso stehts halt auch in Doku... hier der Link: http://doc.qt.nokia.com/4.6/qtextstream ... xtStream-3
Antworten