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 は何も指しません...
どうすればこの問題を解決できますか???
ありがとうございました...