我的程序中有一个类,它使用Rapid XML将重要数据写入文件。这个过程很好。但是,当我尝试读取相同的数据时,我的程序将始终被内部错误捕获代码暂停,解释“下一个兄弟返回NULL但尝试读取值无论如何”。
if (xmlFile.good())
{
vector<char> buffer((istreambuf_iterator<char>(xmlFile)), istreambuf_iterator<char>());
buffer.push_back('\0');
doc.parse<0>(&buffer[0]);
root_node = doc.first_node("CityData");
for(xml_node<> * bound_node = root_node->first_node("Boundaries"); bound_node; bound_node = bound_node->next_sibling())
{
if (bound_node->first_attribute("enabled")->value() != NULL)
{
int enabled = atoi(bound_node->first_attribute("enabled")->value());
if (enabled == 1)
boundaries = true; // Program globals
}
}
if (boundaries)
{
for(xml_node<> * dimen_node = root_node->first_node("Dimensions"); dimen_node; dimen_node = dimen_node->next_sibling())
{
cityDim.x = atoi(dimen_node->first_attribute("x-val")->value()); // Program globals
cityDim.y = atoi(dimen_node->first_attribute("y-val")->value());
}
}
数据如何出现在XML文件中的例子:
<CityData version="1.0" type="Example">
<Boundaries enabled="1"/>
<Dimensions x-val="1276" y-val="688"/>
如果我在循环之前添加断点(任一个)尝试重复并查看值,我们可以看到它们是从第一次迭代中读入的,但是循环的结束标准似乎是不正确的并且在next_sibling ()发生错误。我无法理解这个问题,因为循环的代码是从一个完全未经修改的示例(除了变量重命名)复制而且对我来说是正确的(将其修改为节点!= NULL)没有帮助。
答案 0 :(得分:0)
在bound_node
- 循环中,变量bound_node
首先指向<Boundaries enabled="1">
,您可以读取名为enabled
的属性。调用next_sibling()
后,bound_node
指向<Dimensions .../>
,对first_attribute("enabled")
的调用将返回空指针,因为此xml节点没有具有此名称的属性,随后对value()
的调用将导致程序崩溃。
我不明白为什么要在所有节点上编写循环。如果xml文件看起来像这样
<CityData version="1.0" type="Example">
<Boundaries enabled="1"/>
<Dimensions x-val="1276" y-val="688"/>
</CityData>
然后你可以像这样提取值:
xml_node<> const * bound_node = root_node->first_node("Boundaries");
if (bound_node)
{
xml_attribute<> const * attr_enabled = bound_node->first_attribute("enabled");
if (attr_enabled)
{
int enabled = atoi(attr_enabled->value());
if (enabled == 1)
boundaries = true;
}
}
if (boundaries)
{
xml_node<> const * dimen_node = root_node->first_node("Dimensions");
if (dimen_node)
{
xml_attribute<> const * xval = dimen_node->first_attribute("x-val");
xml_attribute<> const * yval = dimen_node->first_attribute("y-val");
if (xval && yval)
{
cityDim.x = atoi(xval->value());
cityDim.y = atoi(yval->value());
}
}
}
}
当然,您可以编写一些其他条款来表示错误。