TinyXML вставьте в последнюю позицию.

0

У меня есть xml файл, который выглядит примерно так

<App>
    <FileLog>
        <recording id="1" name="filename1.mp3" date="123467" length="66" />
        <recording id="2" name="filename2.mp3" date="123345" length="66" />
        <recording id="3" name="filename3.mp3" date="123345" length="66" />
    </FileLog>
</App>

Я пытаюсь вставить другой элемент записи после последнего элемента записи (тот, который имеет самый высокий идентификатор), используя TinyXML.

Мой код

string xml="C:/logs.xml";
TiXmlDocument doc(xml.c_str());
if(doc.LoadFile()) 
{
    doc.FirstChild("FileLog");
    TiXmlElement recording("recording");
    recording.SetAttribute("id",4);
    recording.SetAttribute("name","filenamex.mp3");
    recording.SetAttribute("date",436636);
    recording.SetAttribute("length",34);
    doc.InsertAfterChild(recording);
}
else cout << "error loading file" << endl;

if(doc.SaveFile(xml.c_str())){
    cout << "file saved succesfully.\n";

}
else cout << "error saving file" << endl;

Я не получаю желаемого результата. Как я могу заставить его всегда вводить элемент в последнюю позицию?

Теги:
tinyxml

1 ответ

1
Лучший ответ

Ну, на основе документа первым ребенком документа является App, а не FileLog (вы также не сохраняете результат). Должно работать следующее:

if (doc.LoadFile()) {
  TiXmlHandle docHandle(&doc);
  TiXmlElement* fileLog = docHandle.FirstChild("App").FirstChild("FileLog").ToElement();

  if (fileLog) {
    TiXmlElement recording("recording");

    recording.SetAttribute("id", 4);
    recording.SetAttribute("name", "filenamex.mp3");
    recording.SetAttribute("date", 436636);
    recording.SetAttribute("length", 34);

    fileLog->InsertEndChild(recording);
  }
}

Обратите внимание, что с TiXmlHandle вам не нужно беспокоиться о существовании дочерних узлов между ними - вам просто нужно проверить в конце.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню