Вставить элемент (TinyXml)

Я хочу добавить элемент в файл xml. Может ли кто-нибудь помочь мне сделать это?

Ниже приведен пример моего кода.

 <?xml version="1.0" encoding="UTF-8" ?>
    <category1>
        <category2 name="1">1.79639 0.430521</category2 >
        <category2 name="2">2.06832 0.652695</category2 >
        <category2 name="3">1.23123 0.111212</category2 >    <-- new
    </category1>

код:

 if (doc.LoadFile()) {
                TiXmlHandle docHandle(&doc);
                TiXmlElement* fileLog = docHandle.FirstChild("category1").ToElement();
                if (fileLog) {
                    TiXmlElement newCategory2("category2");
                    newCategory2.SetAttribute("name", "5");
                    fileLog->InsertEndChild(newCategory2);
                }
            }

Надеюсь получить помощь от кого-либо.


person bob torus    schedule 11.12.2018    source источник
comment
Эта проблема разбивается на чтение XML-файла, добавление элемента <category2> внутрь <category1> и запись XML обратно в файл. Какие части вы уже внедрили и где застряли?   -  person Botje    schedule 11.12.2018
comment
@Botje, обновлено   -  person bob torus    schedule 11.12.2018
comment
Хорошо, что не так с этим кодом? Это крах? Выдает ли это ошибки компилятора? Из того, что я читал, вам лучше выделить newCategory2 в куче с new.   -  person Botje    schedule 11.12.2018
comment
@Botje: InsertEndChild создаст новый узел, используя модель памяти TiXml. Этот узел будет построен (скопирован) из входного узла.   -  person tunglt    schedule 11.12.2018


Ответы (1)


TiXML не принимает пробелы между тегами XML как </category2 >, это должно быть </category2>. Ваш LoadFile вернет false, и узел не будет вставлен.

Следующий код работает так, как ожидалось:

    const char * szTiXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
        "<category1>"
        "<category2 name=\"1\">1.79639 0.430521</category2>"
        "<category2 name=\"2\">2.06832 0.652695</category2>"
        "<category2 name=\"3\">1.23123 0.111212</category2>"
        "</category1>";

    TiXmlDocument doc;
    doc.Parse( szTiXML );
    //if (doc.LoadFile()) 
    {
        TiXmlHandle docHandle(&doc);
        TiXmlElement* fileLog = docHandle.FirstChild("category1").ToElement();
        if (fileLog) {
            TiXmlElement newCategory2("category2");
            TiXmlText myText("Hello From SO");

            newCategory2.SetAttribute("name", "5");
            newCategory2.InsertEndChild(myText);

            fileLog->InsertEndChild(newCategory2);
        }

        doc.Print(stdout);
    }

Вывод:

<?xml version="1.0" encoding="UTF-8" ?>
<category1>
    <category2 name="1">1.79639 0.430521</category2>
    <category2 name="2">2.06832 0.652695</category2>
    <category2 name="3">1.23123 0.111212</category2>
    <category2 name="5">Hello From SO</category2>
</category1>
person tunglt    schedule 11.12.2018
comment
Как я могу получить следующее: ‹category2 name=5 ›text‹/category2› - person bob torus; 11.12.2018
comment
@bobtorus: я отредактировал свой ответ. Вы можете добавить текст, как вы хотите в вашем приложении. - person tunglt; 11.12.2018