Строка синтаксического анализа ошибки компиляции RapidXML

У меня возникли проблемы с использованием 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 поставляется в виде четырех заголовочных файлов:

  1. Rapidxml_iterators.hpp
  2. Rapidxml_print.hpp ‹ — содержит ошибки, но сборка с ними выполнена успешно
  3. Rapidxml_utils.hpp ‹ — содержит ошибки, но сборка с ними выполнена успешно.
  4. Rapidxml.hpp ‹ -- связан программой, содержит функцию разбора

Как мне устранить ошибку в моем коде, и нужно ли мне сначала как-то разрешить ошибки компилятора в заголовках?


person stephenwebber    schedule 22.07.2012    source источник


Ответы (2)


Проблема в том, что char*, возвращаемый вызовом c_str() для 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

Я не пытался скомпилировать приведенное выше, поэтому могут быть ошибки, дело в том, что c_str() возвращает const char*, а parse() должен принимать неконстантный char*. Надеюсь это поможет. Что касается ваших заголовков, я обычно использую только

 rapidxml.hpp
 rapidxml_print.hpp

включены в мои исходные файлы. У вас нет проблем с компоновщиком, потому что RapidXML - это только реализация заголовка (что, на мой взгляд, делает его приятным).

person mathematician1975    schedule 27.07.2012
comment
Спасибо за это! Это сводило меня с ума! - person stephenwebber; 01.08.2012
comment
в качестве альтернативы вы можете избежать копирования, вызвав синтаксический анализ указателя на первый член строки. doc.parse<0>(&str[0]); - person Hydranix; 02.12.2016
comment
@Hydranix Я пробовал ваш метод, но он не сработал. Я все еще пытаюсь найти способ разобрать строку без дублирования памяти путем копирования строки в массив символов. Я опубликую ответ здесь, если я его найду. - person Jaime Ivan Cervantes; 22.05.2017
comment
@Jaime Под «не сработало» вы имеете в виду, что он скопировал строку или вообще не анализировал? Используя gcc 6.3.1, я могу успешно разобрать массив std::strings xml. - person Hydranix; 28.05.2017

Как отметил @Hydranix в комментариях,

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

работает отлично. Я проанализировал несколько больших файлов xml, используя его.

person anmol porwal    schedule 30.07.2020