gpt4 book ai didi

c++ - RapidXML: "expected <"文件末尾错误与空白错误相关?

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:55 24 4
gpt4 key购买 nike

我创建了一个 C++ 应用程序,它使用 RapidXML 解析器读取 XML 文件。在一个 XML 文件的形状与另一个有效的文件完全相同的情况下,解析器抛出错误:

"expected <"

错误前的最后五个字符来自根元素的结束标记,因此错误发生在文件末尾:

</UW>

我怀疑这个错误与 RapidXML v1.12(我使用的是 v1.13)的一个空白跳过错误有关。我没有使用解析标志 (doc.parse<0>(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();

最佳答案

啊,我想我看到了。两件事:

首先,ifstream 是可疑的——如果您使用字节偏移在其中跳来跳去(而其他人正在执行解析),它不应该以二进制模式打开吗?通过std::ios::in | std::ios::binary 作为 ifstream 构造函数的第二个参数。

其次,您的内存管理似乎很好,只是您额外分配了一个字节(+1)但似乎从未使用过它。我假设您在读入内容后丢失了 bfr[len] = '\0'; - 这解释了文件末尾的奇怪解析错误,因为 XML 解析器不知道它到达了文件的末尾——它正在解析一个没有以 null 结尾的以 null 结尾的字符串,并尝试解析内存的随机字节 ;-)

关于c++ - RapidXML: "expected <"文件末尾错误与空白错误相关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23875995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com