[gelöst] XML richtig speichern

Alles rund um die Programmierung mit Qt
Antworten
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

[gelöst] XML richtig speichern

Beitrag von mathies »

Hallo,

ich habe ein XML File ausgelesen und möchte es wieder in eine Datei speichern. Ich habe jetzt schon etliche Möglichkeiten durch aber ich bekomme immer irgendwelche Sonderzeichen am Anfang der neuen Datei. Diese stehen aber im ursprünglichen String den ich speichern will nicht drin!

Code: Alles auswählen

QDomDocument doc;

// String erzeugen
QString newConfig = doc.toString(2);

// Speichern
if(!xmlfile.open( QIODevice::ReadWrite | QIODevice::Text ) ) 
{ 
    return false; 
}
char* output = (char*)newConfig.utf16();
xmlfile.write( output );
xmlfile.close();
Was ist daran falsch? Immer wenn ich den String oder ein ByteArray speichere steht an manchen stellen Müll in der Ausgabedatei! :( In der Konfiguration wie sie hier gezeigt ist, "nur noch" an der ersten Stelle. Reicht aber auch um die XML ungültig zu machen.
Schau ich mir das im Debugger an stimmt alles, auch wenn ich es nach utf8, utf16 oder unicode konvertiere!
Zuletzt geändert von mathies am 10. November 2008 10:49, insgesamt 1-mal geändert.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

beim offnen sicher sein was fuer codec da ist in der erste zeile...

Code: Alles auswählen


/* correct codex from xml file read only first line */
static inline QTextCodec *GetcodecfromXml( const QString xmlfile  )
{
    QString semencoding = "UTF-8";
    QTextCodec *codecsin;
    QFile *xfile = new QFile( xmlfile );
    if (!xfile->exists()) {
    codecsin =  QTextCodec::codecForName(semencoding.toAscii());
    return codecsin;
    }
  
    QString Firstline;
    bool validxml = false;
    if (xfile->open(QIODevice::ReadOnly))    {
             char buf[1024];
             qint64 lineLength = xfile->readLine(buf, sizeof(buf));
             Firstline = QString(buf);
             if (lineLength > 10 && Firstline.contains("encoding")) {
             validxml = true;
             }  
    }
  
    if (!validxml ) {
    codecsin =  QTextCodec::codecForName(semencoding.toAscii());
    return codecsin;
    }
  
    QRegExp expression( "encoding=[\"\'](.*)[\"\']", Qt::CaseInsensitive );
    expression.setMinimal(true);
    int iPosition = 0;
    while( (iPosition = expression.indexIn( Firstline , iPosition )) != -1 ) {
        semencoding = expression.cap( 0 );
        semencoding = semencoding.mid(10,semencoding.size() - 11);
        iPosition += expression.matchedLength();
        qDebug() << "### semencoding" << semencoding;
    }
    if (iPosition == -1) {
    codecsin =  QTextCodec::codecForName("UTF-8");
    } else {
    codecsin =  QTextCodec::codecForName(semencoding.toAscii());
    }
    return codecsin;
}


Beim speichern in dom zu QByteArray geht auch oder;

QTextStream sw( &f );
sw.setCodec(codecx);
.........................
speack português italiano deutsch english castellà qt
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ist schon schwer mit den korrekten Encodings. Vor allem wenn man chars benutzt um Unicode zu speichern, anstatt die angebotenen Klassen zu nutzen. Ein paar Stichworte: QTextStream, QXmlStreamReader und QXmlStreamWriter.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag von mathies »

Hatte den QTextStream auch schon durch, war das gleiche Thema aber danke :)

Ich probiere es mal mit dem StreamWriter.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Wenn Du es mit dem TextStream nicht hinbekommen hast, wirst du mit QXmlStreamWriter auch Probleme haben. Dann hast Du mit Sicherheit das setCodec vergessen. Damit eine Textdatei korrekt eingelesen werden kann, muss sofort klar sein wie der Text kodiert ist. Und das steht dann in den ersten 2 Bytes.
http://de.wikipedia.org/wiki/Textdatei#Zeichencodierung
Wenn die angegebene Kodierung nicht mit dem gespeicherten Text überein stimmt, dann hast Du wieder kryptische Zeichen im Text. Einfachste Form ist also einen TextStream zu nehmen, Kodierung auf UTF-8, und den dann mit QStrings zu füttern.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag von mathies »

Also mit dem QXMLStreamWriter klappt es ganz gut bis jetzt. Muss halt noch bissl was ändern, da er das ja nur einzeln schreibt aber so kann ich wenigstens noch ein paar Einstellungen machen.
Ich hatte den codec eigentlich immer gesetzt aber irgendwo fand sich immer so ein komisches Zeichen..

Klappt jetzt auf jedenfall mit dem Writer, danke :)
Antworten