2

我有一个非常烦人的问题,我试图解决它很多小时。我使用 rapidXML 和 C++ 来解析 XML 文件:

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_type 变量)?这很烦人,因为我不能很好地处理 xml。

4

3 回答 3

1

其实我找到了解决办法。

Stringstream 不喜欢它的内容被修改(rapidXML 进行快速原位解析,这意味着它修改了它获得的数组的内容)。

但是,在文档中,我读到该字符串类也不喜欢它。

从 string::c_str 文档页面:

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

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

xml_document<> xmlin;
stringstream input; //initialized somewhere else
string buffer = input.str()

xmlin.clear();
xmlin.parse<0>(&(buffer[0]));
于 2012-08-02T09:10:53.837 回答
0

我个人会推荐这种方法

 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 数组,并且由于不建议通过更改str::stringc_str()我一直使用将我的字符串复制到非 const char 数组并将其传递给解析器的方法。它可能不是最佳的并且使用额外的内存,但它是可靠的,迄今为止我从未遇到任何错误或问题。您的数据将被解析,并且可以重复使用原始字符串,而不必担心它已被修改。

于 2012-08-10T08:16:13.567 回答
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();
于 2012-08-01T22:47:23.317 回答