`

Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件

阅读更多

 

关于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提供的高级功能。

 

分享到:
评论

相关推荐

    EMF读取XML

    - 可以通过Eclipse的EMF插件自动生成Ecore模型,或者手动编写.xmi文件来定义模型。 - 一旦模型创建完成,EMF会生成Java代码,这些代码提供了对模型实例的访问和操作。 3. **XML绑定(XMI和XSD)** - XMI(XML ...

    打印监控 spl文件解析成emf文件

    2. **数据解析**:编写代码来读取 SPL 文件的各个部分,解析出打印作业的元数据,如页数、分辨率、颜色模式等。这一步可能涉及到二进制流的读取和解析,以及对GDI命令的理解。 3. **GDI命令转换**:SPL 文件包含的...

    emf-xsd-SDK-2.6.1

    在"emf-xsd-SDK-2.6.1"的压缩包中,包含了Eclipse环境的相关文件,这通常意味着我们可以在这个环境中开发和测试基于EMF和XSD的模型应用。Eclipse是一个集成开发环境(IDE),支持多种编程语言和插件,EMF相关的插件...

    EMF文件提取文本,预览,打印

    EMF(Enhanced Metafile)文件是Windows操作系统中使用的一种矢量图形和图元文件格式。这种文件类型被广泛用于存储图形、图像和打印数据,因为它支持复杂的图形操作,如曲线绘制、渐变填充和透明效果。EMF文件是GDI+...

    MS-EMF spec

    了解MS-EMF规范对于研究EMF文件格式是至关重要的,尤其是在开发需要解析或创建EMF文件的应用程序时。 微软在发布其开放规范(Open Specifications)文档时,采取了特定的知识产权政策。这些政策允许开发者复制和...

    微软emf文件格式详解

    - **高效性**:EMF文件通过优化的数据结构来减少文件大小,提高传输和处理效率。 #### 三、EMF格式的技术细节 EMF文件本质上是由一系列命令组成的指令集,这些命令用于描述构成图像的各种元素,如线条、形状、颜色...

    emf-sdo-xsd-SDK-2.3.2.zip

    总的来说,"emf-sdo-xsd-SDK-2.3.2.zip"是一个强大的工具,它结合了EMF的模型驱动开发能力、SDO的数据访问统一性以及XSD的结构定义,为开发者提供了构建基于模型的XML数据处理系统的一站式解决方案。在Java Swing...

    Eclipse-EMF-GEF资料.rar

    EMF-Edit 允许开发者快速创建与 Ecore 模型相关的图形界面,以直观地操纵和展示模型数据。 4. **GEF (Graphical Editing Framework)**: "GEF Tutorial 2005.ppt" 是 GEF 的教程,它是一个用于在 Eclipse 平台上开发...

    C# 将打印机临时缓存文件SPL转为图片文件EMF

    在C#中,由于.NET Framework并未提供直接将SPL转换为EMF的内置功能,我们需要依赖第三方库或自定义代码来实现这一转换。SnailDev.EmfParser-master这个压缩包可能包含了一个名为`SnailDev.EmfParser`的库,这个库...

    gef写的tree例子--模型修改为emf

    标题中的“gef写的tree例子--模型修改为emf”指的是使用GEF(Graphical Editing Framework)框架创建的一个树形视图示例,并且这个示例的模型已经转换为使用EMF(Eclipse Modeling Framework)来管理。这涉及到两个...

    emf文件格式详解

    通过阅读这份文档,读者可以了解到如何创建、编辑和解析EMF文件,以及EMF在应用程序中的使用方式,比如打印、图像处理和图形显示。 **emf.hlp**:这是一个帮助文件,通常用于提供快速查询和参考。在这个文件中,...

    EMF模型文件对比/比较(emf.compare)

    EMF是Eclipse项目中的一个子项目,它提供了一种创建、操作和共享复杂的领域特定语言(DSL)模型的框架。EMF.compare允许用户比较两个EMF模型实例,识别它们之间的差异,并可选择性地合并这些差异。 这篇博客文章...

    emf-runtime-2.6.1

    1. **模型定义**:通过扩展XML Schema Definition (XSD) 或者ECORE(EMF的元数据模型)来定义模型结构。ECORE是一种元元模型,用于描述任何概念模型,它是EMF的基础。 2. **代码生成**:根据模型定义自动生成Java类...

    将EMF图片格式转换成PNG

    EMF (Enhanced Metafile) 是Windows操作系统中用于存储矢量图形和光栅图像的文件格式,它在处理复杂的图形和图像是非常有效。而PNG(Portable Network Graphics)则是一种无损压缩的位图格式,广泛应用于网页设计、...

    emf-runtime,eclipse modeling framework

    标题中提到的"emf-runtime"是指EMF运行时环境,它是EMF的核心组成部分,包含了运行时类库和API,用于支持模型对象的创建、操作和持久化。这个环境使得开发者能够在应用程序中使用EMF模型,而无需关心底层实现的复杂...

    emf-xsd-Update-2.7.2

    【标题】"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-runtime-2.5.0.zip" 是一个包含EMF运行时库的压缩文件,版本为2.5.0。这个版本可能包含了对模型对象的创建、序列化、反序列化以及与模型相关的事件处理等功能。它对于那些希望在Eclipse环境下开发图形化编辑器...

    java开发工具EMF插件

    3. **模型操作**:EMF提供了丰富的API,包括创建、修改、查询模型对象,以及保存和加载模型到XML文件。 4. **图形化编辑器**:EMF集成了GEF(Graphical Editor Framework),可以快速构建基于模型的图形化编辑器,...

    emf-sdo-xsd-SDK-2.0.1.zip

    它提供了元数据框架,使得开发人员可以利用模型驱动的开发方法来创建、管理和操作数据模型。SDO(Service Data Objects)是Oracle公司提出的一种数据访问技术,目的是提供一种统一的数据访问接口,以便于在不同数据...

Global site tag (gtag.js) - Google Analytics