использование TinyXML-парсинга XML-элементов - бесконечный цикл - PullRequest
0 голосов
/ 31 января 2019

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

И если я использую // pBodys = pRoot-> NextSiblingElement ("Test");Я пропускаю ошибку в 2 итерации, (https://i.gyazo.com/9a108bf422299b66abfe91127668a63c.png), если я не использую ее, она остается в бесконечном цикле

(https://i.gyazo.com/133be25514a8a000fce87e2fc7cc52ad.png)

Я не могу двигаться дальше.Извините за перевод Google. Приветствие

    int main()
    {
        XMLDocument doc;
        doc.LoadFile("example.xml");
        XMLElement *pRoot, *pBodys, *pParms, *pParms2, *pProcess, *pApp, *pLineFormat, *pParm, *pParm2, *count;
        pRoot = doc.FirstChildElement("Tests");
        if (pRoot)
        {
            count = pRoot->FirstChildElement("count");
            std::cout << "cont=" << count->Attribute("cont") << std::endl;
            pBodys = pRoot->FirstChildElement("Test");
            //for (int i = 0; i < (int)count->Attribute("cont"); i++) {


            std::cout << "id=" << pBodys->Attribute("id") << std::endl;
            if (pBodys) {
                pParms = pBodys->FirstChildElement("Inputs");
                if (pParms)
                {
                    pParm = pParms->FirstChildElement("Input");
                    while (pParm) {

                        std::cout << "port=" << pParm->Attribute("port") << " ";
                        std::cout << "value=" << pParm->Attribute("value") << std::endl;


                        pParm = pParm->NextSiblingElement("Input");
                    }
                }
                pParms2 = pBodys->FirstChildElement("Outputs");
                if (pParms2)
                {
                    pParm2 = pParms2->FirstChildElement("Output");
                    while (pParm2) {

                        std::cout << "port=" << pParm2->Attribute("port") << " ";
                        std::cout << "value=" << pParm2->Attribute("value") << std::endl;


                        pParm2 = pParm2->NextSiblingElement("Output");
                    }
                }



            }

            //pBodys = pRoot->NextSiblingElement("Test");
        //}
    }

    return 0;
}

DOC example.xml 
<Tests>
    <count cont="2"></count>
    <Test id="test0">
        <Inputs>
            <Input port="A" value="1" />
            <Input port="B" value="4.56" />
            <Input port="C" value="7" />        
        </Inputs>
        <Outputs>
            <Output port="D" value="10" />      
        </Outputs>
    </Test>

    <Test id="test1">
        <Inputs>
            <Input port="K" value="3" />
            <Input port="L" value="9.56" /> 
        </Inputs>
        <Outputs>
            <Output port="P" value="6" />       
        </Outputs>
    </Test>
</Tests>

1 Ответ

0 голосов
/ 31 января 2019

Проблема в том, что XMLElement.Attribute возвращает const char*, представляющий строку C, а не int.Так что этот код

 (int)count->Attribute("cont");

неверен, поскольку вы приводите указатель на целое число (которое обычно приводит к очень большому целочисленному значению, отсюда и ваш очевидный бесконечный цикл).

Что вам нужно преобразовать атрибут в int, не приведя его.Один из способов сделать это - использовать функцию atoi

int numTests = atoi(count->Attribute("cont"));
for (int i = 0; i < numTests; ++i) {

Обратите внимание, что в этом коде нет проверки ошибок (что, если атрибут отсутствует или не имеет интегральной формы?).

Важно понимать разницу между приведением и преобразованием одного типа в другой.Они не всегда делают одно и то же, и просто добавить приведение, чтобы сообщение об ошибке компилятора исчезло, редко бывает правильным.

...