С++ Использование анализа RapidXml XML файла, класса Wrapper, parse_error ожидать>

Я пытаюсь использовать RapidXML для анализа моего XML файла. И я сделал это, следуя примеру здесь. Вместо того, чтобы выполнять синтаксический анализ в основной функции, я написал класс оболочки, называемый XMLParser, для выполнения задания синтаксического анализа. И это действительно дает мне головную боль.

XMLParser.hpp:

#include <iostream>
#include <string>
#include <stdio.h>
#include <vector>
#include "rapidxml/rapidxml.hpp"
using namespace std;
using namespace rapidxml;
class XMLParser {
public: XMLParser() {}; XMLParser(const std::string &xmlString): xmlCharVector(xmlString.begin(), xmlString.end()) { //xmlCharVector.push_back('\0'); parseXML(); } XMLParser(const std::vector<char> &_xmlVector):xmlCharVector(_xmlVector) { /* xmlCharVector.push_back('\0'); */ // already done in main.cpp if (xmlCharVector != _xmlVector) //And it turns out they're the same.... std::cout << "The two vectors are not equal" << std::endl; else std::cout << "They are the same" << std::endl; parseXML(); }
private: std::vector<char> xmlCharVector; rapidxml::xml_document<> doc; void parseXML();
};
</char></char></vector></stdio.h></string></iostream>

XMLParser.cpp:

#include "XMLParser.hpp"
using namespace std;
using namespace rapidxml;
void XMLParser::parseXML()
{ doc.parse<0>(&xmlCharVector[0]);
}

И вот main.cpp:

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <fstream>
#include "XMLParser.hpp"
using namespace std;
using namespace rapidxml;
int main(int argc, char **argv)
{ xml_document<> doc; xml_node<> *root_node; ifstream theFile("beer.xml"); vector<char> buffer((istreambuf_iterator<char>(theFile)), istreambuf_iterator<char>()); buffer.push_back('\0'); doc.parse<0>(&buffer[0]); root_node = doc.first_node("MyBeerJournal"); xml_node<> *engine = root_node->first_node("Brewery"); //The above code works pretty well, and I can get the element I want in XML file. //The problem occurs when I tried to use the XMLParser XMLParser xmlParser(buffer); return 0;
}
</char></char></char></fstream></vector></string></stdio.h></iostream>

Процесс разбора в основной функции работает очень хорошо. Но когда я попытался использовать функцию в моем классе- parseXML(), parseXML() ошибка:

terminate call после вызова экземпляра "rapidxml :: parse_error" what(): expected> Abort (core dumped)

Первоначально у меня есть другой код в этой функции, но я прокомментировал их все и обнаружил, что даже с одной строкой doc.parse<0>(&xmlCharVector[0]); , Почему он хорошо работает в main.cpp, а не в классе-оболочке? Я действительно не могу понять это. Может ли кто-нибудь помочь мне?

1 ответ

Я выяснил причину... Эта глупая проблема на самом деле требует много времени для отладки. Я пишу это здесь, чтобы кто-нибудь наткнулся на него (надеюсь, что нет) может сэкономить свое время. Проблема заключается именно в коде doc.parse<0>(&buffer[0]) в main функции. Перед выполнением этой строки кода buffer(type of vector<char>)</char> выглядит следующим образом: (путем печати вектора на консоль)

<mybeerjournal> <brewery name="Founders Brewing Company" location="Grand Rapids, MI"> <beer name="Centennial" description="IPA" rating="A+" datesampled="01/02/2011"> "What an excellent IPA. This is the most delicious beer I have ever tasted!" </beer> </brewery> ..... .....
</mybeerjournal>

Это то же самое с оригинальным файлом xml. После выполнения вышеуказанного кода buffer(type of vector<char>)</char> становится примерно таким:

<mybeerjournal <breweryname"founders="" brewing="" company="" location"grand="" rapids,="" mi=""> <beername"centennial 2011="" description"ipa="" rating"a+="" datesampled"01="" 02=""> "What an excellent IPA. This is the most delicious beer I have ever tasted!" /Beer>
</beername"centennial></mybeerjournal>

Как видите, некоторые ангельские скобки исчезли. и некоторые другие вещи, такие как двойная кавычка, также были изменены. Таким образом, конструктор класса-оболочки скопировал измененный "xml-буфер", и этот не совсем отформатированный вектор xml, безусловно, вызовет второй doc.parse<0>(&xmlCharVector[0]); в классе обертки. Я не знаю, почему библиотечный писатель должен изменить переданный вектор char, потому что последующий анализ xml не имеет отношения к исходному символу char после создания DOC.

licensed under cc by-sa 3.0 with attribution.