2010-03-30 156 views
8

EMF = Eclipse建模框架如何使用EMF讀取XML文件?

我必須在我的一個類項目中使用EMF。我想了解如何使用EMF做到以下幾點:

  1. 讀取XML,
  2. 獲取價值爲對象。
  3. 使用ORM將對象中的值保存到數據庫中。 - 完成
  4. 使用ORM從數據庫獲取數據並生成XML。

我需要做的所有使用:EMF(不知道什麼是如此)和JPA(完成)。

我已經使用JAXB,我知道,這可以使用JAXB來完成,但(EMF == JAXB)怎麼樣?!

我已經創建了許多使用EMF的java類,但其中有很多!我在哪裏實施讀/寫方法,以及如何運行EMF項目?

感謝

UPDATE1 提示 http://www.eclipsezone.com/eclipse/forums/t58829.html

UPDATE2

我有模式,我已經產生使用的.xsd型號代碼。現在我在從XML文件讀取數據時遇到問題。

+0

我不認爲EMF是爲此目的而設計的。這是一個建模,而不是一個綁定框架 – Bozho 2010-04-08 20:04:42

+0

它用於XML綁定,我相信這一點。 – zengr 2010-04-09 01:11:16

+0

@Bozho - EMF是(或可以用作)建模框架或綁定框架。這取決於你從哪裏開始...以及你的觀點。 (這是元建模常常被誤解的一個方面,模型可以被看作是數據,反之亦然。) – 2010-04-09 10:15:35

回答

4

EMF使用(默認的,最流行的方式)XMIResourceImpl序列化數據模型,其中嚴格使用XMI格式,而不是自定義XML結構。關於EMF及其使用案例的文章,請參閱http://eclipsedriven.blogspot.com/

我同意其他回答者EMF可能不是你想要的。

如果我真的想用自定義XML結構(即不是XMI)的EMF,我可能會使用JAXB編組/ EMM對象(EObject)。

所以EMF和JAXB不一樣,他們有不同的目的和目標。事實上,你可能會以某種方式組合EMF和JAXB。我從來沒有嘗試過,但似乎有有效的用例。 (正如我上面所說的,用於將XML對EMF對象進行編組/解組)

要理解EMF,您需要切換您的範例。首先刪除「XML」部分,讓它離開你的想法。然後我建議你做以下幾點:

  1. 創建一個空的EMF項目。
  2. 創建一個簡單的Ecore文件(.ecore),或從Internet獲取。或者從任何XML Schema/UML文件導入Ecore模型。
  3. 右鍵單擊一個EClass然後「創建動態實例」,這將創建一個.xmi文件。
  4. 使用Eclipse打開.xmi文件,這將打開該模型的EMF編輯器。如你所見,編輯。
  5. 檢查(編輯的).xmi文件的內容。您會看到格式與Ecore模型完全一致。您將無法更改/自定義模型< - > XMI文件的映射,因爲顧名思義,XMIResourceImpl只讀取/保存XMI文件(恰好在XML之上實現),但不會讀取/保存任意的XML格式。

EMF支持讀/寫XML模式元模型(即,XSD文件),目的是將它們轉換爲Ecore元模型,但不符合這種模式(甚至不適用於Ecore)的XML文件,除非這些文件採用XMI格式。

對於持續EMF模型到關係型數據庫,請參閱: http://eclipsedriven.blogspot.com/2010/12/persisting-emf-objects-to-rdbms-with.html

我使用TENEO。 (也可使用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)); 
1

做這種事情的正常方法是從一個XML模式開始,然後使用它來生成EMF模型,然後生成Java代碼。這在this EMF tutorial中描述。

您不需要實現讀取/寫入方法。而是使用EMF庫代碼來執行XML導入和導出。我現在沒有在我面前的EMF書的副本,但它覆蓋在那裏。或者,查看加載或保存模型實例時生成的EMF編輯器的功能。

編輯

這裏是我幾年前開發了一個基於EMF的項目resource utility class。查看load*方法。請注意,這不一定是這樣做的最佳方式......但它對我有效。

EDIT 2

我才意識到,我用XMI不是純XML。使用自定義架構和(可能)自定義架構映射來配置XML讀取器可能會有所不同。所以,回到我原來的答案,看看生成的代碼!

+0

你可以給我一個開始,什麼是EMF庫有哪些方法來讀取/寫入XML文件? – zengr 2010-04-01 08:38:39

0

EMF不是爲了讀取任意XML文件而設計的。 EMF使用XML作爲後端。你的XML文件來自哪裏?它們符合哪個模式?如果你有模式,那麼你可以使用它來創建一個EMF模型,然後希望能夠讀取你的XML文件。

否則,您將不得不逆向設計一個EMF模型,該模型確實會序列化到您的XML中,以便您能夠讀取它,但那會是一種破解。

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從「root」開始工作。

雖然我還沒有使用ORM東西的經驗,但也許你應該看看CDO

+0

請檢查update2。 – zengr 2010-04-09 09:35:39

+0

是的,CDO或Teneo在數據庫中存儲EMF模型時值得研究。 Teneo:http://www.eclipse.org/modeling/emft/?project=teneo – lothar 2010-10-25 20:21:35

13

可以讀取任意XML文件與EMF,只要你對他們的XSD,你甚至不必生成Java類來自XSD。
我在幾個月前寫了一篇關於這方面的文章,但我也會在這裏粘貼代碼片段。有關更詳細的解釋,請參閱我的博客文章How to load and compare arbitrary 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); 
+0

嗨@ZsoltTörök - 我在哪找到ResourceSetFactory包? – Magick 2017-08-12 09:33:29

2

我建立了一個小使用emftriple(以前的emf4sw),即Ecore XMI(XML文件)轉換爲RDF TTL的一些基本模型格式轉換的程序。

我在這裏的答案中使用了一些提示,所以謝謝你們!

也許源代碼可以激勵你:https://github.com/frostyandy2k/model-transformer