| 開発者 | XimpleWare |
|---|---|
| 安定版リリース | 2.13_4 / 2017年7月14日 |
| オペレーティング·システム | ポータブル |
| プラットフォーム | Java、C#、C、C++ |
| タイプ | XMLパーサー/インデクサー/スライサー/エディターライブラリ |
| ライセンス | GPLと独自ライセンス |
| Webサイト | vtd-xml.sourceforge.io ximpleware.wordpress.com |
拡張マークアップ言語用仮想トークン記述子( VTD-XML ) は、仮想トークン記述子 (VTD) と呼ばれる非抽出型[1] [2] XML 、「ドキュメント中心」の解析技術を中心としたクロスプラットフォーム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レコードは、64ビットの整数を使用して、XML文書内のトークンのオフセット、長さ、トークンタイプ、およびネストの深さをエンコードします。すべてのVTDレコードは64ビットの長さであるため、効率的に保存し、配列として管理できます。[15]
ロケーションキャッシュ
ロケーション キャッシュ( LC ) は、効率的なランダム アクセスを提供するために VTD レコード上に構築されます。ネスト深度レベルごとに 1 つのテーブルで構成されるテーブルとして編成された LC には、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 名前空間 1.0 に厳密に準拠しています。基本的には、XPath 2.0 組み込み関数の拡張により、XPath 1.0 仕様 (基礎となるデータ モデルに関して若干の微妙な違いあり) に準拠しています。
シンプルさ
パーサーとして
解析モードで使用する場合、VTD-XMLは汎用性の高い高性能な[17] XMLパーサーであり、他の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とは互換性がありません。
- DTD および XML スキーマで採用されている、解析対象の 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 Navigator) は、(1) XML、VTD、階層情報をカプセル化し、(2) さまざまなナビゲーション メソッドを含み、(3) VTD レコードと文字列の間でさまざまな比較を実行し、(4) VTD レコードをプリミティブ データ型に変換するクラスです。
- AutoPilotは、ノード レベルの反復処理と XPath を実行する関数を含むクラスです。
- XMLModifier は、削除、挿入、更新などの増分更新機能を提供するクラスです。
拡張された VTD-XML は次のクラスで構成されます。
- VTDGenHuge (拡張 VTD ジェネレーター) は、主な解析をカプセル化します。
- XMLBuffer はXML ドキュメントのメモリ内読み込みを実行します。
- XMLMemMappedBuffer は、 XML ドキュメントのメモリ マップ ロードを実行します。
- VTDNavHuge (Extended VTD Navigator) は、(1) XML、Extended 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 日時点のオリジナルよりアーカイブ。
