XML datei rekursiv auslesen

Alles rund um die Programmierung mit Qt
Antworten
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

XML datei rekursiv auslesen

Beitrag von anno1988 »

Hallo,

ich möchte eine XMl-Datei rekursiv auslesen und diese dann in einer eingenen Struktur speichern. Allerdings bekomme ich das nicht ganz hin.

Code: Alles auswählen


struct XMLNode {

	QList<XMLNode> lst_child_node;
	QList<QString> lst_param;
	QString text;

};

class Xml {

	private:

	protected:
		QString mxml_text;
		QDomDocument mxml_document;
		XMLNode *mnode_main;
		QDomNode *tmp_node;
		XMLNode xml_node;

		XMLNode ReadNode(XMLNode *node_parent, QDomNode *node);

	public:
		void setXMLText(QString text);	
		void Create();

};

Code: Alles auswählen


void Xml::setXMLText(QString text) {

		mxml_text = text;

	}

void Xml::Create() {

		QDomElement element_root;

		QDomNode node;

		mxml_document.setContent(mxml_text);

		element_root = mxml_document.documentElement();

		node = element_root.firstChild();

		ReadNode(mnode_main, &node);

	}

XMLNode Xml::ReadNode(XMLNode *node_parent, QDomNode *node) {

		XMLNode xml_node;

		tmp_node = new QDomNode();

		*tmp_node = node->firstChild();

			if(tmp_node->hasChildNodes() == true) {

				node_parent->lst_child_node.push_back(ReadNode(node_parent, tmp_node));

			}
			else {

				QDomElement element = tmp_node->toElement();
				
				node->nextSibling();
			node_parent->lst_param.push_back(lst_attirbute.item(i).nodeName());


		return xml_node;

	}

Ich bekomme da immer eine Fehlermeldung von QList zurück.

Hat da jemand eine Idee, wie ich das korrekt auslesen kann?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Bevor sich hier irgendwer den Quellcode ansieht, könntest du dir mal überlegen was hier fehlt:
Ich bekomme da immer eine Fehlermeldung von QList zurück.
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

Ja, das ist die Frage, das weiß ich ehrlich gesagt nicht. Sobald ein Funktionsaufruf fertig ist, will ich ja die Ausgabe der Funktion an die Liste anhängen. Das funktioniert ja allerdings nicht.
Dateianhänge
error.png
error.png (65.55 KiB) 5160 mal betrachtet
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Schön, jetzt weis man zumindest schon mal welche QList gemeint ist... Und jetzt verfolge mal den Stack-Trace zurück bis an die Stelle, in der er von deinem Quell-Code kommt.
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

Der kommt genau dann, wenn es an die Stelle des returns geht. Wenn es immer ein Kind-Knoten gibt, und in die rekursive Funktion gesprungen wird, gibt es erst mal keine Probleme.
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag von Chris81T »

Also ich hab mir nun deinen Code nicht angeschaut, aber als ich laß, dass du rekursiv ein XML auslesen willst, hier mal ein Tipp:

Ich würd da gar nix mit QDomDocument machen, sondern schnell en eigenen SAX Parser dazu anwenden. Ein Interface ist Qt seitig schon für sowas vorhanden! Es gibt da auch Qt Beispiele zu mein ich. Zumindest folgende Klassen sind interessant: QXmlSimpleReader / QXmlDefaultHandler. Der macht da nix andres! und ist wesentlich performanter als der DOM Parser, da der nicht das ganze XML im SPeicher hält. Dafür kann dieser nur lesen, aber du willst ja eh ne eigene Struktur aufbauen, von daher solltest du darauf nicht angewiesen sein.

Und zum Thema debuggen:
So wie es upsala schon gesagt hatte:
QList gemeint ist... Und jetzt verfolge mal den Stack-Trace zurück bis an die Stelle, in der er von deinem Quell-Code kommt.
Sollte dich schnell zu deinem Problem führen!
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

Ja das ist richtig, ich habe die Stelle gefunden, wie ich in meinem lettzen beitrag geschrieben habe. allerdings weiß ich nicht wie ich idesen lösen kann.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

"Ich bekomme einen Fehler" ist keine Fehlermeldung, das wollte upsala dir in seiner ersten Antwort mitteilen. Auch wenn du jetzt ungefähr sagst, wo der Fehler auftritt, hilft das nicht wirklich weiter. Also -> Fehlermeldung posten.
Außerdem ist deine Einrückung schreklich, es fehlt auch irgendwo eine schließende "}" in ReadNode hinter dem else.

// edit: sry erst jetzt den Screeny gesehen. Geht das denn nicht per copy/paste? :/
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

mein problem ist, ich bekomme da keine andere fehlermeldung wie diese.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

anno1988 hat geschrieben:mein problem ist, ich bekomme da keine andere fehlermeldung wie diese.
Aber du bekommst einen Call-Stack. Die ersten 3 Einträge stammen aus QList. Das was du intelligenterweise ausgegraut hast wäre sicherlich interessanter! Das sind nämlich deine Methoden, die, in denen sich Stück für Stück der Fehler manifestiert hat. Und das liegt jetzt an DIR, das weiter zu untersuchen, wenn du schon nicht willst, dass andere deine Methodennamen sehen.

Außerdem noch ein paar Anmerkungen:
Du hast ein schönes Speicherleck. Dadurch dass du tmp_node unbedingt auf den HEAP legen willst, aber auf das new kein delete folgt. Wenn das eh schon ne temporäre node ist, leg das Ding doch direkt in der Methode an, im automatischen Speicherbeireich.

Und was diese Zeile bezwecken soll ist mir auch nicht klar:

Code: Alles auswählen

node->nextSibling();
nextSibling gibt ein Objekt zurück ist selber const, verändert das Objekt also nicht. Diese Zeile ist also absolut unnötig und wirkungslos.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Was ich auch noch sagen wollte:
Warum eigentlich eigene XMLNode-Klassen erstellen? Du hast doch mit QDomNode + Konsorten schon alles was du brauchst.
Noch schlimmer: Du hast im Moment absolut keinen Gewinn gegenüber den Qt-Klassen, denn du speicherst in XML das QDomDocument, indem der komplette Dom-Tree schon gespeichert ist, und gehst her und baust parallel dazu deinen eigenen Tree auf! Außerdem existiert durch das Memleak noch ein dritter ;)

Was erhoffst du dir denn aus deiner eigenen Struktur?
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

ich will in dieser Struktur später einfach noch ein paar Informationen mehr zu einem Knoten abspeichern, da ich das gesamte DOM-Objekt in diesem Fall nicht brauche, aber nur ein paar spezifische Informationen.

Zum anderen wollte ich endlich mal etwas rekursiv auslesen, was ich bisher ehrlich gesagt nicht hinbekommen habe.
Antworten