RapidXML编译错误解析字符串

ste*_*ber 3 c++ string rapidxml xml-parsing

我在使用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
Run Code Online (Sandbox Code Playgroud)

以下代码引发错误:

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

这里是参考在线文档:http: //rapidxml.sourceforge.net/manual.html#namespacerapidxml_1parsing

RapidXML有四个头文件:

  1. rapidxml_iterators.hpp
  2. rapidxml_print.hpp < - 包含错误,但使用它们构建成功
  3. rapidxml_utils.hpp < - 包含错误,但使用它们构建成功
  4. rapidxml.hpp < - 由程序链接,包含解析函数

如何解决代码中的错误,我是否首先需要这样解决标题中的编译器错误?

mat*_*975 5

问题是char*从调用c_str()a 返回的std::string实际上是一个const char*对解析函数没有好处的东西(解析实际上改变了它在rapidXML中解析的字符串).这意味着我们需要在解析之前复制字符串

  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
Run Code Online (Sandbox Code Playgroud)

我没有尝试编译上面所以可能有错误,重点是c_str()返回a const char*并且parse()必须采用非const char*.希望这可以帮助.至于你的标题,我通常只使用

 rapidxml.hpp
 rapidxml_print.hpp
Run Code Online (Sandbox Code Playgroud)

包含在我的源文件中.您没有链接器问题,因为RapidXML只是标头实现(在我看来这很好).

  • 或者,您可以通过在指向字符串第一个成员的指针上调用 parse 来避免复制。`doc.parse&lt;0&gt;(&amp;str[0]);` (2认同)