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

艾丽斯特

我的程序中有一个使用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()发生错误时发生。我无法理解该问题,因为循环的代码是从完全未经修改的示例中复制的(除了变量重命名),并且对我来说似乎正确(将其修改为node != NULL)无济于事。

疯狂的科学家

bound_node-loop中,变量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());
          }
        }
    }
  }

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试读取 XML 文档时,节点返回 null

尝试读取XML的节点值时出现XML分析错误

Azure Databricks Spark XML库-尝试读取xml文件

错误:尝试读取结果集时遇到致命错误

尝试读取数据库 C# 错误

尝试读取pcr值时发生TPM错误(7)

尝试读取布尔输入时出现Scanner InputMismatchException错误

尝试读取文件中的信息(C编程)

从API提取文件并进行管道传输会导致我尝试读取文件时找不到文件错误

我尝试读取输入时尝试使用“连接”导致R冻结或崩溃

并行读取AutoCad数据库时出现“尝试读取或写入受保护的内存”错误

尝试读取BigQuery表中的JSON结构时出现错误

我在尝试读取本地JSON文件的python文件中收到MissingSchema错误

春季启动:从罐子读取时尝试读取资源文件夹中的目录内容会产生FileNotFoundException

如果我尝试读取一个不存在的文件会抛出什么异常?

MySqlClient EndOfStreamException:尝试读取流的末尾时发生致命错误

尝试读取或写入受保护的内存的平台调用错误

使用线程池限制最大线程数-尝试读取或写入受保护的内存错误

Django import export:尝试读取文件CSV时遇到错误

尝试读取700k +的数据,并且发生错误“超出了GC开销限制”

尝试读取#NAME时?从Excel到字符串的值给出类型不匹配错误

C-为什么我在尝试读取包含反斜杠的字符时遇到段错误?

为什么在尝试读取不存在的s3键时出现不同的错误

尝试读取 txt 文件时出现 TIC SSL 信任错误

Android Studio-尝试读取zip文件时如何解决内部错误

尝试读取枚举状态时出现C ++枚举错误

Java在尝试读取文本文件时遇到运行时错误

尝试读取字符串错误 Codeigniter 上的属性

初学者尝试读取带R的CSV:字符串中嵌入nul