使用 TinyXML 解析 XML 元素 - 无限循环
using TinyXML Parsing XML Elements - Infinite loop
我想读取一个找到多个测试的 xml 文件,但我总是得到第一个并且它没有出圈。如果我做得很好,但是当我做泡泡时,我就无法继续进行下一个测试。
如果我使用//pBodys = pRoot-> NextSiblingElement ("Test");我在 2 次迭代中错过了一个错误,(https://i.gyazo.com/9a108bf422299b66abfe91127668a63c.png) 如果我不使用它,它会停留在无限循环中
(https://i.gyazo.com/133be25514a8a000fce87e2fc7cc52ad.png)
我不能继续前进。对不起谷歌翻译。一个问候
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>
问题是XMLElement.Attribute返回一个表示C字符串的const char*
,而不是int
。所以这段代码
(int)count->Attribute("cont");
不正确,因为您要将指针转换为整数(这通常会导致非常大的整数值,因此明显的无限循环)。
您需要做的是将属性转换为int
而不是强制转换它。一种方法是使用 atoi
函数
int numTests = atoi(count->Attribute("cont"));
for (int i = 0; i < numTests; ++i) {
请注意,此代码中没有错误检查(如果属性丢失或不是整数形式怎么办?
了解强制转换和将一种类型转换为另一种类型之间的区别非常重要。它们并不总是做同样的事情,只是添加一个强制转换以使编译器错误消息消失很少是正确的做法。
相关文章:
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 连接线程时的无限循环
- 为什么这种方法会进入无限循环?
- 由于QTextStream的无限循环
- 使用 TinyXML 解析 XML 元素 - 无限循环
- 错误:将元素加载到矢量时无限循环
- 在C++中显示堆栈元素时的无限循环