| VTD-XML | |
|---|---|
| 開発者 | XimpleWare |
| 安定版リリース | 2.13_4 / 2017年7月14日 ( 2017-07-14 ) |
| オペレーティング·システム | ポータブル |
| プラットフォーム | Java、C#、C、C++ |
| タイプ | XMLパーサー/インデクサー/スライサー/エディターライブラリ |
| ライセンス | GPLと独自ライセンス |
| Webサイト | vtd-xml.sourceforge.io ximpleware.wordpress.com |
拡張マークアップ言語用仮想トークン記述子(VTD-XML)は、非抽出型[1] [2] XMLの「文書中心型」解析技術である仮想トークン記述子(VTD)を中心とした、クロスプラットフォームなXML処理技術の集合を指します。VTD-XMLは、視点によって、次のいずれかとして捉えることができます。
- 「ドキュメント中心」[3] [4] XMLパーサー[5] [6] [7]
- ネイティブXMLインデクサーまたはバイナリデータを使用してテキストXMLを強化するファイル形式[8]
- 増分XMLコンテンツ修飾子
- XMLスライサー/スプリッター/アセンブラー[9]
- XMLエディタ/消去ツール
- XML処理をチップ上に移植する方法[10] [11] [12]
- 非ブロッキング、ステートレスXPath評価器[13]
VTD-XMLはXimpleWareによって開発され、 GPLとプロプライエタリライセンスのデュアルライセンスで提供されています。元々はJavaで書かれていましたが、現在はC、[14] C++、C#でも利用可能です。
基本的な概念
非抽出、ドキュメント中心の解析
伝統的に、字句解析器はトークン(分割できない文字値の小さな単位)を個別の文字列オブジェクトとして表現します。このアプローチは抽出型解析と呼ばれます。対照的に、非抽出型トークン化では、ソーステキストをそのまま保持し、オフセットと長さを用いてトークンを記述します。
仮想トークン記述子
仮想トークン記述子(VTD)は、非抽出型で文書中心の解析の概念をXML処理に適用します。VTDレコードは、XML文書内のトークンのオフセット、長さ、トークンタイプ、およびネスト深度を64ビット整数でエンコードします。すべてのVTDレコードは64ビット長であるため、効率的に格納し、配列として管理することができます。[15]
位置情報キャッシュ
ロケーションキャッシュ(LC)は、効率的なランダムアクセスを実現するためにVTDレコードを基盤としています。LCはテーブル形式で構成され、ネストレベルごとに1つのテーブルで構成され、XML文書の要素階層をモデル化したエントリが格納されます。LCエントリは、32ビット値のペアをエンコードした64ビット整数です。上位32ビットは、対応する要素のVTDレコードを識別します。下位32ビットは、LCにおけるその要素の次の下位ネストレベルの最初の子を識別します。
利点
概要
VTD-XML のほぼすべての主な利点は、次のような特性を提供する非抽出型のドキュメント中心の解析に固有のものです。
- ソース XML テキストはデコードされずにメモリ内にそのまま保持されます。
- VTD-XML の内部表現は本質的に永続的です。
- XML階層を表現するためにプリミティブデータ型(例えば64ビット整数)に完全に依存しているため、階層表現のオブジェクト指向モデリングが不要になり、オブジェクト作成コストがほぼゼロになります。 [16]
これらの特性を組み合わせることで、XMLをオブジェクトのシリアライゼーション/デシリアライゼーションではなく、純粋に構文(ビット、バイト、オフセット、長さ、フラグメント、名前空間補正フラグメント、ドキュメント構成)として捉えることが可能になります。これは、XML/ SOAアプリケーション を考える上で強力な方法です。
適合性
VTD-XMLは、XML 1.0(DTD部分を除く)およびXML Namespace 1.0に厳密に準拠しています。XPath 1.0仕様(基盤となるデータモデルに関しては若干の差異あり)にも基本的に準拠しており、XPath 2.0組み込み関数への拡張も含まれています。
シンプルさ
パーサーとして
解析モードで使用する場合、VTD-XMLは汎用性の高い高性能な[17] XMLパーサーであり、他のものと比べても遜色ありません。
- VTD-XML は、完全なランダム アクセスと組み込みのXPathサポートを提供しながら、通常は SAX (NULL コンテンツ ハンドラーを使用) よりも優れたパフォーマンスを発揮します。[引用が必要]
- VTD-XMLは通常、XML文書のサイズの1.3~1.5倍のメモリを消費します。これはDOMのメモリ使用量の約1/5です[引用が必要]
- VTD-XML で記述されたアプリケーションは、通常、DOM または SAX バージョンよりもはるかに短く簡潔です。[引用が必要]
索引作成者として
VTD-XMLは本質的に永続的なため、開発者は解析済みのXML文書の内部表現をディスクに書き出し、後で再読み込みすることで繰り返しの解析を回避できます。この目的のため、XimpleWareはVTD、LC、およびXMLテキストを組み合わせたバイナリパッケージ形式であるVTD+XMLを導入しました。これは通常、以下の2つの方法で表示できます。
- ネイティブXMLインデックスは、解析コストを完全に排除し、XMLの利点をすべて維持します。人間が読めるファイル形式で、XMLとの下位互換性も備えています。[要出典]
- バイナリ データを使用して XML テキストの処理を強化するバイナリXML形式。
XMLコンテンツ修飾子
VTD-XMLはXMLテキストをデコードせずにそのまま保持するため、アプリケーションがXMLの内容を変更する場合、変更に最も関連性の高い部分のみを変更すれば済みます。これは、変更がいかに小さくても解析と再シリアル化のコストが発生するDOM、SAX、またはStAx解析とは対照的です。
VTDはドキュメント要素をオフセットで参照するため、ドキュメント内の先行する要素の長さを変更すると、後続の要素を参照するVTDの調整が必要になります。ただし、これらの調整は複数のテーブル内の多数の整数への整数加算であるため、処理は高速です。
XML スライサー/スプリッター/アセンブラー
VTD-XMLベースのアプリケーションでは、オフセットと長さを使用してトークン(要素フラグメント)をアドレス指定することもできます。これにより、XML文書をバイト配列のように操作できます。
- スライサーとして、VTD-XML はXML ドキュメントからトークンまたは要素フラグメントを「スライス」し、それを同じドキュメント内の別の場所、または別のドキュメントに挿入することができます。
- スプリッターとして、VTD-XML はXML ドキュメント内のサブ要素を分割し、それぞれを個別の XML ドキュメントにダンプすることができます。
- アセンブラーとして、VTD-XML は複数の XML ドキュメントからチャンクを「切り取り」、新しい XML ドキュメントに組み立てることができます。
XMLエディタ/消去ツール
VTD-XMLをエディタ/イレーサーとして使用すると、トークン長が新しいコンテンツよりも長い場合、XMLテキストの基になるバイトコンテンツを直接編集/消去できます。このアプローチの直接的な利点は、アプリケーションが元のVTDとLCをすぐに再利用できることです。一方、VTD-XMLを使用してXMLドキュメントを増分更新する場合、アプリケーションは更新されたドキュメントを処理する前に、それを再解析する必要があります。
エディタは各トークンの位置を追跡できるほどスマートに設計でき、元の文書を保存していたメモリとは別のメモリに新しいトークンを指定するだけで、既存の短いトークンを新しい長いトークンで置き換えることができます。同様に、文書の順序を変更する場合、要素テキストをコピーする必要はなく、LCのみを更新すれば済みます。保存時など、完全で連続したXML文書が必要な場合は、ばらばらの要素を再構成して、新しい連続した文書を作成できます。
その他の特典
VTD-XML は、非ブロッキングでステートレスな XPath 評価アプローチの先駆者でもあります。[引用が必要]
弱点
VTD-XML には、次のような顕著な欠点/弱点もあります。
- XML パーサーであるため、DTD で宣言された外部エンティティはサポートされません。
- ファイル形式としては、ドキュメントサイズが 30% ~ 50% 程度増加します。
- API としては、DOM、SAX、StAXと互換性がありません。
- 解析対象の XML インスタンスの変更を必要とする、DTD および XML スキーマで採用されている特定の検証手法 (デフォルトの属性や要素など) をサポートすることは困難です。
応用分野
DOM または SAX の汎用代替
VTD-XMLはパフォーマンスとメモリの利点があるため、DOMやSAXよりも多くのXMLユースケースをカバーします。[18]
- DOM と比較すると、VTD-XML は同じ物理メモリ量で、約 3 ~ 10 倍のパフォーマンスで、より大きな (3 倍 ~ 5 倍) XML ドキュメントを処理します。
- SAX と比較すると、VTD-XML はランダム アクセスと XPath サポートを提供し、SAX より少なくとも 2 倍優れたパフォーマンスを発揮します。
大規模なXML文書に対するXPath
64 ビット JVM と組み合わせた VTD-XML の拡張エディションにより、サイズの大きい XML ドキュメント (最大 256 GB) に対する XPath ベースの XML 処理が可能になります。
SOA/WS/XMLセキュリティ
VTD-XMLの高性能と増分更新機能の組み合わせにより、SOA/WS/XMLセキュリティアプリケーションに 必要なレベルのサービス品質を達成することが不可欠になります[19] [20] [21] 。
SOA/WS/XML仲介者向け
VTD-XMLは、XMLルーター/スイッチ/ゲートウェイ、エンタープライズサービスバス、サービス集約ポイントなどのSOA中間アプリケーションに最適です。これらのアプリケーションはすべて、基本的な「ストアアンドフォワード」操作を実行するため、元のXMLデータを保持することはレイテンシの最小化に不可欠です。VTD-XMLの増分更新機能も、転送パフォーマンスの向上に大きく貢献します。
VTD-XML のランダム アクセス機能は、AJAXおよび SOA 展開 で一般的なXPathベースの XML ルーティング/スイッチング/フィルタリングに適しています。
インテリジェントなSOA/WS/XML負荷分散とオフロード
XML ドキュメントが複数の中間層 SOA コンポーネントを通過する場合、最初のメッセージ ストップでは、XML ドキュメントの検査が完了した後、繰り返しの解析を回避するために、下流のコンポーネントに VTD+XML ファイル形式を送信することを選択できます。これにより、スループットが向上します。
同様に、インテリジェントな SOA ロード バランサは、受信/送信 SOAP メッセージに対して VTD+XML を生成して、それらのメッセージを受信するアプリケーション サーバーから XML 解析の負荷を軽減できます。
XML永続データストア
ネイティブXML永続性の観点から見ると、VTD-XMLは人間が読みやすく、使いやすく、汎用的なXMLインデックスとして使用できます。このように保存されたXMLドキュメントは、解析や再シリアル化のオーバーヘッドなしに、メモリにロードしてクエリ、更新、編集することができます。
スキーマレスXMLデータバインディング
VTD-XMLは、高いパフォーマンス、低メモリ使用量、そして効率的なXPath評価を組み合わせることで、XPathのみに基づいた新しいXMLデータバインディング手法を実現します。この手法の最大の利点は、XMLスキーマが不要になり、不要なオブジェクト作成を回避し、XML本来の緩やかなエンコーディング特性を活用できることです。[22]
上記の記事で説明したデータバインディングはアプリケーション側で実装する必要があることに注意してください。VTD-XML自体はアクセサのみを提供します。この点において、VTD-XML自体はデータバインディングソリューションではありません(JiBX、JAXB、XMLBeansとは異なります)。ただし、他のXMLパーサー(DOM、SAX、StAX)と同様に、データバインディングパッケージの抽出機能を提供します。
必須クラス
バージョン 2.11 以降、VTD-XML の Java および C# バージョンは次のクラスで構成されています。
- VTDGen (VTD ジェネレーター) は、主要な解析、インデックスの読み込み、およびインデックスの書き込み機能をカプセル化するクラスです。
- VTDNav(VTDナビゲータ)は、(1)XML、VTD、階層情報をカプセル化し、(2)さまざまなナビゲーションメソッドを含み、(3)VTDレコードと文字列の間でさまざまな比較を実行し、(4)VTDレコードをプリミティブデータ型に変換するクラスです。
- AutoPilot は、ノード レベルの反復処理と XPath を実行する関数を含むクラスです。
- XMLModifier は、削除、挿入、更新などの増分更新機能を提供するクラスです。
拡張 VTD-XML は次のクラスで構成されます。
- VTDGenHuge (拡張 VTD ジェネレーター) は、主な解析をカプセル化します。
- XMLBuffer はXML ドキュメントのメモリ内読み込みを実行します。
- XMLMemMappedBuffer は、XML ドキュメントのメモリマップ ロードを実行します。
- VTDNavHuge(拡張VTDナビゲータ)は、(1)XML、拡張VTD、階層情報をカプセル化し、(2)さまざまなナビゲーションメソッドを備え、(3)VTDレコードと文字列の間でさまざまな比較を実行し、(4)VTDレコードをプリミティブデータ型に変換します。
- AutoPilotHuge はノード レベルの反復と XPath を実行します。
コードサンプル
/* このJavaプログラムでは、XMLModifierを使用して、単純なXML注文書を段階的に更新する方法を示します
。
* 特定の名前空間。また、
プログラミングを簡素化するために、VTDGenのparseFileも使用します。
*/
com.ximpleware.*をインポートします。
public class Update { public static void main ( String argv [] ) throws NavException 、ModifyException 、IOException { // ファイルを開き、その内容をバイト配列に読み取りますVTDGen vg = new VTDGen (); if ( vg . parseFile ( "oldpo.xml" 、true )) { VTDNav vn = vg . getNav (); AutoPilot ap = new AutoPilot ( vn ); XMLModifier xm = new XMLModifier ( vn ); ap . selectXPath ( "/purchaseOrder/items/item[@partNum='872-AA']" );
int i = - 1 ; while (( i = ap . evalXPath ()) != - 1 ) { xm . remove (); xm . insertBeforeElement ( "<something/>\n" ); } ap . selectXPath ( "/purchaseOrder/items/item/USPrice[.<40]/text()" ); while (( i = ap . evalXPath ()) != - 1 ) { xm . updateToken ( i , "200" ); } xm . output ( "newpo.xml" ); } } }
参考文献
- ^ Zhang, Jimmy (2004年5月19日). 「XMLの非抽出解析」. XML.com . 2020年7月24日閲覧。
- ^ 未来のためのXML処理
- ^ Zhang, Jimmy (2008年1月9日). 「Ximpleを使ったXMLコンテンツの操作」DevX . 2017年7月30日時点のオリジナルよりアーカイブ。 2020年7月24日閲覧。
- ^ Zhang, Jimmy (2008年6月24日). 「VTD-XML: 未来のためのXML処理(パートII)」. Code Project . 2020年7月24日閲覧。
- ^ Zhang, Jimmy (2006年3月27日). 「VTD-XMLによるXML処理の簡素化」. JavaWorld . 2020年7月24日閲覧。
- ^ Zhang, Jimmy (2004年10月21日). 「VTD-XMLによるXML処理の高速化と高速化」DevX . 2020年7月24日時点のオリジナルよりアーカイブ。 2020年7月24日閲覧。
- ^ Zhang, Jimmy (2008年4月17日). 「VTD-XML: 未来のためのXML処理(パートI)」. Code Project . 2020年7月24日閲覧。
- ^ Zhang, Jimmy (2007年11月2日). 「VTD-XMLによるXMLドキュメントのインデックス作成」SYS-CON Publications. 2007年11月5日時点のオリジナルよりアーカイブ。
- ^ Zhang, Jimmy (2006年7月24日). 「VTD-XMLによるXML文書の切り取り、貼り付け、分割、および組み立て」. JavaWorld . 2020年7月24日閲覧。
- ^ チップ上の XML?
- ^ Zhang, Jimmy (2005年3月9日). 「XML on a Chip」. XML.com . 2020年7月24日閲覧。
- ^ XimpleWare の W3C バイナリ XML ワークショップ ポジションペーパー
- ^ Zhang, Jimmy (2007年3月19日). 「VTD-XMLによるXPath効率の向上」DevX . 2020年7月24日時点のオリジナルよりアーカイブ。2020年7月24日閲覧。
- ^ Volkman, Victor (2007年12月3日). 「VTD-XML: XMLの新たなビジョン」. Developer.com . 2020年7月24日時点のオリジナルよりアーカイブ。2020年7月24日閲覧。
- ^ SourceForge での仮想トークン記述子の紹介
- ^ Zhang, Jimmy (2006年7月31日). 「バイナリXMLのパフォーマンスの悩み」. SYS-CON Publications. 2006年8月8日時点のオリジナルよりアーカイブ。
- ^ VTD-XML 解析/ナビゲーションパフォーマンスレポート
- ^ Zhang, Jimmy (2006年2月8日). 「正しい方向への一歩:VTD-XMLによるXML処理の改善」DevX . 2020年8月12日時点のオリジナルよりアーカイブ。 2020年7月24日閲覧。
- ^ Zhang, Jimmy (2007年1月9日). 「VTD-XMLによるWSSアプリケーションの高速化」. JavaWorld . 2020年7月24日閲覧。
- ^ XMLセキュリティに関するW3Cワークショップのプレゼンテーション
- ^ XML署名とXML暗号化の次のステップに関するW3Cワークショップのポジションペーパー
- ^ Zhang, Jimmy (2007年9月10日). 「VTD-XMLによるスキーマレスJava-XMLデータバインディング」ONJava . 2017年9月27日時点のオリジナルよりアーカイブ。