潜在的に巨大なXMLファイルを解析する必要があるので、これはDOMパーサーを除外すると思います。
フットプリントのTinyXMLに匹敵する、C ++用の優れた軽量SAXパーサーはありますか?XMLの構造は非常に単純であり、名前空間やDTDなどの高度なものは必要ありません。要素、属性、cdataだけです。
Xercesについては知っていますが、50mbを超えるサイズで震えます。
ありがとう!
Cを使用している場合は、GnomeプロジェクトのLibXMLを使用できます。ドキュメントへのDOMおよびSAXインターフェイスに加えて、長年にわたって開発されてきた多くの追加機能から選択できます。本当にC++が必要な場合は、 LibXMLのC++OOラッパーであるlibxml++を使用できます。
ライブラリは何度も証明されており、高性能であり、見つけることができるほとんどすべてのプラットフォームでコンパイルできます。
RapidXMLは、C++ で記述された XML の非常に高速なパーサーです。
http://sourceforge.net/projects/wsdlpull これは、Java xmlpull API ( http://www.xmlpull.org/ )のストレートな C++ ポートです。
このパーサーを強くお勧めします。組み込みデバイス (STL サポートなし) で使用するためにカスタマイズする必要がありましたが、オーバーヘッドがほとんどなく、非常に高速であることがわかりました。独自の文字列クラスとベクトル クラスを作成する必要がありましたが、それらを使用しても、Windows では約 60k にコンパイルされます。
プル解析は、SAX などよりもはるかに直感的だと思います。コードは xml ドキュメントをより厳密に反映しているため、2 つのドキュメントを簡単に関連付けることができます。
1 つの欠点は、前方のみであることです。つまり、要素が来るたびに解析する必要があります。構成ファイルを読み取るための設計がかなりめちゃくちゃで、サブツリー全体を解析し、いくつかのチェックを行い、いくつかのデフォルトを設定してから再度解析する必要があります。このパーサーでそのようなものを処理する唯一の実際の方法は、状態のコピーを作成し、それを解析してから、元の状態を続行することです。古い DOM パーサーと比較して、リソースの点で依然として大きなメリットがあります。
firstobject のCMarkupは、軽量で巨大なファイルのプル パーサー (SAX ではなくプル パーサーをお勧めします) として機能する C++ クラスであり、巨大な XML ファイル ライターとしても機能します。実行可能ファイルに最大約 250kb 追加されます。インメモリで使用すると、1 人のユーザーのレポートによると、tinyxml のフットプリントが 1/3 になります。巨大なファイルで使用すると、メモリ内に小さなバッファー (16kb など) しか保持されません。CMarkup は現在商用製品であるため、単一の cpp ファイルと h ファイルでプロジェクトに簡単に追加できるようにサポートされ、文書化され、設計されています。
これを試す最も簡単な方法は、次のような無料の firstobject XML エディターでスクリプトを使用することです。
ParseHugeXmlFile() { CMarkup xml; xml.Open( "HugeFile.xml", MDF_READFILE ); while ( xml.FindElem("//レコード") ) { // レコードを処理... str sRecordId = xml.GetAttrib( "id" ); xml.IntoElem(); xml.FindElem( "説明" ); str sDescription = xml.GetData(); } xml.Close(); }
[ファイル] メニューから [新しいプログラム] を選択し、これを貼り付けて、要素と属性に合わせて変更します。F9 を押して実行するか、F10 を押して 1 行ずつ実行します。
XML 構造が非常に単純な場合は、 lex/yacc (flex/bison) に基づいて単純なレクサー/スキャナーを構築することを検討できます。W3C のソース ( http://www.w3.org/XML/9707/parser.yおよびhttp://www.w3.org/XML/9707/scanner.l ) が刺激になるかもしれません。
libxmlの SAX2 インターフェイスも参照してください。
https://github.com/thinlizzy/die-xmlを試すことができます。とても小さくて使いやすそうです
これは最近作成された C++0x XML SAX パーサーのオープン ソースであり、作者は喜んでフィードバックを提供します
入力ストリームを解析し、std::function と互換性のあるコールバックでイベントを生成します
スタック マシンはバックエンドとして有限オートマトンを使用し、一部のイベント (開始タグとテキスト ノード) はイテレータを使用してバッファリングを最小限に抑え、かなり軽量にします。
小さくて高速なものが必要な場合は、DTD/スキーマ固有のパーサーを生成するツールを検討します。これらは、巨大なドキュメントに非常に適しています。
pugixml は、軽量の C++ XML 処理ライブラリです。
「pugixml は C++ XML 処理ライブラリであり、豊富なトラバーサル/変更機能を備えた DOM のようなインターフェイス、XML ファイル/バッファから DOM ツリーを構築する非常に高速な XML パーサー、および複雑なデータ用の XPath 1.0 実装で構成されています。ドリブン ツリー クエリ。Unicode インターフェイスのバリアントと異なる Unicode エンコーディング間の変換により、完全な Unicode サポートも利用できます。」
商用製品でpugixmlを選択して使用する前に、いくつかの高価なものを含むいくつかのXMLパーサーをテストしました。
pugixml は最速のパーサーであるだけでなく、最も成熟したフレンドリーな API を備えていました。強くお勧めします。安定感抜群の商品です!バージョン0.8から使い始めました。今は1.7です。
このパーサーの大きなボーナスは、XPath 1.0 の実装です! より複雑なツリー クエリの場合、XPath は神から送られた機能です。
豊富なトラバーサル/変更機能を備えた DOM のようなインターフェイスは、実際の「重い」XML ファイルに取り組むのに非常に役立ちます。
小さくて高速なパーサーです。C++ コードのリンクを気にしないのであれば、iOS または Android アプリでも良い選択です。
ベンチマークは多くのことを教えてくれます。参照: http://pugixml.org/benchmark.html
(x86) の例:
pugixml is more than 38 times faster than TinyXML
4.1 times faster than CMarkup,
2.7 times faster than expat or libxml
(x64) の場合、pugixml は私が知っている最速のパーサーです。
XML パーサーによるメモリの使用状況も確認してください。一部のパーサーは、貴重なメモリをむさぼり食うだけです!