0

我正在尝试使用RapidXML来解析我的 XML 文件。我按照这里的例子做了。我没有在主函数中进行解析,而是编写了一个名为 XMLParser 的包装类来完成解析工作。这真的让我很头疼。

XMLParser.hpp

#include <iostream>
#include <string>
#include <stdio.h>
#include <vector>
#include "rapidxml/rapidxml.hpp"

using namespace std;
using namespace rapidxml;

class XMLParser {

public:
    XMLParser() {};

    XMLParser(const std::string &xmlString): xmlCharVector(xmlString.begin(), xmlString.end())
    {
        //xmlCharVector.push_back('\0');
         parseXML();
    }
    XMLParser(const std::vector<char> &_xmlVector):xmlCharVector(_xmlVector)
    {
        /* xmlCharVector.push_back('\0'); */  // already done in main.cpp
        if (xmlCharVector != _xmlVector)      //And it turns out they're the same....
            std::cout << "The two vectors are not equal" << std::endl;
        else
            std::cout << "They are the same" << std::endl;
        parseXML();
    }

private:
    std::vector<char> xmlCharVector;
    rapidxml::xml_document<> doc;
    void parseXML();

};

XMLParser.cpp

#include "XMLParser.hpp"

using namespace std;
using namespace rapidxml;

void XMLParser::parseXML()
{
    doc.parse<0>(&xmlCharVector[0]);
}

这是main.cpp:

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <fstream>
#include "XMLParser.hpp"

using namespace std;
using namespace rapidxml;

int main(int argc, char **argv)
{
    xml_document<> doc;
    xml_node<> *root_node;
    ifstream theFile("beer.xml");
    vector<char> buffer((istreambuf_iterator<char>(theFile)), istreambuf_iterator<char>());
    buffer.push_back('\0');

    doc.parse<0>(&buffer[0]);

    root_node = doc.first_node("MyBeerJournal");
    xml_node<> *engine = root_node->first_node("Brewery");

    //The above code works pretty well, and I can get the element I want in XML file.

    //The problem occurs when I tried to use the XMLParser
    XMLParser xmlParser(buffer);
    return 0;
}

main 函数中的解析过程运行良好。但是当我尝试在我的包装类中使用该函数时,出现了parseXML()错误:

在抛出 'rapidxml::parse_error' what() 的实例后调用终止:预期 > 中止(核心转储)

最初我在这个函数中有其他代码,但我把它们都注释了,发现即使是单行doc.parse<0>(&xmlCharVector[0]);. 为什么它在 main.cpp 中运行良好而不在包装类中运行良好?我实在想不通。有人可以帮助我吗?

4

1 回答 1

0

我找到了原因......这个愚蠢的问题真的需要我很长时间才能调试。我在这里写它是为了让任何人遇到它(希望不是)可以节省他的时间。问题恰恰在于函数中的doc.parse<0>(&buffer[0])代码main。在执行这行代码之前,buffer(type of vector<char>)是这样的:(通过将向量打印到控制台)

<MyBeerJournal>
    <Brewery name="Founders Brewing Company" location="Grand Rapids, MI">
        <Beer name="Centennial" description="IPA" rating="A+" dateSampled="01/02/2011">
            "What an excellent IPA. This is the most delicious beer I have ever tasted!"
        </Beer>
    </Brewery>
    .....
    .....
</MyBeerJournal>

与原始 xml 文件相同。执行上面的代码后,buffer(type of vector<char>)变成了这样:

<MyBeerJournal
    <Breweryname"Founders Brewing Company location"Grand Rapids, MI>

        <Beername"Centennial description"IPA rating"A+ dateSampled"01/02/2011>

            "What an excellent IPA. This is the most delicious beer I have ever tasted!"
        /Beer>

    </Brewery>

如您所见,一些天使括号消失了。还有一些其他的东西,比如双引号也被改变了。所以wrapper类的构造函数复制了修改后的“xml buffer”,这个格式不好的xml向量肯定会导致doc.parse<0>(&xmlCharVector[0]);wrapper类中的第二个失败。不知道为什么库编写者需要修改传入的char向量,因为一旦创建了DOC,后续的xml分析就与原来的char向量无关了。

于 2013-08-23T23:18:08.953 回答