首页 > 代码库 > BizTalk开发系列(十三) Schema设计之值约束

BizTalk开发系列(十三) Schema设计之值约束

XML Schema 的作用是定义 XML 文档的合法构建模块。在开发过程中有时需要对XML文档做精确的约束。以保证XMl数据的准确性。

     今天我们以一个班级Sample来讲探讨一下如何在开发BizTalk Schema过程中对XML数据做精确的约束。这个Schema定义了一个班级,班级下面有成员,成员下面有Name属性,Mobile,City,Result,Comment等字段。

image

     依据以上场景我们对不同的属性或无素做如下需求分析:

字段类型作用基类约束
Name属性名称string2-4个字符
Mobile元素手机号string11个数字字符
City元素城市string列表:Beijing, Chengdu, Shenzhen
Result元素成绩int数字列表,以空格隔开各成绩值。
Comment元素评论int/string数字或字符串型

     如上图所示,创建相应的Schema文件。依据需求分析设置相应的字段的属性值。但在这之前我们先来了解一下相应的概念。在Schema约束是使用派生类来指定相应的字段从哪个或哪些基类派生出来的值类型。对于字段或属性的派生类型有以下四种选项:

  1. Default 不从任何类型中派生。

  2. Restriction 从简单类型中派生出新的受限制的数据类型

  3. List 单个简单类型的集合(可理解为数组)

  4. Union 多个简单类型的集合

      看了以上的概念大概了解一下这几种设置的区别,现面我们来看一下为相应的字段设置属性值。首先我们打开Name属性字段的属性窗口。如下图所示。在 Advanced类别的Derived By值下拉框里有四个选项。由于Name属性字段的约束为2-4个字符。因此设置值为Restriction(限制).并在Restriction(限 制)类别中分别设置Maximum Length和Minimum Length的值为4和2。

image

     由于Mobile为数字型的字符串而且有长度的限制。如果单单像Name属性那样设置不能达到约束目的。W3C的Schema规范中提供了模式约束 (pattern constraint)。在Mobile字段的属性窗口设置Derived By属性值为 Restriction 在Restriction(限制)类别下的Pattern属性则是可以输入约束语句(支持正则表达式)。我们可以在打开的编辑窗口中输入: [0-9]{11} 正则表达式语句限制字符串由11个0-9数字组成。

    City的值是要由列表限制的。Schema规范也提供了枚举约束(enumeration constraint)模式。在City字段的属性窗口设置Derived By属性值为 Restriction。在Restriction(限制)类别下的Enumeration属性编辑窗口输入如下图所示的值。

image 

   Result其实是一个数值类型的数组。如下图所示设置Derived By属性值为List。设置Item Type值为xs:int。

   image

   Comment 评论字段由于不确定得到的值是字符串类型的还是数值类型的(有可能得到一段评语也有可能得到一个分值)。因此是一个复合型的字段。

image

     通过以上的设置已经完成了Schema的定义过程。会在Schema Soruce窗口得到如下代码:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://schemasample.limit"/ targetNamespace="http://schemasample.limit"/ xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Class">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Member">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Mobile">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:length value="11" />
                    <xs:pattern value="[0-9]{11}" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="City">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="Beijng" />
                    <xs:enumeration value="Chengdu" />
                    <xs:enumeration value="Shenzhen" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Result">
                <xs:simpleType>
                  <xs:list itemType="xs:int" />
                </xs:simpleType>
              </xs:element>
              <xs:element name="Comment">
                <xs:simpleType>
                  <xs:union memberTypes="xs:int xs:string" />
                </xs:simpleType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="Name" use="required">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:minLength value="2" />
                  <xs:maxLength value="4" />
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema> 

 

测试

   测试Scheam可能在Shema文件的属性中直接设置同一个输出与输入文件路径方便测试。有一点需要注意的是设置了相关约束之后通过Schema的生成实例选项生成出来的XML文件并不一定是符合约束条件的,特别是对于模式约束(pattern constraint。这一点在BizTalk的帮助文件里已经提到了这是一个已经的问题。

    但不管怎么样直接生成实例是最简单的方式。通过直接生成实例我们得到了以下的XML数据:  

<ns0:Class xmlns:ns0="http://schemasample.limit"/>
  <Member Name="Nam">
    <Mobile>MobileMobil</Mobile>
    <City>Beijng</City>
    <Result>10</Result>
    <Comment>10</Comment>
  </Member>
</ns0:Class> 

    直接验证实例不能成功。提示Mobile不符合规范。我们修改XML数据如下:

<ns0:Class xmlns:ns0="http://schemasample.limit"/>
  <Member Name="Nam">
    <Mobile>13800138000</Mobile>
    <City>Beijng</City>
    <Result>90 95 97 99</Result>
    <Comment>Good!</Comment>
  </Member>
</ns0:Class> 

 

  再次验证实例可以通过验证。虽然通过了测试不过请对比上下两个XML数据,以理解不同模式的区别。红色加粗部分为整数型的成绩字段数组。在Schema声明的时候使用List模式。该模式是使用空格分隔不同值,因些需注意在List模式下使用string类型的时候要注意内容是否有空格。

   粉色加粗部分是复合类型。上一个XML数据使用了整合类型通过验证。下一个使用字符串类型也同样通过验证。

BizTalk开发系列(十三) Schema设计之值约束