tinyxml и c ++ для сохранения данных - PullRequest
0 голосов
/ 12 ноября 2010

Я использую tinyxml для сохранения данных, вводимых пользователем в консольную программу c ++. Я передаю функции сохранения массив структур, которые выглядят следующим образом

struct day
{
      string name;
      string note;
};

У меня их семь, и я передаю все семь в функцию сохранения, которая выглядит следующим образом

void saveData(day dayArr[])
{
    TiXmlDeclaration* declaration = new TiXmlDeclaration("1.0", "UTF-8", "no");//Create DTD
    TiXmlDocument* doc = new TiXmlDocument;
    doc->LinkEndChild(declaration);

    TiXmlElement* week = new TiXmlElement("week");
    TiXmlElement* day = new TiXmlElement("day");
    TiXmlElement* name = new TiXmlElement("name");
    TiXmlElement* note = new TiXmlElement("note");
    TiXmlElement* tl = new TiXmlElement("tl");
    TiXmlElement* ti = new TiXmlElement("ti");
    TiXmlText* dayName = new TiXmlText("");
    TiXmlText* dayNote = new TiXmlText("");

    for(int i=0; i<7; i++)
    {
        dayName = new TiXmlText(dayArr[i].name.c_str());
        dayNote = new TiXmlText(dayArr[i].note.c_str());
        name->LinkEndChild(dayName);
        note->LinkEndChild(dayNote);
        day->LinkEndChild(name);
        day->LinkEndChild(note);
    }

    week->LinkEndChild(day);
    doc->LinkEndChild(week);

    doc->SaveFile("test.xml");
    cout << "SAVED";
}

записывает это в файл

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<week>
    <day>
        <name>SundayMondayTuesdayWednesdayThursdayFridaySaturday
        </name>
        <note>
        </note>
    </day>
</week>

Что мне нужно, это

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<week>
    <day>
        <name>Sunday</name>
        <note>        </note>
    </day>
 <day>
        <name>Monday</name>
        <note>
        </note>
    </day>
 <day>
        <name>Tuesday</name>
        <note>        </note>
    </day>
 <day>
        <name>Wednesday</name>
        <note>        </note>
    </day>
 <day>
        <name>Thursday</name>
        <note>        </note>
    </day>
 <day>
        <name>Friday</name>
        <note>        </note>
    </day>
 <day>
        <name>Saturday</name>
        <note>        </note>
    </day>
</week>

Я не могу понять, как создавать новые элементы тега дня. Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

Я раньше не использовал TinyXml, но, глядя на структуру кода, вам нужно создать элемент day внутри цикла for и добавить его к элементу week 7 раз - по одному разу на каждый день.

Ваш текущий код добавляет элемент дня к элементу недели только один раз в конце - это отражено в вашем xml-выводе.

Принимая часть вашего кода - возможно, что-то похожее на это ниже.(Это может не скомпилироваться или быть не совсем правильным, но должно дать правильную идею).

TiXmlElement* week = new TiXmlElement("week");   
TiXmlElement* name = new TiXmlElement("name");
TiXmlElement* note = new TiXmlElement("note");
TiXmlElement* tl = new TiXmlElement("tl");
TiXmlElement* ti = new TiXmlElement("ti");
TiXmlText* dayName = new TiXmlText("");
TiXmlText* dayNote = new TiXmlText("");

for(int i=0; i<7; i++)
{
    TiXmlElement* day = new TiXmlElement("day");
    dayName = new TiXmlText(dayArr[i].name.c_str());
    dayNote = new TiXmlText(dayArr[i].note.c_str());
    name->LinkEndChild(dayName);
    note->LinkEndChild(dayNote);
    day->LinkEndChild(name);
    day->LinkEndChild(note);
    week->LinkEndChild(day);
}

doc->LinkEndChild(week);
0 голосов
/ 23 августа 2015
void saveData(std::vector<day*> vecDay)
{
    TiXmlDeclaration* declaration = new TiXmlDeclaration("1.0", "UTF-8", "no");//Create DTD
    TiXmlDocument* doc = new TiXmlDocument;
    doc->LinkEndChild(declaration);

    TiXmlElement* week = new TiXmlElement("week");

    for(std::vector<day*>::iterator it = vecDay.begin(); it != vecDay.end(); it++)
    {
        TiXmlElement* day_ = new TiXmlElement("day");
        TiXmlElement* name = new TiXmlElement("name");
        TiXmlElement* note = new TiXmlElement("note");
        TiXmlElement* tl = new TiXmlElement("tl");
        TiXmlElement* ti = new TiXmlElement("ti");
        TiXmlText* dayName = new TiXmlText("");
        TiXmlText* dayNote = new TiXmlText("");
        dayName = new TiXmlText((*it)->name.c_str());
        dayNote = new TiXmlText((*it)->note.c_str());
        name->LinkEndChild(dayName);
        note->LinkEndChild(dayNote);
        day_->LinkEndChild(name);
        day_->LinkEndChild(note);
        week->LinkEndChild(day_);
    }

    doc->LinkEndChild(week);

    doc->SaveFile("test2.xml");
    cout << "SAVED" << endl;
}
...