Daten in einer XML ändern

Alles rund um die Programmierung mit Qt
Antworten
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Daten in einer XML ändern

Beitrag von darkshine »

Ich habe aus einer XML-Datei mit QXmlStreamReader bestimmte Elemente ausgelesen.
Diese habe ich in eine StringList geschrieben und in einer zeige diese in einer Tabelle und kann den Inhalt nun verändern.

Diese veränderten Werte möchte ich nun wieder in die XML schreiben. Damit ich weiß wo was stehen muss, habe ich eine QHash erstellt in der die "alten" Werte als Key eingetragen sind und dann dazu der entsprechend neue Wert.

Mit dieser Hash müsste ich doch die neuen Werte wieder in die XML schreiben können.

Ich durchsuche die XML nach dem Key (alte Werte) und wenn einer gefunden wurde, dann ersetze den Wert durch den Neuen.

Ich habe bis jetzt leider noch nie in eine XML geschrieben sondern nur ausgelesen. Kann ich mit QXmlStreamWriter auch eine XML ändern oder "nur" ganz neu schreiben.

Vielen Dank für eure Hilfe
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das einfachste wäre, du verabschiedest dich von deinem jetzigen Ansatz und gehst auf DOM über. QDomDocument wäre ein guter Einstieg in die Doku. Dom kannst du lesen und schreiben, die Struktur (samt alter Daten) bleibt in jedem Fall erhalten - solange du nicht wild Elemente löschst :P
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

Mein Quellcode sieht jetzt so aus

Code: Alles auswählen

QXmlStreamReader xml(&filexml);
QXmlStreamWriter xmlwrite(&filexml);

	while (!xml.atEnd() && !xml.hasError()) 
	{
		xml.readNext();
		if (xml.isStartElement())
		{

		
			if(xml.name().toString() == "translation")
			{
				QString key = xml.readElementText();

				//Durchsuche die Hash nach dem key
				QString neuerWert = translationhash.value(key);

				//Schreibe den neunen Wert in die XML
                
			}		
	}
Kann ich da jetzt mit QXmlStreamWriter xmlwrite weitermachen?
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

wenn es nicht anders geht, dann werde ich mich mit QDom beschäftigen, aber vllt passt es ja auch so :-)

Mehr muss ich mit der XML nicht machen
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

Ok google sagt "Mit QXmlStreamWriter lassen sich keine Elemente ändern" Da muss ich wohl doch auf QDom umsteigen

Schade und dabei war ich so nah dran :(
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

Jetzt da ich auf QDom umsteigen musste. Habe ich folgendes aus den Beispielen übernommen

Code: Alles auswählen

QDomDocument doc("Teekanne");
QFile filexml("Teekanne.ts");
bool open = filexml.open(QIODevice::ReadWrite| QIODevice::Text);
    if (!open) 
    {
        qDebug() << "Couldn't open file";        
    }
    else 
    {
        qDebug() << "File opened OK";
		doc.setContent(&filexml);
     }

 // print out the element names of all elements that are direct children
 // of the outermost element.
 
 QDomElement docElem = doc.documentElement();


 QDomNode n = docElem.firstChild();
 while(!n.isNull()) {
     QDomElement e = n.toElement(); // try to convert the node to an element.
     if(!e.isNull()) {
		 qDebug() << e.text(); 
     }
     n = n.nextSiblingElement();
 }
 
Ich öffne also meine Übersetzungsdatei Teekanne. (Die Pfefferminzpackung vor mir hat mich zu dem Namen gebracht ;-))

Es wird mir auch "alles" angezeigt. Ich möchte aber aus der XML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en_US">
<context>
<name>Comports</name>
<message>
<location filename="../Comports.cpp" line="157"/>
<source>hund</source>
<translation>dog</translation>
</message>
<message>
<location filename="../Comports.cpp" line="158"/>
<source>katze</source>
<translation>cat</translation>
</message>

nur das zwischen <translation> </translation> haben. Also "dog" und "cat".

Ich schaffe es einfach nicht dies zu filtern. Mit dem QXmlStreamReader hatte ich es geschafft.

Ich hoffe Ihr könnt mir kurz vor Silvester noch helfen.

Vielen Dank
darkshine
Beiträge: 102
Registriert: 20. August 2010 11:39

Beitrag von darkshine »

Ich habe mir jetzt eine Lösung gebastelt

Code: Alles auswählen

QDomNode n = docElem.firstChild();

 while(!n.isNull()) 
 {
	 QDomNode nmessage = n.firstChildElement("message");

	 while(!nmessage.isNull())
	 {
		 QDomNode ntranslation = nmessage.firstChildElement("translation");

		 while(!ntranslation.isNull())
		 {

			 QDomElement e = ntranslation.toElement(); // try to convert the node to an element.
			 if(!e.isNull()) {
				 qDebug() << e.text(); // the node really is an element.
			 }
			 ntranslation = ntranslation.nextSiblingElement();

		 }
		 nmessage = nmessage.nextSiblingElement();
	 }
	 n = n.nextSiblingElement();
 }
Antworten