RapidXML:“预期<”与空白错误相关的文件结尾错误?

时间:2014-05-26 18:38:57

标签: c++ xml parsing rapidxml

我创建了一个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();

1 个答案:

答案 0 :(得分:0)

啊,我想我明白了。两件事:

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

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