2012-02-23 7 views
-1

documentation of XmlDocument::parse(Ch*) in RapidXmlを見て、私は文字バッファが '非const'であることに疑問を抱きました。私はバッファがパーサのそのような変更によって成長する必要があるとき、これが一般的にどのように働くのかわからない。図書館は成長しますか?私はそれを解析するよう求めている場合、それはちょうど正しい解析する必要がありますか?それ以外の場合はParseAndPossibleModifyButLetMeKnowIfYouHadToRegrowTheBufferInWhichCaseHeyCheckThisFlagAndCopyThisPointerなどと呼ばれるべきです。RapidXML APIはバッファを拡張できますか?

私に何か不足していますか?私はこのライブラリを理解したいと思っています。なぜなら、C++からXMLファイルを開いて追加/編集するのに使いやすいものがほしいからですが、よりシンプルな/より良い選択肢があれば、は答えとしてそのような提案をすることを躊躇しないでください!

+0

代替案については、[私たちはそれについての質問がある](http://stackoverflow.com/questions/9387610/what-xml-parser-should-i-use-in-c)。 –

答えて

1

RapidXMLは、インプレースパーサであることが最善の方法です。できないときは、必要なときにのみメモリを割り当てます(xml_document<>の存続期間にリンクされています)。 XML読み込みのために文字列が実際に大きくならないことは非常にまれです。

(変更していないフラグを設定しない限り)文字列の内容を変更し、そのオブジェクトはその文字列を参照し続けます。したがって、バッファが十分に長く存続することを確認する必要があります。しかしそれ以外には心配することはあまりありません。

+0

必要なときだけはどういう意味ですか?バッファが増加して実際に新しいアドレスに割り当てられる可能性があるため、古いポインタが無効になる可能性があります。それが起こったとき、rapidXmlは私に新しいバッファへのポインタをどのように与えるのですか? – lurscher

+0

@lurscher:バッファ*は成長できません。しかし、RapidXMLの文字列変換は、場合によっては文字列をその場所よりも大きくしたい場合があります。したがって、その文字列はその場で変更することができないため、その文字列を格納するために* new *メモリを内部的に割り当てます。新しいメモリは 'xml_document <>'に関連付けられています。 –

+0

ああ! okです。たとえば、ドキュメントの最後にいくつかのXMLノードを追加すると、xml_document :: print()は新しいバッファを返すでしょうか?ファイルに直接印刷する方法はありますか? – lurscher

1

Rapidxmlはバッファを拡張する必要はありません。幸運なことに、UTF8でエンコードされたXMLは、文字列の終わりにヌル文字を挿入し、組み込みの文字エンティティを拡張するために、文字列の周りには常に十分なスペースがあります。

唯一の変更は、バッファの内容になります。そのサイズは決してありません。

関連する問題