xml描述uml_使用UML设计XML模式

xml描述uml

使用UML框架构造XML模式时,必须考虑三个问题:

  • UML和XML模式之间的互补
  • 如何扩展UML以捕获模式提供的所有功能
  • 从UML图设计XML模式的能力

为了在这种情况下帮助讨论这两个框架,我将使用一个虚拟公司的示例:BALTIC Shipping。

BALTIC Shipping是一家国际运输公司,专门从事从美国到东欧的运输。 它寻求建立一种机制来跟踪从纽约总部到其地区办事处(例如爱沙尼亚塔林的办事处)的货运( 见图1 )。 装运产品后,总部将以XML形式以电子方式发送有关装运的信息。 货物到达目的地后,确认信息将以电子方式发送回总部。

所有定单和确认数据都在XML文档中交换,并且必须设计纲要来概述文档的结构。 用于对运输订单进行建模的业务结构还用于与库存跟踪系统交换信息,该系统可以随时了解公司为交付而持有的包裹。 本文讨论了在构造XML模式时使用UML的功效,这些XML模式定义了这些用于XML数据传输的业务结构。

图1. BALTIC Shipping工作流程
波罗的海运输工作流程

补充框架

UML及其面向对象的建模可以与构建XML模式互补。 您可以用UML中的图形表示法轻松表示业务概念,然后开始设计XML模式。

建模的价值

关于在创建XML模式时使用UML的优势的讨论假定假定了面向对象建模的价值。 在我的上一篇文章“创建灵活和可扩展的XML模式”中,我讨论了使用面向对象方法构建XML模式的重要性和价值。 除了使用UML设计面向对象系统的技术优势之外,UML还提供了一种通用的媒体,业务和技术团队可以在其中轻松交流思想。 业务分析师是软件系统中的关键协作者,尤其是其中包含特定领域信息的协作者。 由于业务分析师参与XML文档的设计过程,因此软件架构师和业务分析师可以轻松协作对于成功完成项目至关重要。 UML的图形表示法使技术人员和非技术人员都可以轻松地就业务概念(例如装运单的定义)达成一致,从而加快并促进了项目的完成。

互补性

想象一下,BALTIC Shipping的业务经理来找您,并要求您对XML模式进行建模,该XML模式将使公司中不同系统之间传输的信息形式化。 他与您坐下来讨论该域的业务概念。 您可以在纸上画一些粗略的草图,但是UML提供了一种更好的形式化方法,可以用图表和符号对这些概念建模。

图2. UML图
UML图

图2的UML图中,概述了装运单的业务定义。 波罗的海航运公司将运输订单定义为由ShippingId原点目的地订单组成 。 每当交换有关装运单的任何数据时,它都会考虑该命令性信息。 另外,UML图用于表示构成原点或订单的内容。 显示的起点和目的地类型与地址类型相同,并且BALTIC Shipping在其数据库中存储具有以下特征的地址:名称,街道,城市和国家/地区。 这些是业务概念,已在数据库模型,软件程序以及经理和业务合作伙伴读取的文档中使用。 这些概念还包括基数(一个Order可以包含许多Item),继承(Origin继承一个Address的所有特征)和依赖关系(Order取决于其Items的详细信息); 所有这些关系都由UML图捕获。 由于您希望XML文档中包含装运单信息,因此下一步是设计符合草绘的UML图的XML模式。 以下模式表示UML图(参见图2 )到XML模式的映射。

清单1. ShippingOrder.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">
      <xs:include schemaLocation="DataTypes.xsd"/>
      <xs:element name="shippingOrder">
          <xs:complexType>
             <xs:sequence>
                <xs:element name="shippingId"type="int"/>
                <xs:element name="origin" type="Origin"/>
                <xs:element name="destination" type="Destination"/>
                <xs:element name="order" type="Order"/>
             </xs:sequence>
          </xs:complexType>
      </xs:element>
</xs:schema>

清单1所示 ,UML中的Shipping Order类由架构中的复杂类型shippingOrder表示。 根据业务建议,运输订单由shippingIdOriginDestinationOrder 。 要注意的一件事是,我将Origin类型和其他泛型类型放在了DataTypes模式中(参见清单2 )。 DataTypes库便于存储可重用的类型,例如地址的定义,这些类型在整个公司的XML文档中用于不同项目。

在UML图(请参见图2 )中, Address是一种抽象类型,如斜体字所示,其中写有“地址”一词。 类型OriginDestinationAddress继承特性Name,Street,City和Country。 为可重用类型创建蓝图被认为是良好的面向对象设计。 在XML模式(请参见清单2 )中,我通过使用关键字abstract="true"Address类型作为抽象类型。 当我使用extension base="Address"表明它们继承了Address的特征时, OriginDestination类型模仿了我最初在UML图中概述的设计。 另外,我捕获了一个业务模型,即一个Order可以由许多Item组成,其代码type="Item" maxOccurs="unbounded"

清单2. DataTypes.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">
  <xs:complexType name="Address" abstract="true">
      <xs:sequence>
          <xs:element name="name" type="xs:string"/>
          <xs:element name="street" type="xs:string"/>
          <xs:element name="city" type="xs:string"/>
          <xs:element name="country" type="xs:string"/>
      </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Origin">
      <xs:complexContent>
          <xs:extension base="Address"/>
      </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="Destination">
      <xs:complexContent>
          <xs:extension base="Address"/>
      </xs:complexContent>
  </xs:complexType>
      <xs:complexType name="Order">
          <xs:sequence>
              <xs:element name="item" type="Item" maxOccurs="unbounded"/>
          </xs:sequence>
      </xs:complexType>
      <xs:complexType name="Item">
          <xs:sequence>
              <xs:element name="description" type="xs:string"/>
              <xs:element name="weight" type="xs:double"/>
              <xs:element name="tax" type="xs:double"/>
          </xs:sequence>
  </xs:complexType>
</xs:schema>

如果您是从头开始设计XML模式的,那么仅以XML写下对象类型将很困难。 另外,几乎不可能向不熟悉XML模式术语的业务经理解释它们。 基于UML图,您可以有效地翻译公司的业务概念,然后使用此可视化表示形式创建XML模式。 以下是给定创建的模式的,从纽约运到塔林的草莓酱包裹的结果实例文档。

清单3. ShippingOrder.xml
<?xml version="1.0" encoding="UTF-8"?>
<shippingOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:\schemas\ShippingOrder.xsd">
	<shippingId>09887</shippingId>
	<origin>
		<name>Ayesha Malik</name>
		<street>100 Wall Street</street>
		<city>New York</city>
		<country>USA</country>
	</origin>
	<destination>
		<name>Mai Madar</name>
		<street>Liivalaia 33</street>
		<city>Tallinn</city>
		<country>Estonia</country>
	</destination>
	<order>
		<item>
			<description>Ten Strawberry Jam bottles</description>
			<weight>3.141</weight>
			<tax>7.60</tax>
		</item>
	</order>
</shippingOrder>

基本原理

虽然在本示例中很容易看出使用UML的优点,但是BALTIC Shipping示例是否真的代表了UML和XML模式之间的互补性? 我已经展示了XML模式可以捕获UML图中表示的信息。 但是,现在让我们开始进行分析,并询问UML图是否可以捕获XML模式提供的所有功能。 XML模式在形式化XML文档方面提供了很多丰富的内容,初步分析表明,XML模式的大多数基本功能可以由UML图表示。 考虑一下XML模式的一些重要原则:

1.类型
XML模式既具有内置的数据类型(如intdouble ,又具有构造的类型,例如具有表示Address组成部分的复杂类型。 类型的生成是面向对象设计的重要方面,并且对于模块化,灵活性和封装是必需的。 在UML中,存在内置的数据类型,并且可以使用类的结构来构建新的类型。

XML模式还具有用户定义的类型 ,根据W3C,“允许创建用户定义的数据类型,例如从现有数据类型派生的数据类型,并且可能会限制其某些属性(例如,范围,精度,长度,格式)。” 对于特殊或用户定义的类型,UML允许对其基本配置文件进行扩展(称为构造型)。 在带有原型的扩展UML中详细讨论了原型

2.属性
XML模式中的属性可用于两件事:

  • 捕获关联。 例如,一个Order可以包含许多项目。 在XML模式中,这被写为maxOccurs="unbounded" 。 在UML中,关联在模型中关联两个或多个类,并由一端的箭头以及表示该关联的多重性的数字指示。
  • 显示可能固有链接到元素的其他信息。 XML模式中这种元素和属性配对的一个示例是具有currency属性的tax元素。 清单4显示了将属性添加到元素tax的示例。
清单4.添加属性
<xs:element name="tax">
   <xs:complexType>
      <xs:simpleContent>
         <xs:extension base="xs:double">
            <xs:attribute name="currency" type="xs:string" use="required"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
</xs:element>

可以在UML图中将属性捕获为类的属性。 但是,必须创建一种机制,通过该机制可以在UML类图中区分元素和属性。 这是通过在UML图中创建一个称为属性的特殊原型来实现的。

3.命名空间
命名空间是XML模式中非常重要的概念。 它们代表了将业务概念分解为多个部分。 在UML图中,可以通过将UML模块保留在不同的包中来表示名称空间。

4.多重性
我已经表明,可以在UML图中显示诸如OrderItem之间的关联(一个Order可以包含多个Item )。 在XML模式中, maxOccursminOccurs关键字用于显示与元素或关联的多重关联。

5.派生类型
XML模式允许通过扩展和限制来派生类型。 扩展继承是一种常见的面向对象设计,可以通过在UML中显示抽象类来轻松表示。 抽象类以斜体表示(请参见图2 )。 但是,UML中没有构造来表示限制导出。

缺口分析

显然,UML无法捕获XML模式中的所有丰富性。 这意味着,即使已经在UML中对XML模式进行了建模,您也应该手动对其进行扫描和调整。 您应该解决的一些问题是:

  • 排序:在XML模式中,排序很重要,而UML的传统域对排序没有任何用处。
  • 属性:正如前面在基础知识中所讨论的,UML图中的子元素没有明确区分属性。
  • 通过限制派生:虽然UML可以显示抽象类及其实现,但是传统的UML图没有正式的表示法来表示限制,这是XML模式泛化技术的一部分。
  • 关键字:关键字用于将文档在XML模式中链接在一起,但是UML表示法缺少关键字表示形式。

差距分析指出了捕获XML模式提供的所有功能时UML表示法的不足。 UML概要文件提供了用于在特定领域中构建UML模型的通用扩展机制。 在XML模式设计领域,UML概要文件得到了扩展,以弥补基本UML模型中的空白。 戴夫·卡尔森(Dave Carlson)在他的书《 使用UML建模XML应用程序》中已经创建了一个这样的XSD概要文件。

用构造型扩展UML

差距分析列出了UML无法清楚地捕获XML模式中您想要的内容的区域,因此决定扩展UML概要文件以填补空白。 UML概要文件具有三个关键项:构造型,标记值(属性)和约束。 构造型允许您为UML基础类(例如Class)附加新的含义,并且在UMl图上以双括号( << >> )包围的名称表示。

假设您有一项业务要求,即税额必须同时包含有关其货币面额的信息。 换句话说,XML看起来像这样:

<tax currency=USD>7.60</tax>

在XML模式中, tax元素带有属性currency来表示此需求(请参见清单4 )。 为了在UML中创建对应的图,将创建两个新的<<XSDattribute>>型: <<XSDattribute>>表示XML模式属性,以及<<XSDsimpleType>>表示双<<XSDsimpleType>> 。 我使用了Dave Carlson创建的USD配置文件的XSD扩展。 表示属性的扩展名如下所示:

<<XSDattribute>> on a UML attribute or association end
use (prohibited | optional | required | fixed)

complexType Tax是基于simpleType double并包含属性currency 。 通过定型,您现在已经在UML图中准确地捕获了新的业务需求,并且可以再次使用UML图来创建XML模式。 正如我为元素tax属性currency ,我可以使用我的<<XSDattribute>>型为UML图中的元素weight属性unit 。 同样,需要为许多XML模式构造创建UML扩展,以在两个框架之间提供完整的双向映射。

图3.具有原型的UML图
具有构造型的UML图

相应的架构如下:

清单5. ShippingOrder.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">
	<xs:include schemaLocation="DataTypes2.xsd"/>
	<xs:element name="shippingOrder">
	   <xs:complexType>
		<xs:sequence>
		   <xs:element name="shippingId"/>
		   <xs:element name="origin" type="Origin"/>
		   <xs:element name="destination" type="Destination"/>
		   <xs:element name="order" type="Order"/>
		</xs:sequence>
	   </xs:complexType>
	</xs:element>
</xs:schema>
清单6. DataTypes2.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">
  <xs:complexType name="Order">
      <xs:sequence>
          <xs:element name="item" type="Item" maxOccurs="unbounded"/>
      </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Item">
      <xs:sequence>
          <xs:element name="description" type="xs:string"/>
          <xs:element name="weight" type="Weight"/>
          <xs:element name="tax" type="Tax"/>
      </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Address" abstract="true">
      <xs:sequence>
          <xs:element name="name" type="xs:string"/>
          <xs:element name="street" type="xs:string"/>
          <xs:element name="city" type="xs:string"/>
          <xs:element name="country" type="xs:string"/>
      </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Origin">
      <xs:complexContent>
          <xs:extension base="Address"/>
      </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="Destination">
      <xs:complexContent>
          <xs:extension base="Address"/>
      </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="Tax">
      <xs:simpleContent>
          <xs:extension base="xs:double">
              <xs:attribute name="currency" type="xs:string" use="required"/>
          </xs:extension>
      </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="Weight">
          <xs:simpleContent>
              <xs:extension base="xs:double">
                  <xs:attribute name="unit" type="xs:double" use="required"/>
              </xs:extension>
          </xs:simpleContent>
  </xs:complexType>
</xs:schema>

现在,XML实例文档在每次交换有关项目税收的信息时都包含货币。

清单7. ShippingOrder2.xml
<?xml version="1.0" encoding="UTF-8"?>
<shippingOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:\schemas\ShippingOrder.xsd">
  <shippingId>09887</shippingId>
  <origin>
      <name>Ayesha Malik</name>
      <street>100 Wall Street</street>
      <city>New York</city>
      <country>USA</country>
  </origin>
  <destination>
      <name>Mai Madar</name>
      <street>Liivalaia 33</street>
      <city>Tallinn</city>
      <country>Estonia</country>
  </destination>
  <order>
      <item>
          <description>Ten Strawberry Jam bottles</description>
          <weight unit="kg">3.14</weight>
          <tax currency="US">7.16</tax>
      </item>
  </order>
</shippingOrder>

从UML模型生成XML模式

从有关UML和XML模式的讨论中自然可以得出这样的问题:询问是否存在将UML映射到XML模式的标准方法。 如果是这样,则可以从UML图自动生成模式,并且供应商和开源工具可以提供此功能。 理想情况下,工具采用UML元模型并将其转换为XML模式。 XML元数据交换(XMI)旨在使建模工具之间的元数据易于交换,并且可以进一步用于使用一组转换规则从UML图生成XML DTD。

使用XMI(XML元数据交换)

XMI由与供应商无关的对象管理组(OMG)赞助,并具有三个主要标准:

  • XML:可扩展标记语言,W3C标准
  • UML:统一建模语言,一种OMG建模标准
  • MOF:元对象工具,OMG建模和元数据存储库标准

通过结合这三个标准,XMI代表了一种将元数据从一个存储库传输到另一个存储库的新方法。

我提供了一些XMI片段,以说明该工具自动在XML中生成元信息并将其转换为XML模式时在后端发生的情况。 在清单8中,Foundation Core Model元素是ShippingOrder ,您可以看到实际上很冗长的XMI编写了UML模型中存在的每个叶子。

清单8. hyperModel为图2 UML模型生成的XMI的一部分(在ArgoUML中创建)
<Foundation.Core.ModelElement.name>ShippingOrder</Foundation.Core.ModelElement.name>
    <Foundation.Core.ModelElement.isSpecification xmi.value="false"/>
    <Foundation.Core.GeneralizableElement.isRoot xmi.value="false"/>
    <Foundation.Core.GeneralizableElement.isLeaf xmi.value="false"/>
    <Foundation.Core.GeneralizableElement.isAbstract xmi.value="false"/>

大多数模型(包括TogetherJ,Rational Rose和ArgoUML)都创建XMI文件。 我使用ArgoUML(开放源代码)创建了图2中的UML图。 ArgoUML创建了一个项目文件,其中包含一个XMI文件。 当导入hyperModel(由Dave Carlson开发,由Dave Carlson开发,他开始使用UML进行XML模式建模的讨论并撰写了有关该主题的书)时,它生成了适当的模式构造。 我下载了hyperModel的30天评估模型,但是您可以选择其他工具。 只需确保您对XML和UML模型的编码是正确的即可。 例如,hyperModel与UML Model 1.3一起使用。 另外,请始终检查生成的XML模式以验证转换是否正确,尤其是在使用新类型的情况下。

上面的ArgoUML生成并放入hyperModel的XMI返回了清单9中的XML模式构造。仔细检查,可以确认hyperModel捕获了图2中ArgoUML中的基本UML模型。 由于UML位于单个程序包中,因此生成的XML模式位于单个名称空间中。 在ShippingOrderType下调用时,将引用诸如Origin类的类型。

清单9.使用XMI生成的ShippingOrder元素类型
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified">

  <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
  <!-- Class: ShippingOrderType  -->
  <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
  <xs:element name="ShippingOrder" type="ShippingOrderType"/>
   <xs:complexType name="ShippingOrderType">
      <xs:sequence>
         <xs:element name="shippingId" type="xs:int"/>
         <xs:element name="origin">
            <xs:complexType>
               <xs:sequence>
                  <xs:element ref="Origin"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
         <xs:element name="destination">
            <xs:complexType>
               <xs:sequence>
                  <xs:element ref="Destination"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
         <xs:element name="order">
            <xs:complexType>
               <xs:sequence>
                  <xs:element ref="Order"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>
</xs:schema>

摘要

许多大型企业集团(例如SWIFT,为全球7,000家金融机构提供交易和结算的电子基础设施)都在使用UML到XML模式转换来设计其XML文档。 UML代表建模业务概念的最简单方法,尤其是当它们是特定于领域时。 想要外推和自动化该过程是很自然的,这样转换是干净而完整的。 为此,我已经讨论了XMI的使用以及诸如hyperModel之类的产品从描述UML元模型的XMI生成XML模式的能力。 但是,警告读者始终要完善并仔细检查模型的有效性。 尽管尚未完全实现将UML映射到XML模式的功能,但是UML是一种以面向对象的方式启动XML模式建模的好方法。 如果创建用于自动生成XML模式的工具(包括开放源代码和供应商托管的工具)的趋势继续存在,那么UML类图可能会成为将业务概念整合到XML词汇表中的标准方法。

随着XML成为软件系统所有部分固有的东西-从数据交换到Web服务消息再到对构建脚本的描述-一种简洁,简洁的XML模式建模方法变得势在必行。 UML是面向对象系统的久经考验的建模工具,作为设计XML模式的媒介,它对开发人员,业务分析人员和供应商具有吸引力。 我相信随着行业和消费者开始使用XML开发其本体和服务,我们将看到UML的使用越来越多。


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

xml描述uml