Строка разбора ошибки компиляции RapidXML
У меня возникли некоторые проблемы с использованием RapidXML для анализа строки. В Eclipse я получаю сообщение о том, что функция parse не существует.
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
RapidXML поставляется в виде четырех заголовочных файлов:
- rapidxml_iterators.hpp
- rapidxml_print.hpp <- содержит ошибки, но с ними сборка прошла успешно
- rapidxml_utils.hpp <- содержит ошибки, но с ними сборка прошла успешно
- rapidxml.hpp <- связан с программой, содержит функцию разбора
Как устранить ошибку в моем коде и нужно ли мне сначала как-то устранять ошибки компилятора в заголовках?
1 ответ
Проблема в том, что 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 является реализацией только для заголовков (что, на мой взгляд, приятно).
Как отметил @Hydranix в комментариях,
doc.parse<0>(&str[0]);
работает отлично. С его помощью я проанализировал несколько больших файлов xml.