BizTalk开发系列(十三) Schema设计之值约束
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设计之值约束的更多相关文章
- BizTalk开发系列(三十三)BizTalk之Excel终极解决方案
Excel作为优秀的客户端数据处理程序得到了广泛的应用. 由于其简单又强大的功能在很多公司或个人的数据处理中占用非常重要的位置. 而BizTalk作为微软的SOA主打产品虽然免费提供了很多Adapte ...
- BizTalk开发系列(十八) 使用信封拆分数据库消息
之前写了一篇的<BizTalk开发系列(十七) 信封架构(Envelop)> 是关于信封架构及其拆装原理的,都是理论性的内容.信封在BizTalk开发过程中最常用的应该是在读取SQL Se ...
- BizTalk开发系列(二十八) MSMQ 适配器
MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间 中的任一 ...
- BizTalk开发系列(二十二) 开发自定义Map Functoid
尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况.<BizTalk开发系列 Map扩展开发>介绍了通过使用自定义 XSL ...
- BizTalk 开发系列(四十一) BizTalk 2010 BAM 安装手记
使用64位系统可以支持更大的内存,现在服务器基本上都使用64位系统.微软从Windows Server 2008 R2开始服务器版的操作系统也只支持64位了,不过对于像BizTalk这种“繁杂的东西” ...
- 【Qt编程】基于Qt的词典开发系列<十三>音频播放
在上一篇文章中,我是在Qt4平台上调用本地发音的,后来由于用到JSON解析,就将平台转到了Qt5,因为Qt5自带解析JSON的类.然后发现上一篇文章的方法无法运行,当然网上可以找到解决方法,我在这里直 ...
- BizTalk开发系列(十二) Schema设计之Group与Order
开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽 ...
- BizTalk开发系列(二十五) SQL Adapter
SQL Server 是.NET开发的首选数据库.当然开发BizTalk应用程序很多也离不了SQL Server.针对SQL Server的数据操作BizTalk 提供了SQL Adapter作为与数 ...
- BizTalk开发系列(七) Hello World2
之前根据BizTalk的订阅原理,使用BizTalk管理控制台创建了第一个应用程序 Hello World.但是由于控制台的开发功能有限,绝大多数的BizTalk程序都是在集成开发环境Visual S ...
随机推荐
- directive中的参数详解
restrictE: 表示该directive仅能以element方式使用,即:<my-dialog></my-dialog>A: 表示该directive仅能以attribu ...
- 通俗理解T检验与F检验的区别【转】
转自:http://blog.sina.com.cn/s/blog_4ee13c2c01016div.html1,T检验和F检验的由来一般而言,为了确定从样本(sample)统计结果推论至总体时所犯错 ...
- 得到UIView中某个非子视图在UIView中的位置
使用 convertRect: fromView: 或者 convertRect: toView:例如一个视图控制器的view中有一个UITableView,UITableView的某个cell中有个 ...
- PHP历程(封装的增删改查方法)
db.class.php 主要方法 <?php /** * 数据库配置信息 */ define('DB_HOST','127.0.0.1'); //服务器 define('DB_USER', ...
- ps让文字的颜色变成图片的颜色
第一种: 把某张图片图层置于文字图层之上,右击图片图层-->选择"创建剪贴蒙版"即可.第二种:把某张图片图层置于文字图层之上,并选择图片图层,按住Ctrl键,点击文字图层,载 ...
- BZOJ1946 : [Ceoi2006]ANTENNA
首先通过随机增量法求出最小覆盖圆,作为答案的上界. 然后二分答案,检验的时候枚举每个点作为原点,求出其他每个点被包括在圆内的角度区间,然后扫描线即可. 时间复杂度$O(Tn^2\log n)$. #i ...
- storm源码之storm代码结构【译】【转】
[原]storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正 ...
- Hadoop IPC的代码结构分析
与IPC相关的代码在org.apache.hadoop.ipc包下.共七个文件,其中4个辅助类: RemoteException Status VersionedProtocol Connection ...
- BZOJ 1086 & 类树的分块
题意: “余”人国的国王想重新编制他的 国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个 不同的城市之间 ...
- 【转】Android之自定义Adapter的ListView
http://www.cnblogs.com/topcoderliu/archive/2011/05/07/2039862.html 在开发中,我们经常使用到ListView这个控件.Android的 ...