2

私は非常に厄介な問題を抱えており、何時間もそれを解決しようとしています. XMLファイルを解析するためにC++でrapidXMLを使用しています:

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 は、取得した配列のコンテンツを変更することを意味する高速な in-situ 解析を行います)。

しかし、私が読んだドキュメントでは、文字列クラスもそれを好きではありません。

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<> 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 に答える
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 に答える