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. poj2385 dp(递推)

    题目链接 :http://bak3.vjudge.net/contest/136499#problem/D 题意: //转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1] ...

  2. [BZOJ 2957]楼房重建(THU2013集训)(分块思想)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 首先明确问题,对于每栋楼房的斜率K=H/X,问题就是问有多少个楼房的K比前面所有 ...

  3. CSS总结2

    1.动画: transform:rotate(10deg):  transform:scale(2),  scaleY(2),  scaleX(2), scale(1,1) scale(-1)---让 ...

  4. 怎么提高Jquery性能

    很久没有关注jQuery了,最近重新看了一下,看到一些不错的文章,转来坐一下笔记. 其内容和一些新提供的方法还是很多有值得学习的地方. 1. 使用最新版本的jQuery jQuery的版本更新很快,你 ...

  5. http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html

    http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html

  6. HTML DOM domain 属性

    定义和用法 domain 属性可返回下载当前文档的服务器域名. 语法 document.domain 说明 该属性是一个只读的字符串,包含了载入当前文档的 web 服务器的主机名. 提示和注释 提示: ...

  7. Windows和Linux(Ubuntu)下安装Scala及ScalaIDE

    1.下载 1.1Scala下载 Windows版:http://www.scala-lang.org/download/ Linux版:http://www.scala-lang.org/downlo ...

  8. [转]crontab命令指南

    原文链接:http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html 前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划 ...

  9. gulp完全开发指南 => 快来换掉你的Grunt吧

    最近一直在构建Angular应用,通过bower管理前端包依赖,然后通过gulp和它配合.发现gulp相比于grunt真的很轻,现在我的项目中已经取代了grunt.这里把我的一些实践贴记录下来和大家分 ...

  10. UVa 10806 & 费用流+意识流...

    题意: 一张无向图,求两条没有重复的从S到T的路径. SOL: 网络流为什么屌呢..因为网络流的容量,流量,费用能对许许多多的问题进行相应的转化,然后它就非常的屌. 对于这道题呢,不是要没有重复吗?不 ...