我创建了一个C ++应用程序,它使用RapidXML解析器读入XML文件。在一个形状与另一个工作的XML文件完全相同的XML文件中,解析器抛出错误:
“预期<”
错误之前的最后五个字符来自根元素的结束标记,因此错误发生在文件结尾处:
</UW>
我怀疑这个错误与之相关,是一个空白跳过错误是RapidXML v1.12的问题(我正在使用v1.13)。我没有使用解析标志(doc.parse&lt; 0&gt;(bfr);)。
根据this站点,该错误被认为是由于“parse_trim_whitespace”解析标志的错误实现引起的。该网站上提供了一个补丁,但该补丁似乎也存在问题。
以下是导致此错误的XML文档。我还不明白 - 除了错误的原因 - 是为什么错误没有发生解析另一个具有相同时尚内容的文件。我的应用程序还成功解析了该文件之前的其他几个文件。
<?xml version="1.0" encoding="UTF-8"?>
<UW>
<Bez>EV005</Bez>
<Herst>Trumpf</Herst>
<Gesw>16</Gesw>
<Rad>1.6</Rad>
<Hoehe>100</Hoehe>
<Wkl>30</Wkl>
<BgVerf>Freibiegen</BgVerf>
<MaxBel>50</MaxBel>
<Kontur>0</Kontur>
<Grafik>0</Grafik>
</UW>
我的部分申请是错误发生(这是循环内部):
// Get "Bezeichnung" attribute
attr = subnode->first_attribute("Bezeichnung");
if ( !attr ){ err(ERR_FILE_INVALID,"Werkzeuge.xml"); return 0; }
name = attr->value();
// Get file name/URL
string fileName = name;
fileName.append(".xml");
// Open file
ifstream werkzeugFile(concatURL(PFAD_WERKZEUGE,fileName));
if(!werkzeugFile.is_open()) { err(ERR_FILE_NOTFOUND,fileName); return 0; }
// Get length
werkzeugFile.seekg(0,werkzeugFile.end);
int len = werkzeugFile.tellg();
werkzeugFile.seekg(0,werkzeugFile.beg);
// Allocate buffer
char * bfr = new char [len+1];
werkzeugFile.read(bfr,len);
werkzeugFile.close();
// Parse
SetWindowText(hwndProgress,"Parsing data: Werkzeuge/*.xml");
btmDoc.parse<0>(bfr);
// Get type of tool & check validity
xml_node<> *rt_node = btmDoc.first_node();
if ( strcmp(rt_node->name(),"OW") == 0 ){
isOW = true;
}
else if ( strcmp(rt_node->name(),"UW") == 0 ){
isUW = true;
}
else { err(ERR_FILE_INVALID,fileName); return 0; }
// Prepare for next loop iteration
delete[] bfr;
btmDoc.clear();
subnode = subnode->next_sibling();
答案 0 :(得分:0)
首先,ifstream
是可疑的 - 如果你使用字节偏移(其他人在进行解析)中跳过它,是不是应该以二进制模式打开?将std::ios::in | std::ios::binary
作为ifstream
构造函数的第二个参数传递。
其次,你的内存管理似乎很好,除了你额外分配一个字节(+1
)但似乎从来没有使用它。在读入内容后我假设你缺少bfr[len] = '\0';
- 这解释了文件末尾的奇怪解析错误,因为XML解析器不知道它到达了结尾文件 - 它正在解析一个非空终止的空终止字符串,并尝试解析随机字节的内存; - )