Search code examples
c++wxwidgetstinyxml

TinyXML2 and C++


I want to read the data from a wxGrid and write it into a XML File. The wxGrid is like:

Jahr | Monat
------ |-------------
2012 | 03
2009 | 08


What I want to have:

<SQL>
    <Datensatz>
        <Jahr>2012</Jahr>
        <Monat>03</Monat>
    </Datensatz>
    <Datensatz>
        <Jahr>2009</Jahr>
        <Monat>08</Monat>
    </Datensatz>
</SQL>


What I got:

<SQL>
    <Datensatz>
        <Jahr>20122009</Jahr>
        <Monat>0308</Monat>
    </Datensatz>
    <Datensatz>
        <Jahr>20122009</Jahr>
        <Monat>0308</Monat>
    </Datensatz>
</SQL>


My Code:

XMLDocument doc;
XMLElement* xesql = doc.NewElement("SQL");
XMLNode * xnsql = doc.InsertFirstChild(xesql);
XMLElement* xejahr = doc.NewElement("Jahr");
XMLElement* xemonat = doc.NewElement("Monat");
XMLText* datensatzJahr = doc.NewText("");
XMLText* datensatzMonat = doc.NewText("");
for(int i=0; i<=1; i++)
{
    XMLElement* xedatensatz = doc.NewElement("Datensatz");
    datensatzJahr = doc.NewText(m_gd_data->GetCellValue(i,0));
    datensatzMonat = doc.NewText(m_gd_data->GetCellValue(i,1));
    xejahr->InsertEndChild(datensatzJahr);
    xemonat->InsertEndChild(datensatzMonat);
    xedatensatz->InsertEndChild(xejahr);
    xedatensatz->InsertEndChild(xemonat);
    xesql->InsertEndChild(xedatensatz);
}
doc.SaveFile(path);


I really don't know where's the problem. Can anyone help?


Solution

  • You are not resetting the XML elements for each iteration of the loop, hence you are only appending text to an existing element. this should work:

    XMLDocument doc;
    XMLElement* xesql = doc.NewElement("SQL");
    XMLNode * xnsql = doc.InsertFirstChild(xesql);
    for(int i=0; i<=1; i++)
    {
        XMLElement* xejahr = doc.NewElement("Jahr");
        XMLElement* xemonat = doc.NewElement("Monat");
        XMLText* datensatzJahr = doc.NewText("");
        XMLText* datensatzMonat = doc.NewText("");
    
        XMLElement* xedatensatz = doc.NewElement("Datensatz");
        datensatzJahr = doc.NewText(m_gd_data->GetCellValue(i,0));
        datensatzMonat = doc.NewText(m_gd_data->GetCellValue(i,1));
        xejahr->InsertEndChild(datensatzJahr);
        xemonat->InsertEndChild(datensatzMonat);
        xedatensatz->InsertEndChild(xejahr);
        xedatensatz->InsertEndChild(xemonat);
        xesql->InsertEndChild(xedatensatz);
    }
    doc.SaveFile(path);