4

RapidXMLを使用して文字列を解析するのに問題がありました。Eclipse内から、解析関数が存在しないというエラーを受け取りました。

make all 
Building file: ../search.cpp
Invoking: Cross G++ Compiler
g++ -DDEBUG -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"search.d" -MT"search.d" -o "search.o" "../search.cpp"
../search.cpp: In function ‘void search(CURL*, CURLcode, std::string, std::string)’:
../search.cpp:29:27: error: no matching function for call to ‘rapidxml::xml_document<>::parse(const char*)’
../search.cpp:29:27: note: candidate is:
../rapidxml-1.13/rapidxml.hpp:1381:14: note: template<int Flags> void rapidxml::xml_document::parse(Ch*) [with int Flags = Flags, Ch = char]
make: *** [search.o] Error 1

次のコードはエラーを発生させます:

rapidxml::xml_document<> doc;    // This has no errors
doc.parse<0>(data.c_str());      // This line raises the error (data is a string)

参考までに、オンラインドキュメントをご覧ください:http: //rapidxml.sourceforge.net/manual.html#namespacerapidxml_1parsing

RapidXMLは、次の4つのヘッダーファイルとして提供されます。

  1. Rapidxml_iterators.hpp
  2. Rapidxml_print.hpp <-エラーが含まれていますが、ビルドはエラーで成功しています
  3. Rapidxml_utils.hpp <-エラーが含まれていますが、ビルドは成功しています
  4. Rapidxml.hpp <-プログラムによってリンクされ、解析関数が含まれています

コードのエラーを解決するにはどうすればよいですか?最初に、ヘッダーのコンパイラエラーを何らかの方法で解決する必要がありますか?

4

2 に答える 2

5

問題は、aのchar*呼び出しから返されるのが実際にはaであり、これは解析関数には適していません(解析により、rapidXMLで解析する文字列が実際に変更されます)。これは、文字列を解析する前に文字列をコピーする必要があることを意味しますc_str()std::stringconst char*

  xml_document<> doc;
  string str;                             // String you want to parse
  char* cstr = new char[str.size() + 1];  // Create char buffer to store string copy
  strcpy (cstr, str.c_str());             // Copy string into char buffer

  doc.parse<0>(cstr);                     // Pass the non-const char* to parse()

  // Do stuff with parsing

  delete [] cstr;                         // free buffer memory when all is finished

私は上記をコンパイルしようとはしなかったので、エラーが発生する可能性があります。要点は、をc_str()返し、非constを取る必要があるということconst char*です。お役に立てれば。あなたのヘッダーに関しては、私は通常、使用するだけで逃げますparse()char*

 rapidxml.hpp
 rapidxml_print.hpp

私のソースファイルに含まれています。RapidXMLはヘッダーのみの実装であるため、リンカーの問題はありません(これは私の意見では素晴らしいことです)。

于 2012-07-27T14:59:20.417 に答える
0

@Hydranixがコメントで指摘したように、

doc.parse<0>(&str[0]); 

完全にうまく機能します。私はそれを使用していくつかの大きなxmlファイルを解析しました。

于 2020-07-30T13:56:32.107 に答える