精通xmi

本专栏目前专注于建模,UML和XML。 更具体地说,我正在探索将UML建模用于XML开发,尤其是XSLT样式表如何通过自动派生提供帮助。

由于XML已成为开发项目中的常见功能,因此许多开发人员对将XML与他们的其余开发集成起来越来越感兴趣。 尽管许多组织仍使用临时工具来进行XML开发,但趋势是采用已经用于其他开发需求(例如Java技术)的相同XML方法论(或至少一套通用工具)。 ,数据库或Web。

自动推导

如上一专栏所述,模型是对系统的简化描述,可以帮助进行计算和预测。 在本文的上下文中,系统始终是XML词汇表。

图1将建模周期说明为模型的连续体。 第一个模型绘制在白板(或一张纸)上,并且往往是非正式的。 在此阶段,目标是给所有参与者(用户,开发人员,设计师)一个自由表达自己的机会。

图1.连续的模型

下一步是绘制一个UML模型(如果词汇很复杂,则可以绘制几个模型)。 UML模型更为完善和形式化,但由于它主要用作团队成员之间的沟通工具,因此仍具有综合性和可读性。

最后一个模型是XML模式,这是所有模式中最精确的一种。 它的目标是允许解析器根据词汇表定义来验证XML文档,以便它可以放弃可读性,而倾向于精度。

所有这些模型之间的主要区别是它们的目标:从非正式交流到解析器进行精确的正式验证。 区别不在于模型的性质(XML词汇表的简化描述),而在于每种模型提供的帮助级别。

如果您考虑到模型的连续性,从最不精确的模型到最正式的模型,则有必要研究一下自动推导 -从较早的模型自动生成一个模型的过程。 显然,仅当两个模型具有相同的描述性时,自动推导才能很好地工作,这与某些模型的描述性强于其他模型的思想产生了冲突。 下一节将讨论模型中描述的不同层次。 在这里,我将专注于推导。

XML元数据交换(XMI)

您会从上一期中回想起我是通过XMI和XSLT实现自动派生的。 假设你已经熟悉XML模式(如果你不是,请参阅相关信息 ),我将在本节介绍XML元数据交换(XMI)。

词汇和兼容性

XMI是一个复杂的规范(1.2版超过400页),因此,在本文中,我将局限于自动派生所需的最低限度的描述。

XMI不指定XML词汇表,而是指定一种为元模型生成词汇表的算法 。 换句话说,XMI不会像您期望的那样定义ClassAttributeAssociation或其他标签。 相反,XMI指定如何为元模型中的概念创建标签。 我知道有很多模型可以使用,但请耐心等待-稍后它会变得更加清晰。

因此,XMI与其说是框架,不如说是词汇。 不幸的是,这意味着没有两个工具以相同的方式解释该框架。 同一工具的不同版本之间也存在差异:Rational Rose最初是通过Unisys开发的附件来支持XMI的。 最新版本的Rational XDE具有对XMI的内置支持,但这是一个稍微不同的变体。 差异不一定显着,但可能会导致不兼容。 在实践中,将样式表定位到社区中使用的一个或两个工具是有意义的,而不必担心其余的工具。

在本文中,我将坚持使用OMG发布的示例,而不是采用一个特定版本的XMI。 尽管没有工具可以直接与样品兼容,但这是良好的中间立场。 使它们适应您选择的工具将不会很困难。

XMI标头

尽管XMI主要指定一种算法,但它还定义了一些标签和属性。 您将需要以下内容:

  • XMI始终是根元素。 它必须具有xmi.version属性(有效版本为1.0、1.1、1.2和2.0)。
  • XMI.header是有关模型信息的占位符。 它最重要的子级是XMI.documentationXMI.metamodel
  • XMI.documentation将最终用户信息保留为以下子元素(其名称不言自明):
    • XMI.owner
    • XMI.contact
    • XMI.longDescription
    • XMI.shortDescription
    • XMI.exporter
    • XMI.exporterVersion
    • XMI.exporterID
    • XMI.notice
  • XMI.metamodel记录了已应用XMI算法的元模型-在这种情况下,是UML元模型(XMI与其他元模型(如Metaobject Facility,MOF,也由OMG发布)一起工作)。
  • XMI.content包含实际模型。
  • xmi.idxmi.idref是用于编码链接的属性: xmi.id是元素标识符,必须唯一。 xmi.idref是通过其标识符对元素的引用。

元模型

UML 元模型是描述UML语言的模型-具体地说,它描述了UML语言中的类,属性,关联,包,协作,用例,参与者,消息,状态以及所有其他概念。 为了保持一致性,元模型是用UML编写的。

前缀“元”表示元模型描述了模型的模型。 同样,XML是一种元语言,因为它是一种描述语言的语言。

UML元模型在UML规范中发布。 更具体地说,XMI使用UML规范的第5章中描述的“ UML模型交换”(请参阅参考资料 )。

请注意,UML元模型相当庞大且令人生畏。 我只能在本文中为您介绍一下。 图2是描述类的元模型的摘录,类是类图中的核心概念之一。

图2.类的元模型

在元模型中,类概念被建模为继承自抽象元类Classifier的元类Class 。 分类器是类,接口和数据类型的父类(后两个未在图2中表示)。 继承链将继续: GeneralizableElement ,它表示所有可以推广(继承自)的概念; ModelElement ,代表模型中的所有抽象(例如名称空间,约束和类); 最后是Element ,最顶层的元类。 这些元类均具有继承自Class的属性。

XMI变体

很少有供应商记录其XMI变体。 解决方法是创建一个小型模型并将其导出。 在文本编辑器中打开文件并查看。

XMI元素和属性( XMI.headerXMI.contentxmi.id )用作通过文件的路线图。

从元模型中查找主要元素(例如Class,Attribute,Association),并查看它们如何映射到XML。 如果您有方便的元模型摘录,那么它会有所帮助。

区别主要是表面上的:似乎没有两个应用程序使用相同的名称空间。 一些应用程序将元模型属性编码为XML元素,而其他应用程序则使用XML属性(如清单1所示 )。 实际上,与元模型进行比较时,很容易识别出差异。

分类符和要素之间存在一个合成,该合成是StructureFeature的父代。 属性是从StructuralFeature派生的。

对元模型感到困惑? 尝试忘记它是一个元模型,尝试忘记它是关于UML的,然后将其视为普通模型。 图2只是指出了类的概念,它是一个高度专业化的元素,与接口和数据类型相关(通过继承自Classifier)。 类具有名称,可见性和更多属性。 最后,在类和属性之间存在关联。

因此, 图2正式表示一个类具有名称,可见性和其他属性,并且可以具有属性。 实际上,图2是UML类的定义。 如果您感到困惑,那可能是因为定义本身是用UML编写的!

我故意简化了图1,以忽略名称空间,约束,构造型,继承以及使类成为类的许多其他方面。 相信我,它们包含在完整的UML元模型中,但是对本文没有帮助。

为什么要打扰元模型? 因为当您将其提供给XMI算法时,您会获得UML的XML词汇表。 例如,清单1是图3的XMI表示(使用规范中说明的XMI的变体-参见上文 ):

图3.地址的UML模型
清单1.导出到XMI的地址
<?xml version="1.0"?>
<XMI xmi.version="1.2" xmlns:UML="org.omg/UML/1.4"><XMI.header><XMI.documentation><XMI.exporter>ananas.org stylesheet</XMI.exporter></XMI.documentation><XMI.metamodel xmi.name="UML" xmi.version="1.4"/></XMI.header><XMI.content><UML:Model xmi.id="M.1" name="address" visibility="public"isSpecification="false" isRoot="false"isLeaf="false" isAbstract="false"><UML:Namespace.ownedElement><UML:Class xmi.id="C.1" name="address" visibility="public"isSpecification="false" namespace="M.1" isRoot="true"isLeaf="true" isAbstract="false" isActive="false"><UML:Classifier.feature><UML:Attribute xmi.id="A.1" name="name" visibility="private"isSpecification="false" ownerScope="instance"/><UML:Attribute xmi.id="A.2" name="street" visibility="private"isSpecification="false" ownerScope="instance"/><UML:Attribute xmi.id="A.3" name="zip" visibility="private"isSpecification="false" ownerScope="instance"/><UML:Attribute xmi.id="A.4" name="region" visibility="private"isSpecification="false" ownerScope="instance"/><UML:Attribute xmi.id="A.5" name="city" visibility="private"isSpecification="false" ownerScope="instance"/><UML:Attribute xmi.id="A.6" name="country" visibility="private"isSpecification="false" ownerScope="instance"/></UML:Classifier.feature></UML:Class></UML:Namespace.ownedElement></UML:Model></XMI.content>
</XMI>

注意清单1中的XML元素和属性如何与图2中的类和属性匹配。 现在您已经全面了解了:XMI文档是UML元模型的直接表示,因为UML元模型是UML本身的描述。

表现方面

UML元模型的一部分处理概念的视觉表示-在屏幕上绘制概念的位置。 我没有在样式表中处理该信息,原因有两个:

  • 从UML模型派生XML模式时,不需要它。
  • 从XML模式派生UML模型时,要产生视觉输出是极其困难的。 一个更合理的选择是在建模工具中打开模型,并花费几分钟准备屏幕上模型的可视化表示。 样式表完成了最艰苦的工作(正确定义)。

XSLT样式表

既然您拥有读取XMI文件的关键,就可以轻松地将XMI标签映射到它们的XML模式等效项。 一种可能的映射是:

  • UML:Model变成xs:schema ; 其目标名称空间是从模型名称派生的。
  • UML:Class成为全局XML元素声明( xs:element )。
  • UML:Attribute成为本地XML元素声明( xs:element )。

清单2是实现映射的XSLT样式表:

清单2. XML模式派生
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:UML="org.omg/UML/1.4"exclude-result-prefixes="UML"version="1.0"><xsl:output indent="yes"/><xsl:template match="XMI[@xmi.version='1.2']"><xsl:apply-templates select="XMI.content/UML:Model"/>
</xsl:template><xsl:template match="XMI"><xsl:message terminate="yes">Unknown XMI version</xsl:message>
</xsl:template><xsl:template match="UML:Model"><xs:schema targetNamespace="http://psol.com/uml/{@name}"><xsl:apply-templates/></xs:schema>
</xsl:template><xsl:template match="UML:Namespace.ownedElement/UML:Class"><xs:element name="{@name}"><xs:complexType><xs:sequence><xsl:apply-templates/></xs:sequence></xs:complexType></xs:element>
</xsl:template><xsl:template match="UML:Attribute"><xs:element name="{@name}" type="xs:string"/>
</xsl:template><xsl:template match="text()"><xsl:value-of select="normalize-space(.)"/>
</xsl:template></xsl:stylesheet>

显然, 清单2中的样式表仍然非常有限(并且它执行非常有限的错误检查),因为它仅支持UML元模型的一小部分。 它忽略包,接口,关联等。 到目前为止,您可以通过对过程的简单扩展来丰富样式表并支持这些概念:研究UML元模型的适当部分,定义到XML模式的映射,并实现它。

反之亦然

如果遵循正常的建模工作流程, 清单2将非常方便:从最不详细的模型到最详细的模型。 通常,您会发现XML模式已经存在,并且应该作为您工作的起点。 重新创建UML模型非常繁琐,因此实现反向映射的样式表非常方便。 清单3是一个示例:

清单3.反向派生(从XML模式到UML)
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:UML="org.omg/UML/1.4"exclude-result-prefixes="xs"version="1.0"><xsl:output indent="yes"/><xsl:template match="xs:schema"><XMI xmi.version="1.2"><XMI.header><XMI.documentation><XMI.exporter>dW simple stylesheet</XMI.exporter></XMI.documentation><XMI.metamodel xmi.name="UML" xmi.version="1.4"/></XMI.header><XMI.content><UML:Model xmi.id="{generate-id()}" name="{substring-after(@targetNamespace,'http://psol.com/uml/')}"visibility="public" isSpecification="false"isRoot="false" isLeaf="false" isAbstract="false"><UML:Namespace.ownedElement><xsl:apply-templates/></UML:Namespace.ownedElement></UML:Model></XMI.content></XMI>
</xsl:template><xsl:template match="xs:element"><UML:Class xmi.id="{generate-id()}" name="{@name}"visibility="public" isSpecification="false" isRoot="true"isLeaf="true" isAbstract="false" isActive="false"><xsl:apply-templates/></UML:Class>
</xsl:template><xsl:template match="xs:sequence"><UML:Classifier.feature><xsl:apply-templates/></UML:Classifier.feature>
</xsl:template><xsl:template match="xs:sequence/xs:element"><UML:Attribute xmi.id="{generate-id(.)}" name="{@name}"visibility="private" isSpecification="false"ownerScope="instance"/>
</xsl:template></xsl:stylesheet>

走向更全面的样式表

如果说我在本文中介绍的样式表过于简单,那是轻描淡写。 它们的长度少于50行,并且只处理UML元模型的一小部分。 现实世界的样式表可以识别更多的UML概念,并且通常包含500行或更多行。 在本期文章中,我的目标是介绍自动模型推导背后的概念:

  • 甚至模型(UML,XML模式)也表示为数据集。 这个特殊的数据集称为元模型。
  • 您可以在UML元模型和XML模式之间建立映射。
  • 您可以在XSLT样式表中实现映射。
  • UML和XML模式只是同一现实的不同表示。 它们之所以不同是因为它们服务于不同的目标。

在本文中,我不得不进行简化。 如果尝试扩展清单2和3中的样式表,则可能会遇到两个问题:

  • UML模型可能不够具体(因为它是一个高级视图),无法实现XML模式(低级,详细模型)的有意义的派生。
  • 您可能会在UML元模型和XML模式之间找到多个明智的映射。

下两个专栏文章的主题是解决这两个问题。


翻译自: https://www.ibm.com/developerworks/xml/library/x-wxxm24/index.html

精通xmi

精通xmi_UML,XMI和代码生成,第2部分相关推荐

  1. 使用 XML: UML、XMI 和代码生成,第 1 部分

    随着 XML 成为主流,人们越来越关心 XML 应用程序的设计.更具体地说,许多组织希望把 XML 应用程序的设计与他们的其他应用程序设计结合起来.采用一种通用的方法--或者至少一组通用的工具--是值 ...

  2. 使用 XML: UML、XMI 和代码生成,第 4 部分

    本文是关于使用工业标准 UML 对 XML 应用程序建模的系列文章的最后一篇.上一期(请参阅 参考资料)留下了一个问题:如果 UML 模型和 XML 词汇表之间存在多种可能的关系怎么办?本文进一步升华 ...

  3. 使用 XML: UML、XMI 和代码生成,第 2 部分

    本专栏当前的话题是建模.UML 和 XML.具体而言,即研究 UML 建模在 XML 开发中的应用,特别是如何用 XSLT 样式表实现自动派生. 随 着 XML 成为开发项目的一种常见特性,很多开发人 ...

  4. 使用 XML: UML、XMI 和代码生成,第 3 部分

    在 使用 XML专栏的前两期文章中,我讨论了建模,更具体地说是在 XML 应用程序开发中使用 UML 建模.建模是 XML 开发中一个重要的方面.不管怎么说,XML 是一种结构化语言,因此构成和组织信 ...

  5. simulink仿真及代码生成技术入门到精通_行星排混动从入门到精通(结构)

    ​希望关注本专栏的朋友,也能一并关注微信公众号. ​原文地址:行星排混动从入门到精通(结构) 行星齿轮机构结构在我们的行业生产中有着广泛的运用.如:AT变速箱(带变矩器的那种).电机减速器.后桥差速器 ...

  6. simulink仿真及代码生成技术入门到精通_Simulink仿真零基础入门到精通实用教学教程 自学全套...

    Simulink仿真零基础入门到精通实用教学教程 自学全套,以教程文字为主,毕业论文和报告均可以借鉴. Simulink是电气工程必学的模型仿真专业工具软件,非常的实用.小编在全网中搜索都没有找到非常 ...

  7. 编译优化 | LLVM代码生成技术详解及在数据库中的应用

    简介:作者:长别 1. 前言 随着IT基础设施的发展,现代的数据处理系统需要处理更多的数据.支持更为复杂的算法.数据量的增长和算法的复杂化,为数据分析系统带来了严峻的性能挑战.近年来,我们可以在数据库 ...

  8. c语言随机生成int64_t类型的数据_手把手教你代码生成(上):MATLAB代码生成

    FrancisZhao:专栏文章列表以及一些说明​zhuanlan.zhihu.com FrancisZhao:手把手教你代码生成(下):SIMULINK代码生成​zhuanlan.zhihu.com ...

  9. [1.1]XMI 与UML结合开发企业应用中业务模型

    随着 XML 成为主流,人们越来越关心 XML 应用程序的设计.更具体地说,许多组织希望把 XML 应用程序的设计与他们的其他应用程序设计结合起来.采用一种通用的方法--或者至少一组通用的工具--是值 ...

最新文章

  1. SQL中返回一个字符串在另一个中存在的次数
  2. html基础实验的实验原理,html网页设计实验报告.doc
  3. 01背包问题dp优化
  4. Android 编译环境的依赖库安装
  5. 算法训练营03-数组链表
  6. kali linux wifi监听模式,无线渗透教程1:监听无线网络
  7. php接收get数组数据,php-如何从wordpress数据库中获取数组值get_results
  8. cba篮球暂停次数和时间_CBA一场比赛每支球队可以叫多少次暂停
  9. 递归算法设计 —— 选择排序和冒泡排序
  10. python最短路径例子_[python]dijkstra 算法的 加权的最短路径 案例
  11. Dynamics CRM2013/2015 禁止欢迎屏幕(Disable the Welcome Screen)
  12. 手写Spring+demo+思路
  13. 最小二乘法及其代码实现
  14. 医保种类及医疗保险待遇
  15. 基于Springboot的学生信息管理系统
  16. 高速工业相机应用领域
  17. 异常检测之孤立森林算法详细解释且配上代码运行实例
  18. 《MySQL安装流程详解》及《MySQL安装一直失败,重新安装显示已安装》
  19. html5绘制图形幸运大转盘,幸运大转盘 - 慧编程 - 专注于青少年 STEAM 教育的图形化编程平台...
  20. 在绝望中寻找希望,把自己逼上成功

热门文章

  1. Rockchip(瑞芯微)平台高速上手指南
  2. RK3128 Android4.4蓝牙音箱模式开发总结
  3. 铁路购票系统的简单座位分配算法
  4. 行政区划数据方案设计
  5. iPhone导入电脑图片视频报错(系统没有发挥作用)
  6. 数组习题(7):电文加密
  7. 最新CPU、显卡性能天梯图
  8. 魔改MUI离线打包app解决拔插扫描枪重启app问题及指定App的mainactivity
  9. 怎样区分中文汉字和日文汉字
  10. 互联网公司招聘--阿里巴巴--数据分析--2017年笔试题