【发布时间】:2012-09-17 13:34:32
【问题描述】:
我正在尝试解析一个 xml 文件:
<?xml version="1.0"?>
<settings>
<output>test.dat</output>
<width>5</width>
<depth>4</depth>
<height>10</height>
</settings>
主要:
int _tmain(int argc, wchar_t* argv[])
{
std::string SettingsFile = "settings.xml";
rapidxml::xml_document<> doc;
char* settings = FileHandler::readFileInChar(SettingsFile.c_str());
std::cout << strlen(settings); // Output 1
doc.parse<0 | rapidxml::parse_no_data_nodes>(settings);
std::cout << strlen(settings); // Output 2
....
}
输出1:129
输出 2:31
辅助函数:
static char* readFileInChar(const char* p_pccFile)
{
char* cpBuffer;
size_t sSize;
std::ifstream ifFileToRead;
ifFileToRead.open(p_pccFile, std::ios::binary);
if(ifFileToRead.is_open()) {
sSize = getFileLength(&ifFileToRead);
cpBuffer = new char[sSize+1];
ifFileToRead.read(cpBuffer, sSize);
ifFileToRead.close();
}
cpBuffer[sSize] = '\0';
return cpBuffer;
}
static size_t getFileLength(std::ifstream* file)
{
file->seekg(0, std::ios::end);
size_t length = file->tellg();
file->seekg(0, std::ios::beg);
return length;
}
当我尝试访问任何节点时,这会导致异常。我想我在这里遗漏了一些明显的东西,但到目前为止我还不明白。
如果我尝试类似:
std::cout << doc.first_node("output")->value();
我在读取位置 0x00000004 时收到访问冲突的消息。
【问题讨论】:
-
您的问题到底是什么? IIRC,rapidxml-parsing 对传递的 char * 进行“破坏性”读取,因此它可以很好地在内部某处插入“\0”(我猜在“test.dat”的“t”之后,在“5”之后, “10”中的“4”和“0”。)
-
你能展示你用来访问节点的代码吗?你得到什么例外? rapidxml::parse_error 异常?