6

RelaxNG スキーマからオブジェクト モデルを生成したいと考えています。

したがって、私はRNGOM オブジェクト モデル/パーサーを使用したいと考えています(主に、パーサーが記述されている/生成する言語については気にしませんが、代替手段を見つけることができなかったからです)。SVN からRNGOM ソースをチェックアウトしたので、 RNGOMの使用方法についての情報がまったくないため、RNGOM の使用方法がわかりません。

RNGOM の開始方法に関する有用なヒント (リンク、例、または RNGOM のソース コード全体を理解する必要がなくなるような説明) が回答として提供されます。さらに良いのは、パーサーを使用して RNG ファイルからオブジェクト モデルを生成する方法の簡単な例です。

詳細情報:

次の RelaxNG スキーマから Java クラスを生成したい:
http://libvirt.org/git/?p=libvirt.git;a=tree;f=docs/schemas;hb=HEAD

Glassfish の連中が、私が必要とするのと同じオブジェクト モデルを生成するために rngom を使用していることがわかりましたが、彼らが rngom をどのように使用しているかはまだわかりませんでした。

4

2 に答える 2

3

続行する方法は次のとおりです。

  1. jing を使用して Relax NG から XML スキーマに変換します (こちらを参照)
  2. より一般的なツールを使用してクラスを生成します (JaxB など)。
于 2012-02-16T10:52:22.587 に答える
0

こんにちは、コンパクト構文に集中していることを除いて、ほとんど同じ要件に遭遇しました。これは、YMMV 以外の方法で実行する方法の 1 つです。

コンテキストを示すために、2 つのフェーズでの私の目標: (a) RelaxNG Compact Syntax をスラープし、オブジェクト/ツリーをトラバースして、Spring 4 Rest Controller で使用できる Spring 4 POJO を作成しようとしています。(b) そこから、RNG Compact を使用し、Spring がリクエストをデシリアライズする前にリクエストを自動的に検証するリクエストバリデーターを開発したいと考えています。基本的に、RelaxNG Compact Syntax を設計/ドキュメントと JSON スキーマの定義/検証の両方として使用して、JSON REST API 開発の足場を組んでいます。

最初の目的として、CompactSyntax に JJTree でアノテーションを付けることを考えましたが、明らかに JavaCC に精通していないので、よりプログラム的なアプローチを取ることにしました...

コードをいくつかの方法で分析およびテストして、バイナリ、ダイジェスト、および/または nc パッケージにツリー実装があるかどうかを判断しましたが、そのようなもの (om/tree) はないと思います。

したがって、実際に成功した私の最新のアプローチは、バイナリに基づいて構築し、SchemaBuilderImpl を拡張し、ビジター インターフェイスを実装し、長いコンストラクターを使用してカスタム SchemaBuilderImpl を CompactSyntax に渡すことでした: CompactSyntax(CompactParseable parseable, Reader r, String sourceUri, SchemaBuilder sb, ErrorHandlerええと、継承された文字列Ns)

CompactParseable.parse を呼び出すと、ビジター インターフェイスで構造化されたイベントが取得されます。rng スキーマをトラバースするにはこれで十分だと思います。ここから OM またはツリーを簡単に作成できます。

しかし、これが最善のアプローチであるかどうかはわかりません。多分私は何かを見逃していて、実際にはrngom実装(私の場合はCompactSyntax)によって構築されたOM /ツリーがあり、親子関係をより簡単に判断するためにトラバースできます。または、これには他のアプローチがあるかもしれません。

とにかく、これは私が望むもののために働いているように見える1つのアプローチです. 主にビジター パターン ベースであり、インターフェイスがあったので、それらを使用することにしました。多分それはあなたのために働くでしょう。要するに、実装パッケージ (nc、バイナリ、ダイジェスト) のどこにでも実装されたトラバース可能な OM/AST を見つけることができませんでした。

于 2014-12-02T22:50:23.273 に答える