Seite 1 von 1

[gelöst] XML richtig speichern

Verfasst: 10. November 2008 09:22
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!

Verfasst: 10. November 2008 09:31
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);

Verfasst: 10. November 2008 09:33
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.

Verfasst: 10. November 2008 09:39
von mathies
Hatte den QTextStream auch schon durch, war das gleiche Thema aber danke :)

Ich probiere es mal mit dem StreamWriter.

Verfasst: 10. November 2008 10:41
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.

Verfasst: 10. November 2008 10:48
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 :)