Seite 1 von 1

Problem mit speichern in QDomDocument

Verfasst: 30. Juni 2010 13:06
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

Verfasst: 30. Juni 2010 13:57
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 ...

Verfasst: 5. Juli 2010 13:46
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 :(

Verfasst: 5. Juli 2010 14:14
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?

Verfasst: 5. Juli 2010 15:26
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 ...

Verfasst: 5. Juli 2010 22:39
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