【发布时间】:2020-02-09 04:24:42
【问题描述】:
我正在编写一个程序来处理 c++ 中的旧dataset。我已经设法使用sx tool from James Clark 将文件从sgml 转换为xml。由于我过去有使用 Matlab(基于 java)的 vtd-xml 的经验,并且由于 vtd-xml 有一个 c++ 端口,所以我决定将它用于我的项目。我正在使用vtd-xml version 2.12,因为那是我能找到的最新版本的 c++ 端口。我通过更改 wcsdup to _wcsdup 的所有调用并使用 _CRT_SECURE_NO_WARNINGS 预处理器定义,设法使用 Visual Studio 2019 编译它。我下面的程序似乎给出了正确的输出,但它在解析 xml 文件期间也会引发异常(下面还有一个测试 xml 文件)。例外是EOFException。我没有看到我的 xml 文件有任何明显错误,并且该错误通过下面的测试 xml 重现,这不是我从 sgml 转换的。我的直觉是,如果 c++ 端口中存在错误,那么在谷歌搜索 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>
我的程序输出:
在 em.exe 中的 0x00007FF96A36A839 处引发异常:Microsoft C++ 异常:com_ximpleware::EOFException 在内存位置 0x0000005498B6F350。
为了美好的时光
大威利风格
图珀洛蜂蜜
C:\Users\Joe\source\repos\em\x64\Release\em.exe(进程 16308)以代码 0 退出。
要在调试停止时自动关闭控制台,启用工具->选项->调试->在调试停止时自动关闭控制台。
按任意键关闭此窗口。 . .
【问题讨论】:
标签: c++ visual-studio vtd-xml