尝试读取Rapid XML中的节点会导致错误

时间:2014-08-12 02:28:53

标签: c++ xml rapidxml

我的程序中有一个类,它使用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)没有帮助。

1 个答案:

答案 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());
          }
        }
    }
  }

当然,您可以编写一些其他条款来表示错误。