Seite 1 von 1
[gelöst, danke] Zeitstempel in XML-Datei aktualisieren
Verfasst: 20. Juni 2008 16:35
von mister.xy
Hallo,
kann mir jemand bei folgendem Problem helfen:
Ich will eine Funktion schreiben, die den Zeitstempel in in einer XML-Datei aktualisiert, nachdem sich der Inhalt der Datei geändert hat (z.B. Hinzufügen eines Datesatzes für ein Bild mit Bildname und anderen Infos zu diesem Bild.)
Für das Setzen des Zeitstempels habe ich eine Methode geschrieben. Dazu habe ich die Methode currentDateTime() von der Klasse QDateTime verwendet und dann mit der Methode toString() den Zeitstempel zusammengesetzt:
Code: Alles auswählen
QString set_changeDateTime()
{
QDateTime dt_datetime = QDateTime::currentDateTime();
QString sNewchange=dt_datetime.toString("yyyy-MM-ddZhh:mm:ss");
return sNewchange;
}
Das Tag in der XML-Datei sieht folgendermaßen aus:
Dieser Zeitstempel soll aktualisiert werden, wenn neue Daten in die Datei geschrieben werden.
Für jeden Hinweis bin ich dankbar.
gruß
mister.xy
Verfasst: 20. Juni 2008 18:09
von Sephral
Hallo,
wie arbeitest du denn mit den Dateien?
Verwendest du die XML-Klassen von Qt?
Wenn ja, sollte sich das damit wohl erschlagen lassen, damit kenne ich mich aber nicht wirklich aus, daher spare ich mir Spekulationen.
Bei kleinen Files würde ich einfach mit QString::replace arbeiten und mit nem RegExp nach dem Tag suchen.
Code: Alles auswählen
QString & QString::replace ( const QRegExp & rx, const QString & after )
Entweder das File kurz komplett in den Speicher laden oder zeilenweise durchlaufen. Wenn der Zeitstempel z.B. immer recht weit oben im File ist, wäre das auch bei großen Files kein Problem.
Ciao,
Sephral
Verfasst: 23. Juni 2008 15:54
von mister.xy
Hallo Sephral,
danke für die Antwort.
Ich verwende QDom, die DOM-API von Qt.
Ich arbeite folgendermaßen mit den Dateien:
1. Datei (QFile) öffnen (lesend / schreibend)
2. Datei lesen(Methode readAll() von der Klasse QByteArray)
3. Datei parsen mit der setContent()-Methode von der Klasse QDomDocument.
4. mit der XML-Datei arbeiten
5. Datei schliessen
Bei dieser replace habe ich es folgendermaßen probiert:
Code: Alles auswählen
replace(QRegExp(<change>[ ]</change>) ,sUpdateChange);
sUpdateChange ist vom Typ QString und enthält den neu generierten Zeitstempel.
Der alte Wert wird jedoch in der XML-Datei nicht durch den neuen Wert ersetzt.
Kann mir jemand einen Tipp bzw. Hinweis geben, damit die Aktualisierung funktioniert?
gruß
mister.xy
Verfasst: 23. Juni 2008 16:03
von Sephral
Hallo,
dein RegExp ist suboptimal
Du musst ausprobieren was in Deinem Dokument am besten passt.
Code: Alles auswählen
replace(QRegExp("<change>.*</change>") ,"<change>" + sUpdateChange + "</change>");
Wenn du "QRegExp::setMinimal(true)" nutzt, könnte es mit dem obigen RegExp schon ganz gut klappen. Ansonsten musst du einen spezielleren RegExp finden der für Dein Dokument besser passt.
Ciao,
Sephral
Verfasst: 23. Juni 2008 16:51
von mister.xy
Hallo Sephral,
danke für die Antwort.
Die replace-Methode habe nun wie folgt ausprobiert:
Dabei habe in slChange (QStringList) die alten Zeitstempel gespeichert und in sUpdateChange ist der neu generierte Zeitstempel.
Mit den folgenden Zeilen setze ich neu generierten Zeitstempel im Knoten von <change>:
Code: Alles auswählen
dnlXMLfileChange.at(i).setNodeValue(slChange[i]); //(dnlXMLfileChange = QDomNodeList)
cout<<qPrintable(dnlXMLfileChange.at(i).nodeValue());
Wenn nun den Zeitstempel auf der Konsole ausgebe, kommt der neu generierte Zeitstempel, jedoch wird dieser nicht in der XML-Datei gespeichert. Dort steht an der Stelle an der i immer noch der alte Zeitstempel.
Wie stelle ich es an, damit der alte Zeitstempel durch den neuen ersetzt wird.
Bin für jeden Hinweis bzw. Tipp dankbar.
gruß
mister.xy
Verfasst: 23. Juni 2008 16:53
von Sephral
Speicherst du die Datei nach dem replace wieder ab?
Verfasst: 26. Juni 2008 09:01
von mister.xy
Hallo,
ja, ich habe die Datei danach wieder abgespeichert. Es war ein anderes Problem.
Dieses habe ich folgendermaßen gelöst:
Code: Alles auswählen
//Zeitstempel aktualisieren
QDomDocumentFragment ddfUpdatedChange = docNewXML.createDocumentFragment();
QDomElement deUpdatedChange = docNewXML.createElement("last_change");
QDomText dtUpdatedChange = docNewXML.createTextNode(sUpdateChange);
deUpdatedChange.appendChild(dtUpdatedChange);
ddfUpdatedChange.appendChild(deUpdatedChange);
dnlXMLfileChange.at(i).parentNode().removeChild(dnlXMLfileChange.at(i));
QDomNode dnUpdatedChange = docNewXML.elementsByTagName("picture_data_list").at(0);
dnUpdatedChange.insertAfter(ddfUpdatedChange,dnUpdatedChange.lastChild());
Ich habe ein QDomDocumentFragment erstellt, welches einen neuen Knoten mit dem Tag <change> erzeugt hat. Dann habe ich den Knoten mit dem alten Zeitstempel gelöscht (removeChild()) und einen Knoten mit dem neuen Zeitstempel eingefügt.
Danke für die Hinweise bzw. Tipps.
Gruß
mister.xy