关于EMF
EMF(全称Eclipse Modeling Framework),是Eclipse组织推出的建模框架。它能够帮助软件开发人员将模型(UML, XSD等)转换成为健壮且功能丰富的Java代码。通过使用EMF,程序员编写的程序能免费的获得一个健壮的模型层,它通常比程序员自己手工编写的模型层更为健壮。事实上,有很多商业产品都使用了 EMF 来作为其模型层。由于 EMF 的广泛使用,Eclipse 组织为其推出了众多的周边模块。
Fixflow中的EMF
Fixflow引擎读写BPMN2.0模型文件都是通过EMF来实现,扩展的"fixflow:"的元素也是通过EMF提供的注入技术实现,Eclipse的流程设计器上也使用EMF去读写模型文件,
除此之外,系统里的各种.xml配置文件都是EMF完成读写,同时还涉及到了脱离Eclipse环境在web中使用EMF。
设计模型
假设我们需要通过EMF读写一个这样格式的XML文件:
1 <bookRepository> 2 <book id="1" name="我的奋斗" author="阿道夫·希特勒"></book> 3 <book id="2" name="闪击英雄" author="海因茨·古德里安"></book> 4 <book id="3" name="失去的胜利" author="冯·埃里希·曼施泰因"></book> 5 </bookRepository>
下面就根据上面XML实例来创建一个EMF模型。(当然EMF支持用一个XSD文件来生成模型,这种方式我们这里先不做介绍)
注意:下面的内容我用的是Eclipse Modeling Tools版本的Eclipse
(1) 创建一个空的EMF项目(并不一定非要是EMF项目)
(2) 项目名称EMFTest
(3) 在model目录下创建一个Diagram模型设计文件
(4) 给这个Diagram模型设计文件所对应的ecore文件起名: book.ecore
创建完成之后会同时生成两个文件,.ecore文件为模型文件,.ecorediag 为模型的设计文件用来图形化设计器EMF模型。
(5) 打开book.ecorediag文件设计模型,这里我们可以修改一下命名空间,EClass 对应到XML的Element,EAttribute对应到XML Element的字段。
(6) 创建两个EClass 分别起名 BookRepository 和 Book ,在Book类的定义中 添加三个 EAttribute id、name、author。
(7) 设置 EAttribute 的属性 ,除了名字,三个 EAttribute 采用相同的设置。
设置为attribute类型
(8)设置两个类之间的关系,添加一个 BookRepository 到 Book 的引用
继续关系设置
这样我们的模型文件设计完毕,下面我们需要来生成java代码。
生成Java代码
要生成java代码光有 .ecore文件和.ecorediag文件还不够,还需要一个.genmodel文件。
(1)创建一个.genmodel 配置文件
(2) 配置.genmodel文件
(3)生成Java模型文件
读写XML文件
模型和java代码创建完毕之后我们来创建测试类,来尝试读写一个XML文件。
创建一个 test.java 带main方法的:
1 import java.io.IOException; 2 import java.util.Collections; 3 import java.util.Map; 4 5 import org.eclipse.emf.common.util.URI; 6 import org.eclipse.emf.ecore.resource.Resource; 7 import org.eclipse.emf.ecore.resource.ResourceSet; 8 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; 9 import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; 10 import org.fixflow.model.book.Book; 11 import org.fixflow.model.book.BookFactory; 12 import org.fixflow.model.book.BookPackage; 13 import org.fixflow.model.book.BookRepository; 14 import org.fixflow.model.book.util.BookResourceImpl; 15 16 public class test { 17 18 19 public static void main(String[] args) { 20 21 // 初始化模型 22 BookPackage.eINSTANCE.eClass(); 23 24 // 创建根元素 25 BookRepository bookRepository = BookFactory.eINSTANCE.createBookRepository(); 26 27 // 创建书籍1 28 Book book = BookFactory.eINSTANCE.createBook(); 29 book.setId("1"); 30 book.setName("我的奋斗"); 31 book.setAuthor("阿道夫·希特勒"); 32 // 将创建的书创建到根元素下 33 bookRepository.getBook().add(book); 34 35 // 创建书籍2 36 book = BookFactory.eINSTANCE.createBook(); 37 book.setId("2"); 38 book.setName("闪击英雄"); 39 book.setAuthor("海因茨·古德里安"); 40 // 将创建的书创建到根元素下 41 bookRepository.getBook().add(book); 42 43 // 创建书籍3 44 book = BookFactory.eINSTANCE.createBook(); 45 book.setId("3"); 46 book.setName("失去的胜利"); 47 book.setAuthor("冯·埃里希·曼施泰因"); 48 // 将创建的书创建到根元素下 49 bookRepository.getBook().add(book); 50 51 //注册XML扩展 52 Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; 53 Map<String, Object> m = reg.getExtensionToFactoryMap(); 54 m.put("xml", new XMIResourceFactoryImpl()); 55 56 // 创建一个资源 57 BookResourceImpl resource = new BookResourceImpl(URI.createURI("modelfile/book.xml")); 58 59 //设置文件编码 60 resource.setEncoding("UTF-8"); 61 //将模型保存到资源中 62 resource.getContents().add(bookRepository); 63 64 try { 65 //保存文件 66 resource.save(Collections.EMPTY_MAP); 67 } catch (IOException e) { 68 e.printStackTrace(); 69 } 70 71 //加载测试 72 load(); 73 74 75 } 76 77 public static BookRepository load() { 78 // 初始化模型 79 BookPackage.eINSTANCE.eClass(); 80 81 // 注册XML扩展 82 Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; 83 Map<String, Object> m = reg.getExtensionToFactoryMap(); 84 m.put("xml", new XMIResourceFactoryImpl()); 85 86 //创建一个 资源 ResourceSet 87 ResourceSet resSet = new ResourceSetImpl(); 88 89 // 获取资源 90 Resource resource = resSet.getResource(URI.createURI("modelfile/book.xml"), true); 91 92 //或者根节点 93 BookRepository bookRepository = (BookRepository) resource.getContents().get(0); 94 95 return bookRepository; 96 } 97 }
下面运行测试类之后生成文件:
至此一个最简单的XML文件通过EMF来读写的功能已经介绍完了,在后面的章节中我还会详细介绍EMF提供的高级功能。
相关推荐
- 可以通过Eclipse的EMF插件自动生成Ecore模型,或者手动编写.xmi文件来定义模型。 - 一旦模型创建完成,EMF会生成Java代码,这些代码提供了对模型实例的访问和操作。 3. **XML绑定(XMI和XSD)** - XMI(XML ...
2. **数据解析**:编写代码来读取 SPL 文件的各个部分,解析出打印作业的元数据,如页数、分辨率、颜色模式等。这一步可能涉及到二进制流的读取和解析,以及对GDI命令的理解。 3. **GDI命令转换**:SPL 文件包含的...
在"emf-xsd-SDK-2.6.1"的压缩包中,包含了Eclipse环境的相关文件,这通常意味着我们可以在这个环境中开发和测试基于EMF和XSD的模型应用。Eclipse是一个集成开发环境(IDE),支持多种编程语言和插件,EMF相关的插件...
EMF(Enhanced Metafile)文件是Windows操作系统中使用的一种矢量图形和图元文件格式。这种文件类型被广泛用于存储图形、图像和打印数据,因为它支持复杂的图形操作,如曲线绘制、渐变填充和透明效果。EMF文件是GDI+...
了解MS-EMF规范对于研究EMF文件格式是至关重要的,尤其是在开发需要解析或创建EMF文件的应用程序时。 微软在发布其开放规范(Open Specifications)文档时,采取了特定的知识产权政策。这些政策允许开发者复制和...
- **高效性**:EMF文件通过优化的数据结构来减少文件大小,提高传输和处理效率。 #### 三、EMF格式的技术细节 EMF文件本质上是由一系列命令组成的指令集,这些命令用于描述构成图像的各种元素,如线条、形状、颜色...
总的来说,"emf-sdo-xsd-SDK-2.3.2.zip"是一个强大的工具,它结合了EMF的模型驱动开发能力、SDO的数据访问统一性以及XSD的结构定义,为开发者提供了构建基于模型的XML数据处理系统的一站式解决方案。在Java Swing...
EMF-Edit 允许开发者快速创建与 Ecore 模型相关的图形界面,以直观地操纵和展示模型数据。 4. **GEF (Graphical Editing Framework)**: "GEF Tutorial 2005.ppt" 是 GEF 的教程,它是一个用于在 Eclipse 平台上开发...
在C#中,由于.NET Framework并未提供直接将SPL转换为EMF的内置功能,我们需要依赖第三方库或自定义代码来实现这一转换。SnailDev.EmfParser-master这个压缩包可能包含了一个名为`SnailDev.EmfParser`的库,这个库...
通过阅读这份文档,读者可以了解到如何创建、编辑和解析EMF文件,以及EMF在应用程序中的使用方式,比如打印、图像处理和图形显示。 **emf.hlp**:这是一个帮助文件,通常用于提供快速查询和参考。在这个文件中,...
标题中的“gef写的tree例子--模型修改为emf”指的是使用GEF(Graphical Editing Framework)框架创建的一个树形视图示例,并且这个示例的模型已经转换为使用EMF(Eclipse Modeling Framework)来管理。这涉及到两个...
EMF是Eclipse项目中的一个子项目,它提供了一种创建、操作和共享复杂的领域特定语言(DSL)模型的框架。EMF.compare允许用户比较两个EMF模型实例,识别它们之间的差异,并可选择性地合并这些差异。 这篇博客文章...
1. **模型定义**:通过扩展XML Schema Definition (XSD) 或者ECORE(EMF的元数据模型)来定义模型结构。ECORE是一种元元模型,用于描述任何概念模型,它是EMF的基础。 2. **代码生成**:根据模型定义自动生成Java类...
EMF (Enhanced Metafile) 是Windows操作系统中用于存储矢量图形和光栅图像的文件格式,它在处理复杂的图形和图像是非常有效。而PNG(Portable Network Graphics)则是一种无损压缩的位图格式,广泛应用于网页设计、...
标题中提到的"emf-runtime"是指EMF运行时环境,它是EMF的核心组成部分,包含了运行时类库和API,用于支持模型对象的创建、操作和持久化。这个环境使得开发者能够在应用程序中使用EMF模型,而无需关心底层实现的复杂...
【标题】"emf-xsd-Update-2.7.2" 涉及到的是一个针对Eclipse集成开发环境的扩展,主要关注的是EMF(Eclipse Modeling Framework)和XSD(XML Schema Definition)的更新版本2.7.2。这个更新包包含了对EMF框架的增强...
"emf-runtime-2.5.0.zip" 是一个包含EMF运行时库的压缩文件,版本为2.5.0。这个版本可能包含了对模型对象的创建、序列化、反序列化以及与模型相关的事件处理等功能。它对于那些希望在Eclipse环境下开发图形化编辑器...
3. **模型操作**:EMF提供了丰富的API,包括创建、修改、查询模型对象,以及保存和加载模型到XML文件。 4. **图形化编辑器**:EMF集成了GEF(Graphical Editor Framework),可以快速构建基于模型的图形化编辑器,...
它提供了元数据框架,使得开发人员可以利用模型驱动的开发方法来创建、管理和操作数据模型。SDO(Service Data Objects)是Oracle公司提出的一种数据访问技术,目的是提供一种统一的数据访问接口,以便于在不同数据...