C++プロジェクトで使用するシンプルでクリーンな正しいXMLパーサーを探しています。自分で書くべきですか?
12 に答える
RapidXMLはどうですか?RapidXML は、C++ で書かれた非常に高速で小さな XML DOM パーサーです。これは主に、組み込み環境、コンピューター ゲーム、または利用可能なメモリや CPU 処理能力が重視されるその他のアプリケーションを対象としています。RapidXML は Boost Software License の下でライセンスされており、そのソース コードは自由に利用できます。
特徴
- 解析速度 (DOM ツリーの構築を含む) は、同じデータに対して実行される strlen 関数の速度に近づきます。
- 最新の CPU (2008 年現在) では、パーサーのスループットは 1 秒あたり約 10 億文字です。オンライン マニュアルのパフォーマンス セクションを参照してください。
- コードと作成された DOM ツリーの小さなメモリ フットプリント。
- 統合プロセスを簡素化するヘッダーのみの実装。
- 商用、非商用を問わず、ほぼすべての目的で使用できるシンプルなライセンスで、義務はありません。
- UTF-8 および部分的に UTF-16、UTF-32 エンコーディングをサポートします。
- C++ 標準ライブラリの非常に小さなサブセットを除いて、依存関係のないポータブル ソース コード。
- このサブセットは非常に小さいため、標準ライブラリを使用したくない場合は手動で簡単にエミュレートできます。
制限事項
- パーサーは DOCTYPE 宣言を無視します。
- XML 名前空間はサポートされていません。
- パーサーは、文字の有効性をチェックしません。
- パーサーのインターフェースは DOM 仕様に準拠していません。
- パーサーは、属性の一意性をチェックしません。
使い方によっては、XML データ バインディングを使用できますか? CodeSynthesis XSDは、Code Synthesis によって開発された C++ 用の XML データ バインディング コンパイラであり、GNU GPL およびプロプライエタリ ライセンスの下でデュアル ライセンスが付与されています。XML インスタンス仕様 (XML スキーマ) を指定すると、指定された語彙を表す C++ クラスと、解析およびシリアル化コードが生成されます。
CodeSynthesis XSD のユニークな機能の 1 つは、2 つの異なる XML スキーマから C++ へのマッピング (インメモリ C++/ツリーとストリーム指向の C++/パーサー) のサポートです。C++/ツリー マッピングは、ツリーに似たインメモリ データ構造を持つ従来のマッピングです。C++/Parser は、XML インスタンス ドキュメントに格納されている情報をボキャブラリ固有の解析イベントの階層として表す、SAX に似た新しいマッピングです。C++/Tree と比較して、C++/Parser マッピングを使用すると、メモリに収まらない大きな XML ドキュメントを処理したり、ストリーム指向の処理を実行したり、既存のメモリ内表現を使用したりできます。
pugixml - C++ 用の軽量でシンプルで高速な XML パーサー. 非常に小さく (RapidXML に匹敵), 非常に高速 (RapidXML に匹敵), 非常に使いやすい ( RapidXML より優れている).
TinyXMLをお試しください。
TiCPPは、TinyXML の「より C++」なバージョンです。
「TiCPP」は正式名称 TinyXML++ の略です。これは TinyXML ( http://www.grinninglizard.com/tinyxml/ ) への完全に新しいインターフェイスであり、C++ の長所の多くを使用します。テンプレート、例外、およびはるかに優れたエラー処理。また、doxygen にも完全に文書化されています。このバージョンでは、以前とまったく同じ方法で tiny をインターフェイスできるため、または新しい「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+ でテスト済みです。
これを試してみてください:http:
//www.applied-mathematics.net/tools/xmlParser.htmlRapidXML
やPUGXMLよりも簡単で高速です。
TinyXMLは、「単純なパーサー」の中で最悪のものです。
効率/メモリ管理が心配な場合は、TinyXML を使用しないでください (多くの小さなブロックを割り当てる傾向があります)。私の個人的なお気に入りはRapidXMLです。
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 はありません)。
- 高速: 他のツールの主張を信じないでください。実際の速度はI/Oで測定する必要があります。gSOAP の場合、TCP/IP 経由の往復 XML メッセージは 3000 を超えます。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 はなく、"soap" エンジン コンテキストの初期化のみを行い、データに対して読み取り/書き込みインターフェイスを使用し、"soap" エンジン コンテキストを破棄します。
例えば:
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++ データ型を処理できます。
お役に立てれば。
TinyXMLは単純なXML作業に最適ですが、より多くの機能が必要な場合は、apacheプロジェクトのXercesを試してください。その機能の詳細については、次のページにアクセスしてください。
TinyXML、および Boost.PropertyTree も含まれます。後者はすべての公式要件を満たしているわけではありませんが、非常に単純です。
私は C++ の初心者であり、このページでいくつかの異なる提案を試した後、pugixmlが最も気に入っていると言わざるを得ません。理解しやすいドキュメントと、私が探していた高レベルの API がすべて揃っています。
Gnome xml パーサーが気に入っています。オープン ソース (MIT ライセンスなので、商用製品で使用できます) であり、高速で、DOM および SAX ベースのインターフェイスを備えています。