更新时间:2022-10-29 13:05
XML元数据交换(XML Metadata Interchange),简称XMI,是由OMG组织开发的,它是统一建模语言UML模型中元数据的标准交换方式。
XMI集成了三种工业标准:W3C组织提出的XML、OMG组织提出的元对象设施MOF(Meta-Object Facility)和UML。XMI标准已经广泛地集成到各种UMLCASE工具中,如Rational公司著名的软件工程工具Rose提供了XMI插件,用于引入和导出UML模型,如图1所示。用户通过Rational Rose的XMI插件导出UML模型并保存为XMI文档,也可以将UML模型从XMI文档引入到Rational Rose中。
XMI是基于XML技术发展起来的一种标记语言,它继承了XML的所有特征:XMI是结构化的文档;XMI中使用的标签可以扩展;XMI文档的解析方式有DOM和SAX两种;XMI使用DTD或XML Schema定义语法。XMI标准是交换UML模型数据的桥梁。
在XMI的语法中,定义了一些固定的标签表示UML模型。经常使用的是“XMI.header”和“XMI.content”。通常“XMI.header”标签所包含的内容是模型的附属信息,例如该模型的名称、元模型等。标签“XMI.content”包含的是实际的模型数据。下面是一个XMI文档的例子,包含了一个简单的UML模型。
IBM公司开发了XMI工具包,并将其应用到Eclipse Modeling Framework(EMF)中。EMF是IBM开发的可将UML模型数据转换为一系列java类和源代码的工具。用户使用IBM公司的XMI工具包从Rational Rose导出的XMI文档中引入UML模型到EMF中,之后EMF可对引入的UML模型数据进行操作,并能产生Java类和程序代码。由于IBM EMF和Rational Rose两种软件都支持XMI标准,所以任何使用这两种软件的公司之间都能实现UML模型的数据交换。
图2所示描述了 XML元数据交换算法的原理。元数据交换算法包括应用程序、XML解析器组件和 XML 模板等部分。其中,XML 解析器组件实现对元数据的读写操作,并向应用程序提供若干接口;应用程序可以利用组件提供的接口实现对元数据的写入和读取,而无须知道读写的细节;XML 模板文档由应用程序的开发者提供,向组件提供要读写变量的详细信息。XML 模板文档相当于应用程序和组件共同遵守的一个用来描述元数据信息的规则集,组件可以通过解析 XML 模板文档来辨别出应用程序中需要交换的元数据信息。应用程序通过调用组件公开的接口来对元数据进行存取操作,而无须知道实现存取的细节。组件根据接口参数传入的元数据名称,在 XML 模板文档中找到相应的元数据信息,然后识别出它的具体信息,从而实现对该元数据的存取。由于组件通过 XML 模板文档推断出要交换存取的元数据信息,因此组件端一旦交由应用程序使用,就可以不加改变地交换不同应用程序中的元数据。
XML 文档模板的创建原则是各应用程序和组件端之间必须遵循统一规则。电子试卷生成规则的 XML 文档模板中元数据信息采用类对象描述方式,统一表达为 :
其中,testDocument 是 XML 文本模板文件交换元数据部分的开始标签;baseInfo, pageSetting, examInfo 是 3 个基本类信息标签,baseInfo 存储课程名称与学生基本信息;pageSetting存储电子试卷的页面设置信息用于控制试卷的显示与打印,examInfo 存储试卷的详细信息,包括试题信息,学生的作答情况和教师的评判情况;hashCode 标签用于保存考试试卷的数字签名信息,保证电子试卷的完整性,防止试卷被恶意篡改。在学生考试过程中生成试卷时,标准答案项与教师评判项标签均为空,在教师评卷时此类信息才会被加入到试卷中,以供打印或评估时查阅。
各应用程序之间均采用统一规则的 XML 文本流模板作为元数据交换的接口标准,通过 XML 解析器对不同应用程序中的元数据进行解析与处理,此类操作与应用程序本身无关。应用程序与 XML 解析器之间通过接口函数实现数据存储。该接口函数的形式说明如下:
bool SetKeyValue(XmlDocument xmlDoc, string keyName, string attributeName, string stringValue)
其中,参数 xmlDoc 表示要操作的 XML 文档;keyName 表示要存储的节点名;attributeName 表示要设置的节点 keyName中所包含的属性名;stringValue 为要存储的数据。
应 用 程 序 通 过 调 用 接 口 函 数 SetKeyValue(xmlDoc,keyName, stringValue)向 XML 解析器传入参数,XML 解析器在XML模板文档中搜寻名称为keyName的元素或元素属性,找到后再对该元素或其包含的属性赋值。SetKeyValue 的实现关键代码如下: