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

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

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

字段 类型 作用 基类 约束
Name 属性 名称 string 2-4个字符
Mobile 元素 手机号 string 11个数字字符
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。

由于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属性编辑窗口输入如下图所示的值。

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

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

通过以上的设置已经完成了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设计之值约束的更多相关文章

  1. BizTalk开发系列(三十三)BizTalk之Excel终极解决方案

    Excel作为优秀的客户端数据处理程序得到了广泛的应用. 由于其简单又强大的功能在很多公司或个人的数据处理中占用非常重要的位置. 而BizTalk作为微软的SOA主打产品虽然免费提供了很多Adapte ...

  2. BizTalk开发系列(十八) 使用信封拆分数据库消息

    之前写了一篇的<BizTalk开发系列(十七) 信封架构(Envelop)> 是关于信封架构及其拆装原理的,都是理论性的内容.信封在BizTalk开发过程中最常用的应该是在读取SQL Se ...

  3. BizTalk开发系列(二十八) MSMQ 适配器

    MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间 中的任一 ...

  4. BizTalk开发系列(二十二) 开发自定义Map Functoid

    尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况.<BizTalk开发系列 Map扩展开发>介绍了通过使用自定义 XSL ...

  5. BizTalk 开发系列(四十一) BizTalk 2010 BAM 安装手记

    使用64位系统可以支持更大的内存,现在服务器基本上都使用64位系统.微软从Windows Server 2008 R2开始服务器版的操作系统也只支持64位了,不过对于像BizTalk这种“繁杂的东西” ...

  6. 【Qt编程】基于Qt的词典开发系列<十三>音频播放

    在上一篇文章中,我是在Qt4平台上调用本地发音的,后来由于用到JSON解析,就将平台转到了Qt5,因为Qt5自带解析JSON的类.然后发现上一篇文章的方法无法运行,当然网上可以找到解决方法,我在这里直 ...

  7. BizTalk开发系列(十二) Schema设计之Group与Order

    开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽 ...

  8. BizTalk开发系列(二十五) SQL Adapter

    SQL Server 是.NET开发的首选数据库.当然开发BizTalk应用程序很多也离不了SQL Server.针对SQL Server的数据操作BizTalk 提供了SQL Adapter作为与数 ...

  9. BizTalk开发系列(七) Hello World2

    之前根据BizTalk的订阅原理,使用BizTalk管理控制台创建了第一个应用程序 Hello World.但是由于控制台的开发功能有限,绝大多数的BizTalk程序都是在集成开发环境Visual S ...

随机推荐

  1. 苹果推送(APNs)ios push小结

    把app删除后就推送不成功了,可以看出deviceToken应该是设备+app来一起识别的,重新安装后仍然为同一个 简介 推送服务APNs(Apple Push Notification servic ...

  2. SpringMVC解析2-ContextLoaderListener

    对于SpringMVC功能实现的分析,我们首先从web.xml开始,在web.xml文件中我们首先配置的就是ContextLoaderListener,那么它所提供了功能有哪些又是如何实现的?当使用编 ...

  3. Codeforces Round #356 (Div. 2)-B

    B. Bear and Finding Criminals 链接:http://codeforces.com/contest/680/problem/B There are n cities in B ...

  4. testng.xml文件结构组成及节点属性说明

    TestNG的DTD检查文件:http://testng.org/testng-1.0.dtd.PHP 更多testng配置及说明,请移步http://testdoc.org/docmaster?pi ...

  5. [TJOI2016&HEOI2016]

    很有意思.是因为排序那道题才听闻今年tjoi2016的. 题是好题!先把它刷完再去把zhihu look through一遍. bzoj4552 以后看到什么做不出的题,看看能否写二分!!!!写二分! ...

  6. jquery: json树组数据输出到表格Dom树的处理方法

    项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...

  7. 贪心 Codeforces Round #289 (Div. 2, ACM ICPC Rules) B. Painting Pebbles

    题目传送门 /* 题意:有 n 个piles,第 i 个 piles有 ai 个pebbles,用 k 种颜色去填充所有存在的pebbles, 使得任意两个piles,用颜色c填充的pebbles数量 ...

  8. figure元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. iOS学习28之UITabBarController

    1. 标签视图控制器 -- UITabBarController 视图(UIView) ---> 图层 ---> 子视图 视图控制器(UIViewController) ---> 管 ...

  10. BZOJ2149 : 拆迁队

    设$c[i]=g[i]+\frac{i(i+1)}{2}-a[i]\times i-a[i]$,$d[i]=a[i]-i$ $f[i]$表示以$i$为结尾最多保留多少个建筑,则 $f[i]=\max( ...