У меня есть 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;
Я не получаю желаемого результата. Как я могу заставить его всегда вводить элемент в последнюю позицию?
Ну, на основе документа первым ребенком документа является 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
вам не нужно беспокоиться о существовании дочерних узлов между ними - вам просто нужно проверить в конце.