Неверное поведение при разборе quickXML

Я пытаюсь разобрать файл XML:

<?xml version="1.0"?>
<settings>
<output>test.dat</output>
<width>5</width>
<depth>4</depth>
<height>10</height>
</settings>

главный:

int _tmain(int argc, wchar_t* argv[])
{
std::string SettingsFile = "settings.xml";
rapidxml::xml_document<> doc;
char* settings = FileHandler::readFileInChar(SettingsFile.c_str());

std::cout << strlen(settings); // Output 1
doc.parse<0 | rapidxml::parse_no_data_nodes>(settings);
std::cout << strlen(settings); // Output 2

....
}

Выход 1: 129

Выход2: 31

вспомогательные функции:

static char* readFileInChar(const char* p_pccFile)
{
char* cpBuffer;
size_t sSize;

std::ifstream ifFileToRead;
ifFileToRead.open(p_pccFile, std::ios::binary);

if(ifFileToRead.is_open()) {
sSize = getFileLength(&ifFileToRead);

cpBuffer = new char[sSize+1];
ifFileToRead.read(cpBuffer, sSize);
ifFileToRead.close();
}

cpBuffer[sSize] = '\0';

return cpBuffer;
}

static size_t getFileLength(std::ifstream* file)
{
file->seekg(0, std::ios::end);
size_t length = file->tellg();
file->seekg(0, std::ios::beg);

return length;
}

Это приводит к исключениям, когда я пытаюсь получить доступ к любым узлам. Я предполагаю, что упускаю что-то очевидное здесь, но пока я не понимаю.

Если я попробую что-то вроде:

std::cout << doc.first_node("output")->value();

Я получаю сообщение о том, что при чтении позиции 0x00000004 произошло нарушение доступа.

0

Решение

В документе нет узла с именем «output». В документе есть узел с именем «settings», который, в свою очередь, имеет узел с именем «output». Следующий код

  std::ifstream file("settings.xml");
std::vector<char> content = std::vector<char>(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
content.push_back('\0');

rapidxml::xml_document<> doc;
doc.parse<0 | rapidxml::parse_no_data_nodes>(&content[0]);

rapidxml::xml_node<> * root = doc.first_node();
for (rapidxml::xml_node<> * node = root->first_node(); node; node = node->next_sibling())
{
std::cout << "value of <" << node->name() << "> is " << node->value() << std::endl;
}

печать

value of <output> is test.dat
value of <width> is 5
value of <depth> is 4
value of <height> is 10

на моей машине.

Изменить: Если вы посмотрите на «содержимое» в отладчике, вы можете четко увидеть, где rapidxml вставляет в него «\ 0».

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]