XML及相关协议

1. 面向服务中的信息交换和数据类型

1.1 电子信息交换

  • 定义
    在执行领域(业务)相关功能时,各式各样、采用电子方式编码的信息,在软件单元之间的移动的过程。
  • 分类
  1. 应用内部 - 信息在单个应用的不同部分之间移动
  2. 应用之间 - 信息在同一个企业系统中的不同应用之间
  3. 系统之间 - 信息在同一个企业的不同系统之间移动
  4. 公司之间 - 信息在不同的公司之间移动
  • 交换方式
  1. 基于二进制的方式(与实现紧密相关)
  2. 基于平台相关的方式
  3. 基于语言相关的方式
  4. 基于文本的方式(文本能提供复杂的数据结构)
  5. 基于某种中介的方式

1.2 XML(信息交换方式)

  • 平台中立、语言中立、基于文本结构、能够表达复杂数据结构
  • XML 及其相关协议在面向服务的计算中担任元数据的角色
  • XML 用途:服务使用 XML 消息进行发布/查询/调用。
  1. 描述服务(接口及流程)
  2. 描述查询服务的服务需求
  3. 描述服务的调用请求
  4. 其他在面向服务计算中所需要执行的信息交换

1.3 XML Schema(数据类型)

  • 定义
    使用 XML Schema 脚本来对 XML 消息应当符号满足的数据结构进行约定和描述。在特定行业领域中,可以定义一组 XML Schema 脚本并通过网络发布,这些 XML Schema 可以被认为时数据类型标准

2. XML

2.1 定义

XML 是满足一组良好定义规则的格式化文本,主要由标签和文本构成,可以被储存和展现为诸如通过 HTTP 传输的消息、编程语言中的字符串、数据库中的 CLOB等文本数据形式。
【注】为了方便起见,XML 文档也被用来指应用之间的字节流、数据库中的字段、XML 信息集中的对象集合。

2.2 结构

XML 文档为树状结构

2.3 格式良好的 XML

满足 5+1 规则的 XML 被称为格式良好的 XML。

  • 单根元素:所有 XML 文档都只能有一个根元素
  • 元素标签规则:以开始标签和结束标签来包装元素
  • 元素嵌套规则:元素标签中间可以嵌套标签
  • 元素规则
  1. XML 命名:首字母必须是字母或_,后街任意长度的字母、数字、连字号等(不能含有空格,不能以“xml”任何大小写组合作为前缀);XML 名称大小写敏感
  2. XML 元素内容:XML 文档由使用标签对表示的元素、可选属性和可选元素的开始和结束标签之间的数据(可以是文本数据也可以是子元素)所构成。元素内容以两种方式进行处理:
  • PCDATA(被解析的字符数据):默认方式,被 XML 解析器进行检查并提取其中的 XML 内容(需对预定义实体进行转义)
  • CDATA(字符数据):采用特殊标记 <![CDATA[...]]> 进行包装,XML 解析器不做处理,只按照字面处理
  • 元素属性:标签中可以含有属性值键对(用来为元素附加信息,值必须使用单/双引号括起)
  • XML 声明:可选,出现在 XML 文档中的第一行(<?xml version="1.0" ?>,可添加键值对属性)
  1. encoding 属性:用来表达文档所使用的编码(默认为 UIF-8 或 UTF-16)
  2. standalone 属性:用来表达文档的完整性,即该文档是否依赖于文档外的其他信息(默认为“no”)

2.4 合法的 XML

合法的 XML 文档持有一个额外的词汇表,并遵循该词汇表所定义的结构化规则用 DTD 或 XML Schema 进行定义,XML 解析器可以选择是否使用词汇表进行合法性检查(比如类型检查等)。

3. NameSpace

3.1 元素和属性名称冲突

  • 使用标准的领域数据架构,定义语义并解决名称冲突(×\times)

由于领域孤岛可能交互,故该方法不可行

  • 名称空间(\checkmark)
  1. 为了在全球范围内解决名称冲突问题,可以从概念上,将元素和属性名表达为 URI+名称(比如:<http://www.library.com/books:title>
  2. 作为前缀的 URI 被称为名称空间 NameSpace
  3. 为了保证 XML 格式良好,采用别名代替 URI(比如:books="http://www.library.com/books" 然后直接使用 <books:title>

3.2 QNames(Qualified Names)

  • 引入名称空间后,元素名称和属性名称转换为两部分名称,即 QNames
  • QNames 用来在 XML 中担任元素名称和属性名称
  • QNames 包含前缀部分和本地部分 <prefix:localname>
  • 从概念上,前缀 prefix 是名称空间的别名(比如: <books:title>books 为名称空间别名)

3.3 名称空间声明

  • 语法:<prefix:elementName xmlns:prefix='URL'> ··· </prefix:elementName>
  • 举例:
  1. 使用名称空间声明定义元素:
1
2
3
<books:title xmlns:books='http://www.library.com/books'>
···
</books:title>
  1. 使用名称空间定义属性:
1
2
3
<books:book xmlns:books='http://www.library.com/books' books:hardcover='true'>
···
</books:book>

3.4 名称空间作用域

  • 名称空间前缀的作用域为定义该名称空间的元素(含嵌套的子元素和所隶属的属性)
  • 名称空间前缀可以在嵌套的子元素中进行重新定义
  • 默认名称空间:在大多数元素隶属于相同的名称空间时,可以使用默认名称空间语法 <elementName xmlns='URI'> ··· </elementName>
  1. 在默认名称空间的作用域内,可以使用 QName 来定义隶属于其他名称空间的元素
1
2
3
4
5
6
7
<book
xmlns = 'http://www.library.com/books'
xmlns:amazon = 'http://www.amazon.com/products'>
···
<amazon:skuNo>A25</amazon:skuNo>
···
</book>
  1. 默认名称空间不作用于属性,如不适用 QName ,默认情况下,属性没有名称空间
  2. 使用 xmlns = "" 定义没有名称空间的元素
  3. 属性不受默认名称空间的影响,特定元素中的属性应各不相同(即属性不能重复定义)

4. XML Schema

4.1 引入 XML Schema 原因

  • 业务
  1. 需要增加数据的表示能力
  2. 需要融合来源于不同组织的词汇表
  3. 通过提升通信效率的方式以减少集成的成本
  • 技术
  1. 采用具体的定义验证 XML 文档
  2. 采用 XML 语法
  3. 定义数据结构和约束条件
  4. 支持名称空间
  5. 表达数据元素之间的关系

4.2 XML Schema 结构

【注】targetNamespace 指定该 XML Schema 所定义的元素所隶属的名称空间。

4.3 XML Schema 类型系统

  • 简单类型(不存在树状结构)
  1. 不能含有属性或子元素
  2. 是 XML Schema 类型语言中的原子类型
  3. 可以用以定义其他类型(简单类型或复杂类型)
  4. XML Shema 包含 40 多个预定义的简单类型
  • 复杂类型(一定存在树状结构)
  1. 可以含有属性
  2. 可以含有子元素
  3. 可以用来定义其他复杂类型
  4. 不能用来定义简单类型
1
2
3
4
5
6
<xsd:simpleType name="quantityType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="2"/>
<xsd:maxInclusive value="5"/>
</xsd:restriction>
</xsd:simpleTyped>

4.4 元素声明

  • 采用已有的类型定义(内建或已定义)来说明元素
1
2
3
<xsd:element name='quantity'
type='xsd:nonNegativeInteger'
minOccurs='1' maxOccurs='1'/>

其中,name 指定元素名称,type 指定元素值的类型,minOccurs、maxOccurs指定元素至少、至多出现的次数。

  • 定义复杂元素
  1. 采用排序符定义元素中的子元素
  • 按序列出现的 firstName 和 lastName
1
2
3
4
<xsd:sequence>
<xsd:element name='firstName' type='xsd:string'/>
<xsd:element name='lastName' type='xsd:string'/>
</xsd:sequence>
  • maidenName 和 cityOfBirth 选择其一
1
2
3
4
<xsd:choice>
<xsd:element name='maidenName' type='xsd:string'/>
<xsd:element name='cityOfBirth' type='xsd:string'/>
</xsd:choice>
  • height 和 weight 以任意顺序出现
1
2
3
4
<xsd:all>
<xsd:element name='height' type='xsd:float'/>
<xsd:element name='weight' type='xsd:float'/>
</xsd:all>
  1. 声明属性
1
2
3
4
5
<xsd:element name='blank'>
<xsd:complexType>
<xsd:attribute name='temperature' type='xsd:decimal' fixed='32.0'/>
</xsd:complexType>
</xsd:element>

其中,属性由 <xsd:attribute name='temperature' type='xsd:decimal' fixed='32.0'/> 指出。
该属性指出,如果 XML 文档中的属性不是数值类型,或数值不为 32.0 ,则无法通过 XML Schema 验证。

4.5 寻找 XML Schema

使用 xsi:schemaLocationxsi:noNamespaceSchemaLocation 来指定当前 XML 可以获取到对应 XML Schema 位置(可指定也可不指定)。

1
2
3
<quatity xmlns="http:www.ibm.com/WD03/Schema/XML"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.ibm.com/WD03/Schema/schema.xsd">25</quantity>