8

EMF = Eclipse モデリング フレームワーク

クラスプロジェクトの 1 つで EMF を使用する必要があります。EMF を使用して次のことを行う方法を理解しようとしています。

  1. XML を読み取り、
  2. 値をオブジェクトに取得します。
  3. ORM を使用して、オブジェクトの値をデータベースに永続化します。- 終わり
  4. ORM を使用してデータベースからデータを取得し、XML を生成します。

EMF(これまでに何もわからない)とJPA(DONE)を使用して、そのすべてを行う必要があります。

私は JAXB を使用しており、これは JAXB を使用して実行できることはわかっていますが、(EMF == JAXB) はどうですか?!

EMF を使用して多くの Java クラスを作成しましたが、その数は非常に多くあります。読み取り/書き込みメソッドをどこに実装し、EMF プロジェクトをどのように実行しますか?

ありがとう

UPDATE1 ヒント http://www.eclipsezone.com/eclipse/forums/t58829.html

UPDATE2

スキーマがあり、.xsd を使用してモデル コードを生成しました。現在、XML ファイルからデータを読み取る際に問題が発生しています。

4

5 に答える 5

14

XSD があれば、任意の XML ファイルを EMF で読み取ることができ、XSD から Java クラスを生成する必要さえありません。
これについては数か月前にブログに書きましたが、ここにもコード スニペットを貼り付けます。もう少し詳細な説明については、How to load and comparison optional XML files with EMFに関する私のブログ投稿を参照してください。

最初に、XSD をロードし、いくつかのものを初期化する必要があります。

// generate EPackages from schemas
XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder();
Collection generatedPackages = xsdEcoreBuilder.generate(schemaURI);

// register the packages loaded from XSD
for (EObject generatedEObject : generatedPackages) {
    if (generatedEObject instanceof EPackage) {
        EPackage generatedPackage = (EPackage) generatedEObject;
        EPackage.Registry.INSTANCE.put(generatedPackage.getNsURI(),
            generatedPackage);
    }
}

// add file extension to registry
ResourceFactoryRegistryImpl.INSTANCE.getExtensionToFactoryMap()
    .put(MY_FILE_EXTENSION, new GenericXMLResourceFactoryImpl());

その後、通常どおりに XML ファイルをロードできます。

ResourceSet resourceSet = ResourceSetFactory.createResourceSet();
Resource resource = resourceSet.getResource(xmlURI, true);
resource.load(Collections.EMPTY_MAP);
EObject root = resource.getContents().get(0);
于 2011-02-07T16:33:15.097 に答える
5

EMFは、カスタム XML 構造ではなく、厳密に XMI 形式を使用するXMIResourceImpl (デフォルトの最も一般的な方法) を使用してデータ モデルをシリアル化します。

EMF とその使用例に関する記事については、 http://eclipsedriven.blogspot.com/を参照してください。

EMFはおそらくあなたがここで望んでいるものではないという他の回答者に同意します。

カスタム XML 構造 (つまり、XMI ではない) で EMF を本当に使用したい場合は、おそらく JAXB を使用して EMF オブジェクト (EObject) をマーシャリング/アンマーシャリングします。

したがって、EMF は JAXB と同じではなく、目的と目標が異なります。実際、おそらく何らかの方法で EMF と JAXB を組み合わせることができます。試したことはありませんが、有効な使用例があるようです。(上で述べたように、EMF オブジェクトを XML との間でマーシャリング/アンマーシャリングするため)

EMF を理解するには、パラダイムを切り替える必要があります。まず、「XML」部分を削除して、頭から離してください。次に、次のことを行うことをお勧めします。

  1. 空の EMF プロジェクトを作成します。
  2. 簡単な Ecore ファイル (.ecore) を作成するか、インターネットから取得します。または、任意の XML スキーマ/UML ファイルから Ecore モデルにインポートします。
  3. EClass を右クリックして [Create Dynamic Instance] をクリックすると、.xmi ファイルが作成されます。
  4. Eclipse を使用して .xmi ファイルを開くと、そのモデルの EMF エディターが開きます。必要に応じて編集します。
  5. (編集された) .xmi ファイルの内容を調べます。形式が Ecore モデルに完全に準拠していることがわかります。モデル <-> XMI ファイルからマッピングを変更/カスタマイズすることはできません。その名前が示すように、XMIResourceImpl は XMI ファイル (たまたま XML の上に実装されている) の読み取り/保存のみを行いますが、読み取り/保存は行いません。任意の XML 形式。

EMF は、 XML スキーマ メタモデル(つまり、XSD ファイル) を Ecore メタモデルに変換する目的で読み取り/書き込みをサポートしていますが、これらのファイルが XMI 形式でない限り、そのようなスキーマに準拠する (Ecore でさえない) XML ファイルはサポートしません。 .

EMF モデルをリレーショナル データベースに永続化するには、http: //eclipsedriven.blogspot.com/2010/12/persisting-emf-objects-to-rdbms-with.htmlを参照してください。

テネオを使っています。(およびオプションで CDO)

「XML」に関しては、XMI に固執し、それに満足している場合、EMF を使用すると (JAXB とは異なり) マッピングを行う必要がないため、作業がはるかに簡単になります。欠点は、オブジェクトが EMF オブジェクトでなければならないことです。

EMF オブジェクトは、EMF によって生成され、EObject を実装し、直接的または間接的に EObjectImpl を拡張するオブジェクトです。通常、手作業で EMF オブジェクトをコーディングすることは望ましくありません。一方、JAXB の「オブジェクト」は通常、純粋なドメイン オブジェクト POJO であり、JAXB からの追加要件はありません。JAXB とは異なり、EMF オブジェクトは POJO ではないことに注意してください。これは、EMF と JAXB の間の別の異なる目標を説明しています。それらの重なりは、あなたが想像するよりも少ないです。

XMI (XML ではない) からの読み取りは非常に簡単です。

XMIResource resource = new XMIResourceImpl(URI.create("file:/path/to/mymodel.xmi"));
resource.load(null);
System.out.println( resource.eContents().get(0) );
于 2011-01-06T14:29:15.003 に答える
1

この種のことを行う通常の方法は、XMLスキーマから始めて、これを使用してEMFモデルを生成し、次にJavaコードを生成することです。これは、このEMFチュートリアルで説明されています。

読み取り/書き込みメソッドを実装する必要はありません。むしろ、EMFライブラリコードを使用してXMLのインポートとエクスポートを行います。現在、EMFの本のコピーを目の前に持っていませんが、そこでカバーされています。または、モデルインスタンスをロードまたは保存するときに、生成されたEMFエディターがどのように機能するかを確認してください。

編集

これは、私が数年前に開発したEMFベースのプロジェクトのリソースユーティリティクラスです。load*メソッドを見てください。これは必ずしもこれを行うための最良の方法ではないことに注意してください...しかし、それは私にとってはうまくいきました。

編集2

プレーンXMLではなくXMIを使用していることに気づきました。カスタムスキーマと(場合によっては)カスタマイズされたスキーママッピングを使用してXMLリーダーを構成することは異なる可能性があります。それで、私の元の答えに戻って、生成されたコードを見てください!!

于 2010-03-30T11:19:55.160 に答える
0

EMF は、任意の XML ファイルを読み取るようには設計されていません。EMF は XML をバックエンドとして使用します。XML ファイルはどこから来て、どのスキーマに準拠していますか? スキーマがあれば、それを使用して EMF モデルを作成できます。これにより、XML ファイルを読み取ることができます。

そうしないと、実際に XML にシリアル化する EMF モデルをリバース エンジニアリングして、読み取ることができるようにする必要がありますが、それはハックになります。

UPDATE2 の後:

次の質問は、「ファイルのロードに関してどのような問題がありますか」ということだと思います。どのようにそれを行いますか、何が機能していませんか? それともやり方がわからない?

最初にリソース セット (操作するファイル セットのメモリ内表現) のファクトリを構成し、次に getResource(URI, bool) を使用してファイルをロードする必要があります。私がやっているいくつかのUMLの例:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
resourceSet.getPackageRegistry().put("http://www.eclipse.org/uml2/2.0.0/UML", UMLPackage.eINSTANCE);
Resource r = resourceSet.getResource(uriToYourFile,true);
YourModelRootType root = (YourModelRootType) r.getContents().get(0);

それはすべて、すでにリンクされているチュートリアルでカバーされているはずです。次に、生成された Java API を使用して「ルート」から作業できます。

ただし、ORM に関する経験はありませんが、CDOを参照する必要があるかもしれません。

于 2010-04-09T07:48:30.987 に答える