Probleme bei XML-File lesen und speichern mit QDom

Alles rund um die Programmierung mit Qt
Antworten
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Probleme bei XML-File lesen und speichern mit QDom

Beitrag von stonecold »

Hallo,

ich bastel gerade an einem Programm zum bearbeiten von XML-Files.
Ich habe die folgenden beiden Slots:

Code: Alles auswählen

void MainWindow::openFile()
{
	QString filePath = QFileDialog::getOpenFileName(this, tr("Open File"), xmlPath, tr("XML files (*.xml);;") );
	if (!filePath.isEmpty()) 
	{
		QFile file(filePath);
		if (!file.open(QIODevice::ReadOnly)) 
		{
			qDebug( "MainWindow::openFile(): File could not be opened" );
			return;
		}
		QString errorMessage;
		int line, col;
		if (!xmlDoc.setContent(&file, &errorMessage, &line, &col))  //xml.Doc = QDomDocument
		{
			qDebug( "MainWindow::openFile(): Error in Line: %d Col: %d s",line,col,qPrintable(errorMessage) );
			return;
		}
		xmlPath = filePath;
		file.close();
	}
}

void MainWindow::saveFile()
{
	QString filePath = QFileDialog::getSaveFileName(this, tr("Open File"), xmlPath, tr("XML files (*.xml);;"));
	if (filePath.isEmpty()) 
	{
		qDebug( "MainWindow::saveFile(): FilePath is empty" );
		return;
	}
	QFile file(filePath);
	if (!file.open(QIODevice::WriteOnly)) 
	{
		qDebug( "MainWindow::saveFile(): File could not be opened" );
		return;
	}
	QByteArray data = xmlDoc.toByteArray();
	file.write(data);
	file.close();
}
Ich lese also mein XML-File ein, mache nichts damit und speicher es gleich wieder ab. Dabei entstehen 2 Probleme.
Zum einen ist das XML-File welches ich öffne 31kb groß.
Das was ich abspeicher aber 88kb obwohl ich beim ersten hinschauen keinen Unterschied sehe.
Zum anderen sind die Attribute der DomElemente in ihrer Reihenfolge vertauscht, was das anschl. Lesen in einen Editor oder ähnlich sehr erschwert.

Kann mir einer helfen?
Danke und Gruß
Highspeedy
Beiträge: 9
Registriert: 15. April 2007 20:49

Beitrag von Highspeedy »

Hallo,

evtl. hängt das mit der Filegröße mit dem UNICode zusammen den QT intern verwendet.

Wie macht sich der Größenunterschied beider Dateien in einem HEX-Editor sichtbar.

CU
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und soweit ich weis, ist die Reihenfolge der Attribute von der (alphabetischen) sortierung der Attribute abhängig.
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag von stonecold »

Hallo und Danke für die schnellen Antworten.

Erst einmal sorry denn ich habe in meinem ersten Betrag was vergessen zu erwähnen und zwar handelt es sich bei der XML Datei um einen Datei die mittels DTD (Dokumenttypdefinition) gebaut wurde.
Des Weitern wird in den Dokument mit ENTITY(s) gearbeitet. Hier mal ein Minimalbespiel ohne .dtd Datei:

Code: Alles auswählen

<?xml version="1.0"?>
<!DOCTYPE container SYSTEM "data.dtd" [
<!ENTITY OWN_Movement
'<container name="Movement">
  <string name="Name" edit="true" store="true" default="Default Movement">Default Movement</string>
  <enum name="MovementType" edit="false" store="true" default="Manual">
    <enumval number="0">CircleMode</enumval>
    <enumval number="1">Manual</enumval>
    <currval>Manual</currval>
  </enum>
  &DEF_LegList; <!-- wird als "gibt es" angenommen -->
</container>'
>
]>
<container name="Exercise">
  <string name="Name" edit="true" store="true" default="Default Exercise">Default Exercise</string>
  &OWN_Movement;
  &OWN_Movement;
  &OWN_Movement;
  &OWN_Movement;
</container>
Das Problem mit der Größe wird wahrscheinlich sein, dass verschiedene ENTITIES mehrfach benutzt werden. Siehe:

Code: Alles auswählen

&OWN_Movement;


Daran werde ich dann wohl, so ohne weiters, nichts ändern können!?
Oder hat einer ne Idee oder so etwas schon mal behandelt?

Gut dann bleibt noch die Frage warum er die Attribute anders anordnet.

Richtig (ursprüngliches XML-File mit ie geöffnet):

Code: Alles auswählen

 <real name="AmbientTemperature" default="15" min="-35" max="50" step="0.01" unit="c" quant="TemperatureVal" edit="true" store="true">15</real>

Falsch:

Code: Alles auswählen

<real default="15" unit="c" min="-35" step="0.01" name="AmbientTemperature" max="50" quant="TemperatureVal" edit="true" store="true">15</real>  
Also Alphabetisch sortiert er sie nicht.
Antworten