一种将UML类图转化成XML文档模式的方法
1. 引言
UML
是Unified Modeling Language(统一建模语言)的缩写,它定义了一个用于简化系统模型的标准语言和图形符号。UML是分析、设计软件系统时广泛采用的标准。XML是eXtensible Markup Language(可扩展置标语言)的缩写,它定义了一种描述数据、交换数据的标准,也可以作为原语言定义其它的标准。W3C XML Schema是2001年5月通过的用于描述XML文档结构的模式语言。它具有丰富的数据类型和强大的数据结构定义及约束功能、用标准XML格式表示.支持命名空间、具有广泛的应用前景等优点。
现有的系统有很大一部分是基于RUP建模技术建立的模型,都是通过UML图来描述整个系统的。为了方便与其他系统的数据的交换,需要将数据转化成用XML描述的。通过对类与类之间的关系的研究,给出了一种将UML类图转化成XML Schema的方法。
2. UML和XML Schema
2.1 UML
UML
是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它溶入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计
,
还支持从需求分析开始的软件开发的全过程。作为一种建模语言
,UML
的定义包括
UML
语义和
UML
表示法两个部分:
●
UML
语义 描述基于
UML
的精确元模型定义。元模型为
UML
的所有元素在语法和语义上提供了简单、一致、通用的定义性说明
,
使开发者能在语义上取得一致
,
消除了因人而异的最佳表达方法所造成的影响。此外
UML
还支持对元模型的扩展定义。
●
UML
表示法 定义
UML
符号的表示法,为开发者或开发工具使用这些图形符号和文本语法为系统建模提供了标准。这些图形符号和文字所表达的是应用级的模型,在语义上它是
UML
元模型的实例。
2.2 XML Schema
XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了文档的结构和内容模式。相应的一套精巧的规则指定了每个Schema元素或者属性的合法用途。如果违反这些规则解析器就会拒绝解析你的Schema以及任何同它相联系的文档。
XML Schema通过元素以及元素的属性和类型来描述对象。元素的类型可以使简单类型,也可以是复杂类型。元素之间的约束描述了元素之间的关联重数。元素的类型是复杂类型,复杂类型的元素的类型又是复杂类型,这样就构成了一个树状的分层的结构。这样一个树状层级结构描述了类和类之间的层级关系。
3. UML类图和XML Schema之间的映射
UML
类图中主要描述了三类语义:继承,聚合
/
组合和关联。继承通过一个带三角箭头的直线表示类
A
是类
B
的基类。聚合通过一个带菱形的直线表示类
A
是类
B
的组成部分。关联时通过一条两边都有约束的直线表示类
A
和类
B
之间有满足约束关系的联系。下面通过对这三种情况的分别讨论,给出了
UML
类图和
XML Schema
之间的对应关系,并给出了相应的用来描述
UML
类的
XML
文件的描述。
3.1 继承关系到XML Schema的映射
继承在面向对象技术中是一个很基本,也是很关键的概念。人们将具有共同特性的事物抽象成类,并通过增加其内涵而进一步分类。继承(Generalization)定义了一般事物和特殊事物之间的分类关系。用W3C XML Schema中复杂类型的扩展机制很容易表示类的继承关系
XML Schema
中通过定义一个复杂类型,这个复杂类型可以作为另外一个复杂类型的基类型来表示继承关系。复杂类型A中所有的元素将继承到它的子类型当中去,同时可以在子类型当中增加基类型当中所没有的元素,实现对基类型的扩展。下边是一个Address的描述:
<
complexType
name
="
Address
">
<
sequence
>
<
element
name
="
name
"
type
="
string
"
minOccurs
="
0
"/>
<
element
name
="
street
"
type
="
string
"/>
<
element
name
="
city
"
type
="
string
"/>
</
sequence
>
</
complexType
>
USAddress
在原有的name,street,city属性的基础上对Address进行了扩展,增加了一个state和zip元素。
<
complexType
name
="
US-Address
">
<
complexContent
>
<
extension
base
="
Address
">
<
sequence
>
<
element
name
="
state
"
type
="
string"/>
<
element
name
="
zip
"
type
="
integer
"/>
</
sequence
>
</
extension
>
</
complexContent
>
3.2 聚合/组合关系到XML Schema的映射
聚合和组合是两种特殊的关联关系。聚合是整体—— 部分关系的一种,它描述了“
has a”关系,即聚合是有许多部分组成,它是一种较弱的整体与部分之间的关系。组合是聚合关系的一种变体,组合与聚合的区别是:组合是一种较强的拥有关系,在组合整体与部分的生命周期是一致的。在UML中表示类A中组合或者聚合类B的关系的时候,也就是在类A的属性中增加一个类型为B的属性。在XML Schema中表示组合或者聚合关系的时候,相当于在A对应的元素的下一个层级关系中包含一个B的元素。
<
xs:element
name
="
Computer
">
<
xs:complexType
>
<
xs:sequence
>
<
xs:element
name
="
Mainbord
"
type
="
xs:string
"/>
<
xs:element
name
="
Keybord
"
type
="
xs:string
"/>
<
xs:element
name
="
Mainmemory
"
type
="
xs:string
"/>
<
xs:element
name
="
Harddisk
"
type
="
xs:string
"/>
</
xs:sequence
>
</
xs:complexType
>
</
xs:element
>
上边的代码描述了一个
Computer由Mainbord,Keybord,Mainmemory和Harddisk组合而成。聚合关系我们可以理解成这样一个Computer类型不可以再进行细分,底下不能再包含其它复杂属性,而组合关系就是底下的Keybord,Mainbord等是可以单独存在的。
3.3 关联关系到XML Schema的映射
关联关系一般用名称、角色和多重性描述。
(1)名称:用以描述关联的性质,为了消除名称含义上的歧义,可提供一个指引读者名称方向的三角形,给名称一个方向。
(2)角色:当一个类处于关联的一端时,该类就在这个关系中扮演了一个特定的角色;角色是关联中靠近它的一端的类对另一端的的类呈现的职责。
(3)多重性:多重性说明了在一个关联的实例中一个对象有多少个可以连接的对象,多重性是对关联的一种约束,可以精确地表示多重性为
1(1),0或1(0...1),很多(0...),一个或很多(1...),甚至可以精确地指明多重性为一个数值。
对于一对多的关联和多对一的关联关系,我们都可以用两种方式来进行描述。第一种是借用
XML Schema中的ID和IDREF来实现一对多和多对一的关联关系,第二种是我们可以通过XPath一个元素里边包含另一个元素XPath来实现一对多和多对一的关联关系.下边分别介绍两种方法来实现关联关系。多对一的关联关系我们采用ID和IDREF的方式来实现关联关系。一对多的关联关系我们采用XPath方式来实现。
3.3.1多对一的关联关系到
XML Schema的映射
ID类型唯一的确认文档中的元素。类型
ID的属性值必须是一个有效的XML名称。IDREF类型允许一个属性值是一个在文档中可以找到的元素。IDERF属性值必须是文档中某个元素的ID,也就是说,IDREF属性值必须等于另一个元素中ID属性值。下边是一个描述多个孩子对应唯一的一对父母的Schema的例子。
<
xs:complexType
>
<
xs:sequence
>
<
xs:element
name
="
person
"
maxOccurs
="
unbounded
">
<
xs:complexType
>
<
xs:simpleContent
>
<
xs:extension
base
="
xs:string
">
<
xs:attribute
name
="
father
"
type
="
xs:IDREF
"
use
="
optional
"/>
<
xs:attribute
name
="
mother
"
type
="
xs:IDREF
"
use
="
optional
"/>
<
xs:attribute
name
="
pnumber
"
type
="
xs:ID
"
use
="
required
"/>
</
xs:extension
>
</
xs:simpleContent
>
</
xs:complexType
>
</
xs:element
>
</
xs:sequence
>
</
xs:complexType
>
对应的
XML文件如下:
<
person
pnumber
="
a1
">
Susan
</
person
>
<
person
pnumber
="
a2
">
Jack
</
person
>
<
person
pnumber
="
a3
"
father
="
a1
"
mother
="
a2
">
Chelsea
</
person
>
<
person
pnumber
="
a4
"
father
="
a1
"
mother
="
a2
">
David
</
person
>
3.3.2 一对多的关联关系到
XML Schema的映射
XPath遵循文档对象模型(DOM)的路径格式,由于每个XML文档都可以看成是一棵拥有许多结点的树,如果需要定位一个节点,就可以用这个树上边的一系列节电组成的路径来表示这个节电在这棵树上边的位置。对于一个A对应多个B的情况,可以在A的下一层级结构当中保存一个列表,这个列表记录了所有关联到这个A上边的B的XPath,这个B可能是DOM树状结构上边的另外一个节点。这同时也解决了UML模型描述的是个图,如何将它转化成一个DOM模型的树状结构的问题。Schema如下:
<
xs:complexType
>
<
xs:sequence
>
<
xs:element
name
="
AObject
">
<
xs:complexType
>
<
xs:sequence
>
<
xs:element
name
="
BObject
"
type
="
xs:string
"
maxOccurs
="
unbounded
"/>
</
xs:sequence
>
</
xs:complexType
>
</
xs:element
>
</
xs:sequence
>
</
xs:complexType
>
对应的XML文件如下:
<
AObject
>
<
BObject
>
//root/CObject/BObject
</
BObject
>
<
BObject
>
//root/DObject/BObject
</
BObject
>
<
BObject
>
//root//EObject/BObject
</
BObject
>
</
AObject
>
3.3.3 多对多的关联关系到
XML Schema的映射
通过上边的讨论可以看出,对于多对多的关系,可以采用上边两种方法中的任何一种方法来进行描述。不同的地方在于,一个
A对应多个B,一个B对应于多个A的情况,也就是多对多的情况,需要在A和B两边分别保存一个ID/IDREF序列或者XPath序列。则对于一个A,它有一个它所对应的所有的B的ID/IDREF或者XPath序列。对于一个B,它有一个它所对应的所有A的ID/IDREF或者XPath序列。从而实现了A和B之间的多对多的关系。对于学生和学生所选的课程这样一个典型的多对多关系,采用ID/IDREF方式的XML描述如下:
<
student
SID
="
S1
"
CID
=
”
c1”>
Susan
</
student
>
<
student
SID
="
S2
"
CID
=
”
c2”>
Jack
</
student
>
<
student
SID
="
S3
"
CID
=
”
c1”>
Susan
</
student
>
<
student
SID
="
S4
"
CID
=
”
c2”>
Jack
</
student
>
<
courses
CID
=
”
c1” SID="S1">Chelsea</courses>
<
courses
CID
=
”
c2” SID="S2">David</courses>
<
courses
CID
=
”
c3” SID="S1">Chelsea</courses>
<
courses
CID
=
”
c4” SID="S2">David</courses>
4. 小结
通过对UML类图中类之间的继承,组合/聚合和关联关系的研究,给出了一个将UML类图转化成XML Schema的方法。并且XML Schema忠实的反应了UML类图中类之间的关系。对于用UML类图描述的系统,通过这种方法将UML类图转化成XML Schema,根据该XML Schema生成的XML文件同样可以忠实的反应UML类图所描述的系统的模型。