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;
}

メイン関数の解析プロセスは非常にうまく機能します。しかし、ラッパークラスで関数を使用しようとするとparseXML()、エラーが発生しました:

「rapidxml::parse_error」のインスタンスをスローした後に呼び出された終了 what(): expected > Abort (コアダンプ)

もともと、この関数には他のコードがありましたが、それらすべてにコメントを付けたところ、1 行でもそれが見つかりました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>

ご覧のとおり、いくつかのエンジェル ブラケットが消えました。二重引用符のような他のいくつかのものも変更されました。そのため、ラッパー クラス コンストラクターは変更された「xml バッファー」をコピーしました。この適切にフォーマットされていない xml ベクトルはdoc.parse<0>(&xmlCharVector[0]);、ラッパー クラスの 2 番目のベクトルを確実に失敗させます。DOC が作成されると、その後の xml 分析は元の char ベクトルに関連しないため、ライブラリの作成者が渡された char ベクトルを変更する必要がある理由がわかりません。

于 2013-08-23T23:18:08.953 に答える