使用子函数时,rapidxml解析错误行为

时间:2017-09-19 12:23:13

标签: c++ rapidxml

大家好!我使用rapidxml来解析我的设置文件。当我在一个功能中做所有事情时,它运作良好。但是当我尝试添加一些函数来完成工作时,它总是给出std :: exception。有谁知道原因? 一个简单的代码示例是

#include <stdexcept>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include "rapidxml.hpp"

struct MyConfig{
    bool LES_FLAG, ITP_FLAG;
    int calcCase, dataInterval, maxIter;
    double va, lesCoef, eigenLength, Re;
    double xLow, xUp, yLow, yUp, maxTime;
}config;
void readConfig(const char* fileName);
void parseFlag(rapidxml::xml_node<> *node, char *flagName, bool &flag, int namesize=0);
void parseFloat(rapidxml::xml_node<> *node, char *name, double &variable, int namesize=0);
void parseInt(rapidxml::xml_node<> *node, char *name, int &variable, int namesize=0);
void parseString(rapidxml::xml_node<> *node, char *name, std::string &str, int namesize=0);

int main(int argn, char** argv){
  try{
    readConfig("test.xml");
  }
  catch (std::exception e)
  {
    std::cout << e.what() << std::endl;
  }
}
void readConfig(const char* fileName){
  std::ifstream myfile(fileName);
  if (!myfile.is_open())
    throw std::runtime_error("Can not open the configuration file!\n");
  std::stringstream buffer;
  buffer << myfile.rdbuf();
  myfile.close();

  try{
    rapidxml::xml_document<> doc;
    doc.parse<0>(&buffer.str()[0]);
    rapidxml::xml_node<> *rNode = doc.first_node("Config_2DVPM");

    rapidxml::xml_node<> *cnode = rNode->first_node("flags",5,false);
    parseFlag(cnode, "LES_FLAG", config.LES_FLAG);
    parseFlag(cnode, "ITP_FLAG", config.ITP_FLAG);

    cnode = rNode->first_node("float",5,false);
    cnode = rNode->first_node("float",5,false);
    parseFloat(cnode, "va", config.va, 2);
    parseFloat(cnode, "lesCoef", config.lesCoef, 7);
    parseFloat(cnode, "eigenLength", config.eigenLength, 11);
    parseFloat(cnode, "Re", config.Re, 2);
    parseFloat(cnode, "xLow", config.xLow, 4);
    parseFloat(cnode, "xUp", config.xUp, 3);
    parseFloat(cnode, "yLow", config.yLow, 4);
    parseFloat(cnode, "yUp", config.yUp, 3);
    parseFloat(cnode, "maxTime", config.maxTime, 7);

    cnode = rNode->first_node("int",3,false);
    parseInt(cnode, "calcCase", config.calcCase);
    parseInt(cnode, "dataInterval", config.dataInterval);
    parseInt(cnode, "maxIter", config.maxIter);
  }
  catch (rapidxml::parse_error& e)
  {
    std::string ss = std::string("xml parse error: ") + e.what();
    throw std::runtime_error(ss);
  }
}

void parseFlag(rapidxml::xml_node<> *node, char* name, bool &flag, int namesize)
{
  char *str = node->first_attribute(name, namesize, false)->value();
  if (str == NULL)
  {
    std::string ss = std::string("Undefined attribute in flags: ") + name;
    throw std::runtime_error(ss);
  }
  if (strcmp(str, "1") == 0 || strcmp(str, "true") == 0 || strcmp(str, "True") == 0)
    flag = true;
  else flag = false;
}

void parseFloat(rapidxml::xml_node<> *node, char* name,
    double &variable, int namesize)
{
  char* str = node->first_attribute(name, namesize, false)->value();
  if (*str == '\0')
  {
    std::string ss = std::string("Undefined attribute in float: ") + name;
    throw std::runtime_error(ss);
  }
  std::stringstream ss(str);
  ss >> variable;
}
void parseInt(rapidxml::xml_node<> *node, char* name,
    int &variable, int namesize)
  {
  char *str = node->first_attribute(name, namesize, false)->value();
  if (*str == '\0')
  {
    std::string ss = std::string("Undefined attribute in int: ") + name;
    throw std::runtime_error(ss);
  }
  std::stringstream ss(str);
  ss >> variable;
}

void Calculation::parseString(rapidxml::xml_node<> *node, char* name,
    std::string &res, int namesize)
  {
  char *str = node->first_attribute(name, namesize, false)->value();
  if (*str == '\0')
  {
    std::string ss = std::string("Undefined attribute in int: ") + name;
    throw std::runtime_error(ss);
  }
  res = str;
}

示例文件text.xml是

<?xml version="1.0" encoding="UTF-8"?>
<Config_2DVPM version="1.0">
    <flags LES_FLAG="true" ITP_FLAG="false"/>
    <float va="1.0" lesCoef="0.15" eigenLength="1.0" Re="500" maxTime="15" 
    xLow="-1" xUp="5" yLow="-1" yUp="1"/>
    <int calcCase="0" dataInterval="200" maxIter="100000"/>
    <string test="haha"/>
</Config_2DVPM>

代码总是给出输出std :: exception。经过一些检查后,当我解析属性“eingenLength”时,问题总会发生。

0 个答案:

没有答案
相关问题