web-dev-qa-db-ja.com

C ++に最適なオープンXMLパーサーは何ですか?

私は自分のC++プロジェクトで使用するための、シンプルでクリーンで正しいXMLパーサーを探しています。私は自分のものを書くべきですか?

239
whaledawg

RapidXML はどうですか。 RapidXMLは、C++で書かれた非常に高速で小さなXML DOMパーサーです。これは主に、組み込み環境、コンピュータゲーム、または使用可能なメモリまたはCPUの処理能力が重視されるその他のアプリケーションを対象としています。 RapidXMLはBoost Software Licenseの下でライセンスされており、そのソースコードは自由に入手可能です。

特長

  • 同じデータに対して実行されるstrlen関数の速度に近づく解析速度(DOMツリー構築を含む)。
  • 最新のCPU(2008年現在)では、パーサーのスループットは毎秒約10億文字です。オンラインマニュアルのパフォーマンスセクションを参照してください。
  • コードの小さなメモリ使用量とDOMツリーの作成.
  • ヘッダーのみの実装、統合プロセスを単純化します。
  • 一切の義務を負うことなく、営利目的および非営利目的の両方を問わず、ほぼあらゆる目的で使用することを許可する簡単なライセンス。
  • UTF-8および部分的にUTF-16、UTF-32のエンコーディングをサポートします。
  • C++標準ライブラリの非常に小さなサブセット以外に依存関係のない移植可能なソースコード。
  • このサブセットは非常に小さいので、標準ライブラリの使用が望ましくない場合は手動で簡単にエミュレートできます。

制限事項

  • パーサーはDOCTYPE宣言を無視します。
  • XML名前空間はサポートされていません。
  • パーサーは文字の有効性をチェックしません。
  • パーサーのインターフェースがDOM仕様に準拠していません。
  • パーサーは属性の一意性をチェックしません。

出典: wikipedia.org://Rapidxml


あなたの用途に応じて、XMLデータバインディングを使うことができますか? CodeSynthesis XSD はコード合成によって開発され、GNUの下でデュアルライセンスされているC++用のXMLデータバインディングコンパイラです。 GPLと独自のライセンスXMLインスタンス仕様(XMLスキーマ)を指定すると、構文解析および直列化コードと同様に、与えられた語彙を表すC++クラスを生成します。

CodeSynthesis XSDのユニークな機能の1つは、インメモリC++/Treeとストリーム指向C++/Parserの2つの異なるXMLスキーマからC++へのマッピングのサポートです。 C++/Treeマッピングは、ツリーのようなインメモリデータ構造を持つ伝統的なマッピングです。 C++/Parserは、XMLインスタンス文書に格納されている情報を語彙固有の解析イベントの階層として表す、SAXに似た新しいマッピングです。 C++/Treeと比較して、C++/Parserマッピングは、メモリに収まらない大きなXML文書の処理、ストリーム指向の処理の実行、または既存のメモリ内表現の使用を可能にします。

出典: wikipedia.org://CodeSynthesis XSD

118
jk.

pugixml - C++用の軽量でシンプルで高速なXMLパーサー非常に小さい(RapidXMLに相当)、非常に速い(RapidXMLに相当)、非常に使いやすい( RapidXMLより優れています。

97
Zbyl

TinyXMLを試してください。

http://sourceforge.net/projects/tinyxml

40
Rob

TiCPP はTinyXMLの "もっとc ++"版です。

'TiCPP'は正式名称TinyXML ++の短縮形です。これはTinyXML( http://www.grinninglizard.com/tinyxml/ )へのまったく新しいインタフェースで、C++の長所の多くを使用します。テンプレート、例外、そしてはるかに優れたエラー処理。それはまたdoxygenに完全に文書化されています。このバージョンでは、以前とまったく同じ方法でインターフェースを作成したり、新しい 'ticpp'クラスを使用したりすることができます。あなたがする必要があるのはTIXML_USE_TICPPを定義することだけです。 VC 6.0、VC 7.0、VC 7.1、VC 8.0、MinGW gcc 3.4.5、およびLinuxでテストされています。 GNU gcc 3+

16
Kasprzol

これを試してみてください。 http://www.applied-mathematics.net/tools/xmlParser.html
RapidXMLやPUGXMLよりも簡単で速いです。
TinyXMLは「単純なパーサー」の最悪のものです。

14
Kat

効率性やメモリ管理が気になる場合はTinyXMLを使用しないでください(たくさんの小さなブロックを割り当てる)。私の個人的なお気に入りは RapidXML です。

12
yrp

gSOAP はどうですか。それはオープンソースであり、GPLライセンスの下で自由に利用可能です。その名前にもかかわらず、gSOAPツールキットは一般的なXMLデータバインディングツールであり、CとC++のデータを自動的にXMLにバインドすることを可能にします。 XMLパーサーAPIを使用する必要はありません。データをXML形式で読み書きできるようにするだけです。あなたが本当に非常に単純なC++ XMLパーサーを本当に必要とするならば、gSOAPはやり過ぎかもしれません。しかし、gSOAPが2001年に導入されて以来、多くの産業用アプリケーションについての証言が示すように、それ以外のすべてについてはうまくいっています。

これが機能の簡単なリストです。

  • ポータブル:Windows、Linux、Mac OS X、Unix、VxWorks、Symbian、Palm OS、WinCEなど.
  • 小さなフットプリント:XML Webサービスクライアントアプリケーションを実装するための73KBコードと2K未満のデータ(メモリ使用量を制限するためのDOMなし)。
  • 速い:他のツールが主張するものを信じていない、本当の速度は測定されるべきですwith I/O。 gSOAPの場合、TCP/IP上で3000往復のXMLメッセージです。 XMLの構文解析のオーバーヘッドは、(非)直列化が行われている間の入出力の単純な線形スキャンであるため、ごくわずかです。
  • XMLサポート:XMLスキーマ(XSD)インポート/エクスポート、WSDLインポート/エクスポート、XML名前空間、XML正規化、XML付き添付ファイル(MIME)、オプションのDOMの使用、インデント付きXMLを生成するための多数のオプション、UTF8ストリングの使用など.
  • XML検証:部分的および完全(オプション)
  • WSサポート:WS-Security、WS-ReliableMessaging、WS-Addressing、WS-Policy、WS-SecurityPolicyなど。
  • デバッグ:リーク検出、ロギングを伴う統合メモリ管理。
  • API:学習するためのAPIはなく、エンジンコンテキストの初期化を「せっけん」するだけで、その後はデータの読み取り/書き込みインターフェイスを使用し、「せっけん」エンジンコンテキストを破棄します。

例えば:

class Address
{ 
  std::string name;
  std::vector<LONG64> number;
  time_t date;
};

次に、上記のAddressクラス宣言に対して "soapcpp2"を実行して、soap_read_Addressおよびsoap_write_Address XMLリーダーおよびライターを生成します。次に例を示します。

Address *a = new Address();
a = ...;
soap ctx = soap_new();
soap_write_Address(ctx, a);
soap_end(ctx);
soap_free(ctx);`

これはAddress aオブジェクトのXML表現を生成します。ヘッダーファイル宣言にXML名前空間の詳細(ここには表示されていません)を付けて注釈を付けることによって、ツールはスキーマも生成します。これは簡単な例です。 gSOAPツールは、ポインタベースのリンク構造や(単なるツリーではなく)(周期的な)グラフさえも含む、非常に広範囲のCおよびC++データ型を処理できます。

お役に立てれば。

10
Bob

私はC++初心者で、このページでいくつかの異なる提案を試した後、私は pugixml が一番好きだと言わなければなりません。それは私が探していたすべてだったドキュメントと高レベルのAPIを理解するのは簡単です。

9
godspeedelbow

TinyXMLは単純なXML作業には最適ですが、もっと機能が必要な場合はApacheプロジェクトのXercesを試してください。その機能の詳細については、次のページにアクセスしてください。

http://xerces.Apache.org/xerces-c/

9
Raminder

TinyXML、そしてBoost.PropertyTreeも。後者は、すべての公式要件を満たしているわけではありませんが、非常に単純です。

8
Lev

私はGnome xmlパーサーが好きです。それはオープンソース(MITライセンスなので、あなたは商用製品でそれを使うことができます)、速くそしてDOMとSAXベースのインターフェースを持っています。

http://xmlsoft.org/

7
dicroce

TinyXML または IrrXML ...を試してみてください。どちらも軽量のXMLパーサーです(とにかくTinyXMLを使用することをお勧めします)。

2
Prog