Seite 1 von 1

Probleme bei XML-File lesen und speichern mit QDom

Verfasst: 5. Juli 2007 11:18
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ß

Verfasst: 5. Juli 2007 11:28
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

Verfasst: 5. Juli 2007 12:21
von upsala
Und soweit ich weis, ist die Reihenfolge der Attribute von der (alphabetischen) sortierung der Attribute abhängig.

Verfasst: 5. Juli 2007 13:25
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.