2016-03-01 247 views
0

我需要通過EMF加載和解析xmi文件(版本:OMG XMI 2.4.1),但現在卡住了。使用EMF加載和解析XMI文件

OMG XMI Spec 2.4.1,有一個XMI架構XMI.xsdXMI-model.xmi。因此,例如,我需要通過EMF加載並解析XMI-model.xmi

我所如下進行:

  • 新在Eclipse EMF項目
  • 導入XMI模式:XMI.xsd,並得到一個xmi.genmodel文件
  • 使用xmi.genmodel生成日蝕中的所有代碼,它會生成模型代碼
  • 新建一個Junit4測試用例並嘗試l dd XMI-model.xmi文件與Junit插件測試但失敗,以下是我的代碼。

    @Test 
    public void test() throws IOException { 
        URI uri = URI 
          .createFileURI("/home/pzhengshuai/Desktop/15Feb-19Feb/XMI-model.xmi"); 
        _20110701ResourceFactoryImpl factory = new _20110701ResourceFactoryImpl(); 
        Resource resource = factory.createResource(uri); 
        Map<String, Boolean> options = new HashMap<String, Boolean>(); 
        options.put(XMLResource.OPTION_KEEP_DEFAULT_CONTENT, Boolean.TRUE); 
        resource.load(options); 
        EObject model = (EObject) resource.getContents().get(0); 
        Assert.assertNotNull(model); 
    } 
    

唯一的例外是:

org.eclipse.emf.ecore.resource.Resource$IOWrappedException: Feature 'XMIType' not found. (file:/home/pzhengshuai/Desktop/15Feb-19Feb/XMI-model.xmi, 2, 164) 

好吧,那我試圖讀取XSD文件和XMI文件,我發現存在XMI-model.xmi內部命名空間xmlns:uml="http://www.omg.org/spec/UML/20110701",所以我去了uml空間的鏈接,試圖找到UML的模式。不幸的是,在這個鏈接中,關於UML的所有文件都是en格式的XMI。

所以,我想兩個選項:

  1. 嘗試UML.xmi轉換爲UML.xsd通過使用企業架構師和Altova的XMLSpy的,和上面做同樣的東西,失敗。就我個人而言,我認爲這種轉換可能會失去一些信息。
  2. 我發現了一個類似的問題here

您可以找到OMG網站XMI XSD 2.1.1在XMI XSD,但你還需要UML架構和財政部架構。 讀取和寫入UML XMI文件的更好方法是使用Eclipse UML實現。它可以在Eclipse以外的簡單Java程序中輕鬆使用:請參閱

我遵循了答案並閱讀了有關Eclipse UML實現的文檔,但我認爲這不是我想要的。

所以我希望有人能給我一些建議。預先感謝您的幫助!

回答

0

從您的描述中,我無法告訴您確切的上下文,但XMI通常用作元模型實例的序列化格式(即「物理模式」)(類似於「邏輯模式」) 。

但是你要做的是使用XMI作爲元模型,並使用XML(與XSD模式)作爲序列化格式。這可能不是你想要的。

爲了加載使用XMI序列化的UML元模型實例,只需創建一個資源集並使用resourceSet.getResource(uri, true)加載您的.uml文件。只要你的Eclipse插件的類路徑包含UML插件作爲依賴項,這應該可以工作。