2014-11-02 2 views
0

У меня есть XML-файл, который выглядит примерно такTinyXML вставить в последнюю позицию.

<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; 

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

ответ

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, вам не нужно беспокоиться о существовании детей узлов между - вам просто нужно проверить в конце.

Смежные вопросы