7

RapidXMLは、高速で軽量なC ++ XML DOMパーサーですが、いくつかの癖があります。

私の心にこれらの最悪のものはこれです:

3.2文字列の所有権。

RapidXmlによって生成されたノードと属性は、それらの名前と値の文字列を所有していません。それらは単にそれらへのポインタを保持します。xml_base::name(const Ch *)つまり、または xml_base::value(const Ch *)関数を使用してこれらの値を手動で設定する場合は注意が必要です。

渡される文字列の存続期間が少なくともノード/属性の存続期間と同じになるように注意する必要があります。これを実現する最も簡単な方法は、ドキュメントが所有するmemory_poolから文字列を割り当てることです。memory_pool::allocate_string() この目的のために関数を使用 してください。

今、私はそれがスピードのためにこのように行われていることを理解しています、しかしこれは自動車事故が起こるのを待っているように感じます。次のコードは無害に見えますが、fooが戻ると、「name」と「value」はスコープ外であるため、ドキュメントは未定義です。

void foo()
{
  char name[]="Name";
  char value[]="Value";

  doc.append_node(doc.allocate_node(node_element, name, value));
}

手動で使用するという提案はallocate_string()機能しますが、忘れがちです。

この問題を回避するためにRapidXMLを「拡張」した人はいますか?

4

1 に答える 1

1

私は RapidXML を使用していませんが、私のアプローチで問題を解決できるかもしれません。

私は Xerces を使い始めましたが、他のマイナーな煩わしさに加えて、重いことがわかったので、CPPDOM に移行しました。移動を行ったとき、コードが特定の XML「エンジン」に依存せず、必要に応じて別のエンジンに移植できるように、一連のラッパー クラスを作成することにしました。

基本的な DOM エンティティ (ノード、ドキュメントなど) を表す独自のクラスを作成しました。これらのクラスは、内部的に pimpl イディオムを使用して CPPDOM オブジェクトを使用します。私のノード オブジェクトには (CPPDOM からの) 「実際の」ノード オブジェクトが含まれているため、必要に応じて何でも管理できるため、文字列の適切な割り当てと割り当て解除は問題になりません。

私のコードは CPPDOM 用であるため、あまり役に立たないと思いますが、必要に応じて投稿できます。

ところで、すでに RapidXML を使用しているコードが多すぎる場合は、ラッパー クラスでそのインターフェイスを再現できます。Xerces を使用したコードはそれほど長くなく、とにかく書き直さなければならないので、私はそれをしませんでした。

于 2010-04-23T01:07:11.260 に答える