3

我用 QXmlStreamWriter 创建了一个 xml 文件,然后我想在每次关闭 xml 文档之前在文件中添加一些元素。

在论坛上发帖之前,我尝试了两种方法: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 declaration not at start of document

第二种方法:我在添加时删除了 writeStartDocument() 和 writeEndDocument(),但是我得到了这个错误: extra content at end of document

在关闭文档之前将解决方案添加到末尾,以便我可以获得不同的值

你能帮我吗!!

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,但格式输出不是最佳的(漂亮的缩进丢失了)。更好的方法是解析最后一个标签,而不用硬编码。

高温高压

于 2013-06-18T15:27:30.113 回答