Как отредактировать конец XML-документа в Qt (writeEndDocument)?

Пишу небольшую программу адресную книгу, контакты сохраняю в xml файле. Вот часть кода

void new_engine::main_window::write_to_db(const QString& n, const QString& s)
{
    QFile m_db_file(m_db_path);
    QString t("User");
    m_db_file.open(QIODevice::Append);
    QXmlStreamWriter wxml(&m_db_file);
    wxml.setAutoFormatting(true);
    if(m_size == 1)
    {
        wxml.writeStartDocument();
        wxml.writeStartElement("Persons");
    }
    wxml.writeStartElement(t);
    QString id = QString::number(m_size);
    wxml.writeAttribute("id", id);
    wxml.writeTextElement("Name", n);
    wxml.writeTextElement("Surname", s);
    wxml.writeEndElement();
    wxml.writeEndDocument();
    m_db_file.close();
}

но проблема в том что после первого контакта тэг файл закрывается. вот результат

<?xml version="1.0" encoding="UTF-8"?>
<Persons>
    <User id="1">
        <Name>das</Name>
        <Surname>vcvx</Surname>
    </User>
</Persons>

<User id="2">
    <Name>eqwevxcv</Name>
    <Surname>xcvxcx</Surname>
</User>

<User id="3">
    <Name>das</Name>
    <Surname>dasdasd</Surname>
</User>

но так и должно быть

<Persons>
    <User id="1">
        <Name>das</Name>
        <Surname>vcvx</Surname>
    </User>

    <User id="2">
        <Name>eqwevxcv</Name>
        <Surname>xcvxcx</Surname>
    </User>

    <User id="3">
        <Name>das</Name>
        <Surname>dasdasd</Surname>
    </User>
</Persons>

Как мы можем это сделать, после каждой новой записи придется менять конец документа?


person Community    schedule 20.06.2013    source источник
comment
Вы запускали его через отладчик? Для начала вы вызываете wxml.writeEndDocument(), когда на самом деле это не конец документа.   -  person Huy    schedule 20.06.2013
comment
много времени искал в отладчике, ничего страшного, просто не знаю, как редактировать конец документа, то есть wxml.writeEndDocument(); .   -  person    schedule 20.06.2013
comment
Я рекомендую написать начало документа один раз, затем перейти к циклу и начать заполнять пользовательские разделы, вызывая функцию. После завершения цикла вы должны закрыть документ (где-то за пределами функции)   -  person Huy    schedule 20.06.2013
comment
но как добавить элементы после установки конца документа. Это адресная книга и там всегда добавляются/удаляются элементы, а здесь надо постоянно менять конец документа.   -  person    schedule 20.06.2013
comment
Если вам нужно прочитать данные и добавить дополнительную информацию, вы можете взглянуть на этот пример кода   -  person Huy    schedule 20.06.2013


Ответы (1)


Вот пример:

void write_to_db(QXmlStreamWriter& writer, QString id, QString name, QString surname)
{
  writer.writeStartElement("User");
  writer.writeAttribute(QXmlStreamAttribute("id", id));

  writer.writeTextElement("Name", name);
  writer.writeTextElement("Surname", surname);

  writer.writeEndElement();
}

// This can be a file, or whatever iodevice your heart desires.
QString out;
QXmlStreamWriter writer(&out);
writer.writeStartDocument();
writer.writeStartElement("Persons");

write_to_db(writer, "1", "das", "vcvx");
write_to_db(writer, "2", "das", "vcvx");
write_to_db(writer, "3", "das", "vcvx");

writer.writeEndElement(); // Close <persons> tag
writer.writeEndDocument();

Вывод (с использованием QXmlStreamWriter::setAutoFormatting/Indent):

<?xml version="1.0"?>
<Persons>
 <User id="1">
  <Name>das</Name>
  <Surname>vcvx</Surname>
 </User>
 <User id="2">
  <Name>das</Name>
  <Surname>vcvx</Surname>
 </User>
 <User id="3">
  <Name>das</Name>
  <Surname>vcvx</Surname>
 </User>
</Persons>
person Huy    schedule 20.06.2013