Проблемы с загрузкой данных из xml с использованием TinyXml2

Я пытаюсь создать функцию в моем приложении, которая может загружать объект с помощью атрибутов в XML-файле. Я хотел бы использовать TinyXML2, так как слышу, что это довольно просто и быстро для игр.

В настоящее время у меня есть следующий XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<Level>
    <Pulsator starttime="0" type="0" higherradius="100" lowerradius="10" time="60" y="500" x="300" bpm="60"/>
</Level>

Каждый атрибут Pulsator является переменной в моем классе Pulsator. Я использую функцию followign, чтобы импортировать мои Pulsators и добавить их в вектор объектов.

void Game::LoadLevel(string filename)
{
    tinyxml2::XMLDocument level;
    level.LoadFile(filename.c_str());
    tinyxml2::XMLNode* root = level.FirstChild();
    tinyxml2::XMLNode* childNode = root->FirstChild();

    while (childNode)
    {
        Pulsator* tempPulse = new Pulsator();
        float bpm;
        float type;
        std::string::size_type sz;

        tinyxml2::XMLElement* data = childNode->ToElement();
        string inputdata = data->Attribute("bpm");
        bpm = std::stof(inputdata, &sz);

        if (type == 0)
        {
            tempPulse->type = Obstacle;
            tempPulse->SetColor(D2D1::ColorF(D2D1::ColorF::Black));
        }
        if (type == 1)
        {
            tempPulse->type = Enemy;
            tempPulse->SetColor(D2D1::ColorF(D2D1::ColorF::Red));
        }
        if (type == 2)
        {
            tempPulse->type = Score;
            tempPulse->SetColor(D2D1::ColorF(D2D1::ColorF::Green));
        }
        else
        {
            tempPulse->type = No_Type;
        }

        objects.push_back(tempPulse);
    }
}

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

1 ответ

Код не правильно определяет ребенка, которого он хочет. Вы хотите первый элемент XMLElement, а не первый ребенок. Чтобы сделать это, используйте этот код, когда вы получите childNode:

tinyxml2::XMLElement* childNode = root->FirstChildElement();

И это спасет вас от броска позже. (Вам не нужен и не следует использовать ToElement()).

Другие вопросы по тегам