我用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(),但是我收到了这个错误: 文档末尾的额外内容
在关闭文档之前将解决方案添加到结尾,以便我可以获得不同的值
你能帮帮我吗?
答案 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