RapidXML奇怪的parsing

我有一个非常恼人的问题,我试图解决它很多小时。 我正在使用C ++的rapidXML来parsingXML文件:

xml_document<> xmlin; stringstream input; //initialized somewhere else xmlin.clear(); xmlin.parse<0>(&(input.str()[0])); cout << "input:" << input.str() << endl << endl; xml_node<char> *firstnode = xmlin.first_node(); string s_type = firstnode->first_attribute("type")->value(); cout << "type: " << s_type << endl; 

不过,我在标准输出上得到了这个结果:

 input:<?xml version="1.0" encoding="utf-8"?><testxml command="testfunction" type="exclusive" /> type: exclusive" /> 

这可能是什么原因(打印s_typevariables)? 这是非常烦人的,因为我不能很好地处理XML。

其实我找到了解决办法。

当它的内容被修改时,Stringstream不喜欢它(rapidXML做一个快速的原地解析,这意味着它修改它获得的数组的内容)。

然而在文档中,我读到字符串类也不喜欢它。

从字符串:: c_str文档页面:

该数组中的值不应在程序中修改

但是,当我从流中创建一个字符串,它正在按预期工作:

 xml_document<> xmlin; stringstream input; //initialized somewhere else string buffer = input.str() xmlin.clear(); xmlin.parse<0>(&(buffer[0])); 

我认为问题是在你没有显示的代码中…开始尝试这个,使用一个文字字符串 – 这对我来说很好…

 xml_document<> xmlin; char *input = "<?xml version=\"1.0\" encoding=\"utf-8\"?><testxml command=\"testfunction\" type=\"exclusive\" />"; xmlin.parse<0>(input); xml_node<char> *firstnode = xmlin.first_node(); std::string s_type = firstnode->first_attribute("type")->value(); 

我个人会推荐这种方法

  xml_document<> doc; string string_to_parse; char* buffer = new char[str_to_parse.size() + 1]; strcpy (buffer, str_to_parse.c_str()); doc.parse<0>(buffer); delete [] cstr; 

从你想要解析的字符串中创建一个非常量char数组。 我一直觉得这样更安全,更可靠。

我曾经做过如此疯狂的事情

  string string_to_parse; doc.parse<0>(const_cast<char*>(string_to_parse.c_str())); 

并且它“工作”了很长一段时间(直到那天我不需要重用原始字符串)。 由于RapidXML可以修改char数组,因此不建议通过c_str()更改str::string我一直使用将字符串复制到非const char数组并将其传递给解析器的方法。 它可能不是最佳的,并使用额外的内存,但它是可靠的,我从来没有任何错误或问题,迄今为止。 您的数据将被解析,原始字符串可以被重用,而不用担心被修改。