Я пишу программу для обработки старого набора данных в c ++. Мне уже удалось преобразовать файлы из sgml в xml с помощью инструмента sx от James Clark . Поскольку у меня был опыт использования vtd- xml с Matlab (который основан на java), а vtd- xml имеет порт c ++, я решил использовать его для своего проекта. Я использую vtd- xml версия 2.12 , так как это была самая новая версия порта c ++, которую я смог найти. Мне удалось скомпилировать его с помощью Visual Studio 2019, изменив все вызовы wcsdup на _wcsdup и используя определение препроцессора _CRT_SECURE_NO_WARNINGS . Моя программа, показанная ниже, дает правильный вывод, но она также выдает исключение при разборе файла xml (тестовый файл xml также находится ниже). Исключением является EOFException . Я не вижу ничего явно неправильного в моих xml файлах, и ошибка воспроизводится с помощью теста xml ниже, который я не конвертировал из sgml. Моя интуиция заключается в том, что если бы была ошибка в порте c ++, было бы легче найти информацию о ней, когда Googling for vtd- xml EOFException. Таким образом, мне кажется, что изменения, которые я сделал, чтобы заставить его скомпилировать, скорее всего виновны, но я не могу понять, как избавиться от исключения. Любые идеи будут приветствоваться. Если дело доходит до этого, я готов использовать другую библиотеку xml для моей программы, если она бесплатна.
Мой код:
#include <iostream>
#include <fstream>
#include "VTDGen.h"
#include "autoPilot.h"
#include "customTypes.h"
using namespace std;
using namespace com_ximpleware;
int main() {
ifstream xml(".\\cd_catalog_short.xml", ios::binary | ios::ate);
ifstream::pos_type pos = xml.tellg();
long int length = static_cast<long int>(pos);
char* pChars = new char[length];
xml.seekg(0, ios::beg);
xml.read(pChars, pos);
xml.close();
UCSChar node_path[] = L"/CATALOG/CD/TITLE";
UCSChar* title;
VTDGen vg;
vg.setDoc(pChars, length);
vg.parse(false);
AutoPilot ap;
ap.selectXPath(node_path);
VTDNav* vn = vg.getNav();
ap.bind(vn);
while (ap.evalXPath() != -1) {
int ind = vn->getText();
if (ind != -1) {
title = vn->toNormalizedString(ind);
wcout << title << endl;
delete[] title;
}
}
return 0;
}
Тестовый файл xml:
<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
<CD>
<TITLE>For the good times</TITLE>
<ARTIST>Kenny Rogers</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>Tupelo Honey</TITLE>
<ARTIST>Van Morrison</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1971</YEAR>
</CD>
</CATALOG>
Вывод моей программы:
Исключение, выданное 0x00007FF96A36A839 в em.exe: исключение Microsoft C ++: com_ximpleware :: EOFException в ячейке памяти 0x0000005498B6F350.
Для хороших времен
Большая воля ie стиль
Tupelo Honey
C: \ Users \ Joe \ source \ repos \ em \ x64 \ Release \ em .exe (процесс 16308) завершен с кодом 0.
Чтобы автоматически закрывать консоль при остановке отладки, включите Инструменты-> Параметры-> Отладка-> Автоматически закрывать консоль при остановке отладки.
Нажмите любую клавишу, чтобы закрыть это окно. , .