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
Daten in einer XML ändern
Mein Quellcode sieht jetzt so aus
Kann ich da jetzt mit QXmlStreamWriter xmlwrite weitermachen?
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
}
}
Jetzt da ich auf QDom umsteigen musste. Habe ich folgendes aus den Beispielen übernommen
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
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();
}
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
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();
}