3

QXmlStreamWriter を使用して xml ファイルを作成した後、xml ドキュメントを閉じる前に、毎回ファイルにいくつかの要素を追加したいと考えています。

フォーラムに投稿する前に、2 つの方法を試しました: 1/

file.open(QFile:Append | QFile::Text);
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true);
xmlWriter.setAutoFormattingIndent(2);

xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("Fiche_Du_Patient");
xmlWriter.writeStartElement("NUMERO_Patient");
xmlWriter.writeTextElement("Num_Patient", ui.lineEdit_numPtient- >text().toAscii());
xmlWriter.writeTextElement("Nom_et_prenom", ui.lineEdit_Nom->text().toAscii());
xmlWriter.writeTextElement("Date_de_naissance", ui.lineEdit_DOB->text().toAscii());
.......
xmlWriter.writeEndElement();
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();

このメソッドでは、xml ファイルの値を取得したいときに、プログラムは最初のドキュメントの値にアクセスし、エラーを表示します: xml 宣言はドキュメントの開始時ではありません

2番目の方法:追加時にwriteStartDocument()とwriteEndDocument()を削除しましたが、このエラーが発生しました: ドキュメントの末尾に余分なコンテンツがあります

ドキュメントを閉じる前にソリューションを最後に追加して、さまざまな値を取得できるようにします

助けてください!

4

1 に答える 1

2

完全な XML をメモリに読み込んで書き直すことを回避できるのは、汚いハックだけだと思います。

 {
    QString path("/home/carlo/test/x.xml");
    QString ctag = "</Fiche_Du_Patient>\n";

    QFile file(path);
    qint64 s = file.size();
    if (s > 0) {
        file.open(QFile::ReadWrite);
        if (file.seek(s - ctag.length()))
            Q_ASSERT(file.pos() == s - ctag.length());

    } else
        file.open(QFile::WriteOnly);

    QXmlStreamWriter xmlWriter(&file);
    xmlWriter.setAutoFormatting(true);
    xmlWriter.setAutoFormattingIndent(2);

    if (s == 0) {
        xmlWriter.writeStartDocument();
        xmlWriter.writeStartElement("Fiche_Du_Patient");
    }

    xmlWriter.writeStartElement("NUMERO_Patient");
    xmlWriter.writeTextElement("Num_Patient", "123");
    xmlWriter.writeTextElement("Nom_et_prenom", s > 0 ? "appending" : "creating");
    xmlWriter.writeTextElement("Date_de_naissance", s > 0 ? "more date" : "first date");
    xmlWriter.writeEndElement();

    if (s == 0) {
        xmlWriter.writeEndElement();
        xmlWriter.writeEndDocument();
    }
    else
        QTextStream(&file) << ctag;
}

これは正しい XML を生成するように見えますが、出力形式が最適ではありません (適切なインデントが失われています)。より良い方法は、ハードコーディングせずに最後のタグを解析することです。

HTH

于 2013-06-18T15:27:30.113 に答える