2

xml 解析の問題に取り組むのに 2 日かかりましたが、まだ終わっていません :)

さて、多くの試行錯誤の末、最終的に Xerces-C を使用して C++ アプリケーションで xml を解析することにしました。

うーん... TinyXml、RapidXml などを試してみました.. Xerces も、メモリ割り当ての観点からノードを管理するときに同じように動作します。

ええと、DOMElement、DOMDocument、DOMNode はすべてプライベート コンストラクト クラスです...解析時に最高のパフォーマンスを確保するためであることはわかっていますが、クラス間のノードを管理しようとすると、非常に悪い結果になります。

この問題があります。xml ドキュメント (必要なすべてのノードを持ち、自由にナビゲートできる DOM オブジェクト) を格納するクラスを作成したいので、文字列 var ではなく DOM obj です。DOMElement/DOMDocument が良いと思います)。さて、このオブジェクトは私のクラスのメンバーです。クラスで関数を使用して、この DOM ツリーを時間の経過とともに成長させたい...内部的にツリーを保持し、必要なときにファイルに出力します。これが私がやりたいことです。奇妙に思えることはわかっていますが、これが私の要件です。私はそうしなければなりません、他のすべての解決策は考慮されるべきではありません...申し訳ありません。(なぜこれが実装なのかを説明する必要がありますが、時間がかかります)。

これをコードで表現すると、次の行は私が達成したいことを表しています。

class MyTree {
public:
    MyTree();
    ^MyTree(); // It is a tilde :)
    // Methods
    void AddToTree(std::string el); // Adds a new node somewhere in the DOM
    std::string GetTree(); // Inserts the tree in a string
private:
    DOMDocument _xmldoc;
};

プライベート コンストラクターによって引き起こされるすべての制限、および XercesDOMParser からのみ DOMDocument を取得でき、ポインターを取得できることを考慮すると、どうすればこれを達成できますか... コンストラクターでそうする場合:

MyTree::MyTree() {
    XercesDOMParser parser;
    parser.parse(XMLString::transcode("<...>...</...>"));
    this->_xmldoc = parser.getDocument();
}

ドキュメントを _xmldoc に割り当てた後、コンストラクター関数はスコープ外になり、パーサーが削除されるため、それが所有するすべてのコンポーネントが含まれるため、私の _xmldoc は何も指しません...

どうすればこの問題を解決できますか???

ありがとうございました...

4

1 に答える 1

2

パーサーを維持する必要があります。引数として (参照によって) 渡すか、MyTree(再び参照として) のメンバーにするか、シングルトン クラスに入れます。

_xmldocポインタである必要があります、ところで。)

于 2011-01-13T13:09:23.623 に答える