如何使用QXmlStreamWriter将元素插入XML文件中

时间:2013-06-18 14:15:17

标签: xml qt

我用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声明不在文档的开头

第二种方法:我在添加时删除了writeStartDocument()和writeEndDocument(),但是我收到了这个错误: 文档末尾的额外内容

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

你能帮帮我吗?

1 个答案:

答案 0 :(得分: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