weiterhin probleme mit löschen eines xml knotens

Alles rund um die Programmierung mit Qt
Antworten
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

weiterhin probleme mit löschen eines xml knotens

Beitrag von Linuxguru »

ich hab mal ein neuen thread erstellt, da ich den anderen eigentlich schon auf gelöst hatte. das problem besteht allerdings weiterhin.

ich hab nun mal ein minimales projekt erstellt um den fehler auf ein minimum einzugrenzen.

hier mal mein code

test.h datei

Code: Alles auswählen

#ifndef TEST_H
#define TEST_H

#include <QWidget>
#include <QPushButton>
#include <QFile>
#include <QTextStream>


class TestClass : public QWidget
{
	Q_OBJECT
	public:
		TestClass(QWidget *parent=0);

	protected:

	public slots:
		void closeProject();

	private:
		QPushButton *button;
};
#endif
test.cpp datei

Code: Alles auswählen

#include <QDomDocument>

#include "test.h"

TestClass::TestClass(QWidget *parent)
	: QWidget(parent)
{
	button = new QPushButton( "Eintrag loeschen", this);
	button->show();

	connect( button, SIGNAL(clicked()), this, SLOT(closeProject()) );
}

void TestClass::closeProject()
{
	QDomDocument doc;

	//////////////////////////////// XML DATEI ÖFFNEN ////////////////////////////////////////////
	QFile file( "project.xml" );
	if( !file.open(QIODevice::ReadOnly) )
		return;
	if( !doc.setContent(&file) )
	{
		file.close();
		return;
	}
	file.close();

	//////////////////////////////// ELEMENT AUS XML LÖSCHEN ////////////////////////////////////////////
	QDomNode project = doc.documentElement().firstChild();
	while( !project.isNull() )
	{
		if( project.isElement() && project.nodeName() == "OPENEDFILES" )
		{
			QDomNode openedFiles = project.firstChild();
			while( !openedFiles.isNull() )
			{
				if( openedFiles.isElement() && openedFiles.nodeName() == "FILE" )
				{
					project.removeChild( openedFiles );
				}
				openedFiles = openedFiles.nextSibling();
			}
		}
		project = project.nextSibling();	
	}


	//////////////////////////////// XML DATEI SPEICHERN ////////////////////////////////////////////
	QFile XMLDatei( "project.xml" );
	if(!XMLDatei.open(QIODevice::ReadWrite))
		return;
	QTextStream out( &XMLDatei );
	out << doc.toString();
	XMLDatei.close();
}
und hier noch die xml um die es sich dreht

Code: Alles auswählen

<SE_PROJECT>
 <OPENEDFILES>
  <FILE name="eintrag1" />
  <FILE name="eintrag2" />
  <FILE name="eintrag3" />
  <FILE name="eintrag4" />
  <FILE name="eintrag5" />
 </OPENEDFILES>
</SE_PROJECT>
das problem ist nach wie vor, das nach dem löschen eines file elements die letzten 3 zeilen der xml noch einmal unten angefügt werden.

ich hab das projekt zum testen nochmal im anhang mit angefügt.

danke im voraus!
Dateianhänge
test.tar.gz
(224.01 KiB) 146-mal heruntergeladen
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Ich denke das Problem ist bei dem removeChild Aufruf in Kombination mit openedFiles.nextSibling.

Code: Alles auswählen

QDomNode openedFiles = project.firstChild();
         while( !openedFiles.isNull() )
         {
            if( openedFiles.isElement() && openedFiles.nodeName() == "FILE" )
            {
               project.removeChild( openedFiles );
            }
            openedFiles = openedFiles.nextSibling();
         } 
Da du openedFiles zuerst entfernst und anschließend nextSibling darauf aufrufst, kann das eigentlich nicht funktionieren. Wenn Du openedFiles entfernt hast, gibt es ja keinen nächsten Nachbarn mehr.
Also erst nextSibling aufrufen und sich die Rückgabe irgendwo speichern. Dann Löschen und dann openedFiles auf die zuvor gespeicherte Rückgabe setzen.

Oder einfach QDomElement::elementsByTagName verwenden und über die Liste iterieren, falls Du einfach nur alle FILE Knoten löschen wolltest.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Linuxguru
Beiträge: 96
Registriert: 14. Januar 2007 02:09

Beitrag von Linuxguru »

danke volker für deine antwort,

deinen ansatz brauchte ich allerdings nicht zu testen, da der eintrag in meiner ini sauber gelöscht wurde, aber ein problem beim überschreiben der xml datei besteht...

ich hab als lösung die datei nach dem öffnen gelöscht. beim speichern wird sie ja wieder neu angelegt.

danke für deine mühe
Antworten