2011-01-13 7 views
2

それは私がXML解析の問題に苦労するための2日間となっており、それはまだ、まだ完了していない:)DOM要素のメモリ割り当て管理のXerces-C

をまあ、多くのtrils後、私は最終的にXercesのを使用することにしました-C++アプリケーションでxmlを解析する-C。

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

DOMElement、DOMDocument、DOMNode teyはすべてprivateのコンストラクトクラスです...これは解析時のパフォーマンスを最大限に引き出すためのものですが、クラス間でノードを管理しようとすると実際には悪いことになります。

この問題があります。 XML文書を格納するクラスを作成したいと思います。すべてのノードがあり、自由にナビゲートできるDOMオブジェクトです。文字列varではなくDOMオブジェクトです.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する割り当てた後、コンストラクタ関数がスコープの外に出ると、パーサーが削除され、そう、ev私の_xmldocは何も指しません...

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

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

答えて

2

あなたはパーサーを守る必要があります。引数として渡すか(参照によって)、それをMyTreeのメンバにするか(参照として)、またはシングルトンクラスに配置します。

_xmldocがところで、ポインタでなければなりません。)

+0

はい、私はパーサを維持することを選んだと私は、これが続行するための正しい方法であるためには確認されませんでした...しかし、あなたはそう言うならば...有難う御座います。 – Andry

+0

これは残念なことに、唯一の方法です。私はこれまでにこのライブラリのデザインに驚いています。 –