XMLSchema定义的学习和总结
XML Schema 定义的学习和总结 @Daiven 为什么需要 XML Schema? XML 是一种标识语言,类似于 HTML 一样。然而,XML 与 HTML 有较大的差异,HTML 中的 标签是死的,比如、等,都是 HTML 标准中就规定好的。而 xml 的标签可以自 己随便定义。 因此,HTML 标准应用范围就有局限性,只能作为网页浏览使用。XML 比 HTML 要更上层, 作用的范围也更广,可以用作数据的交换,WEB 服务等各种领域。另外,两者在语法上也有 较大不同,XML 规式要更严谨。 正因为 XML 对标签没有严格的约定,那我们在使用 XML 时,如何保证这个 XML 文档是符合 格式要求的。比如:在某个行业的数据交换时,A 发送的 XML 根元素必需使用,以 及其子元素必需是, B 收到该 XML 文件后, 在使用之前应该对该文件的正确 性校验,那我们按什么规则来校验呢?因此,要校验 XML 文件就需要对 XML 文件的内容进 行约束,就需要使用 XML Schema。 XML Schema 如何定义呢 1)分析 XML 文件的构成模型 XML Schema 是定义 XML 文件的。如何定义,我们需要先分析 XML 文件的构成。 首先,将 XML 的元素的类型分为两种:简单类型、复杂类型。简单类型的元素不能包括子 元素或属性(注意:属性也不能包含) 。复杂类型可以产生在其他元素中嵌套元素的效果, 或者为元素增加属性。其中 XML Schema 标准已经提供了 40 多种简单类型,比如 string、 interger 等。另外,复杂类型肯定是需要用户自己定义的(因为 XML Schem 就是为了让用户 自己定义所需要的任意元素) ,用户也可以基于标准的 40 多种简单类型定义自己的简单类 型(比如长度不超过 10 个的字符元素) 。 简单类型元素: 张三 复杂元素类型: 示例一: 张三 示例二: 001 25 张三 其次, XML 文件实际就是由一个一个的元素(element)组成,有的是简单类型的元素,有 的是复杂类型的元素。并且,每个元素包括两个部分:元素名、元素内容。元素内容:包括 元素属性、元素的值、元素之间的嵌套关系等。 张三 元素名 元素内容 因此,XML Schema 就是定义 XML 文件中的元素,包括对简单类型元素和复杂类型元素的定 义。 定义包括元素的名称,以及元素的内容。元素的名称是指元素的标签名,元素的的内 容的定义是指对元素标签的取值类型、元素之间的嵌套关系,以及元素标签的属性的定义。 2)如何定义简单类型 我们先从最简单的入手, 定义简单类型元素。(再次强调, 简单类型元素是指不包括子元素, 也不包含属性的元素) 。 比如下面这个简单元素: 张三 它首先是一个元素,我们要定义为元素, 该元素的标签名为 person,因此我们定义其名字 该元素有一个值“张三”,是字符类型,因此定义该元素的值类型,XML Schema 如下: 如果该简单类型不作为 XML Schema 文件中的全局的对象定义, 例如: 上面的类型名为 type1 的类型只在 person 元素中定义,则可以采用匿名方式表示,如下。注意 simpleType 简单类 型没有定义 name,元素 person 也没有定义 type,默认表示 person 元素是一个简单类型, 简单类型的定义就是 simpleType 中的定义。 如果该类型为 XML Schema 的基本类型,还有一种更为简单的表示形式,可直接定义如下: 注:这里的type为基本类型,XML规范中有很多种基本类型,字符型、数值型等等。具体 详细情况可查询相关手册。 为了更好地满足需要, 用户也可以自己定义简单类型, 比如需要定义一个字符长度不超过 10 的 string 的类型,该类型也是简单类型。自定义的简单类型主要是指:以 XML Schema 的类 型为基础,添加一些限制条件,使之成为新的类型,比如限定数值范围、限定数据位数、限 定字符串范围、枚举类型、列表类型、联合类型等。如下: 注: 1、 自定义的简单类型可以做更复杂的限制条件,满足需求。本文主要讲述相关的概念,更 多的限制条件的定义,可以查询相关手册。 2、 自定义的“列表类型”、“联合类型”等,逻辑是一样的,只是语法稍有差异,这里也不详 细描述,可查阅相关手册。 3)如何定义复杂类型 看看这个复杂类型,我们该如何定义? 001 25 张三 元素包含有三个子元素。因此,该元素为复杂类型,所以其 element 的 type 不能等 于”string”、”integer”等基本类型,需要定义为 complexType,如下: 注: “complexTypeName”自己取名, 只要能找到名称为complexTypeName 的complexType元 素即可。 然后, 它包含有三个子元素, 并且这三个元素都是简单类型。 那如何将这三个子元素与 person 的关系呢?通过复杂类型定义来表示,语法是这样的: 注:其中sequence表示三个子元素的顺序,并且与该顺序相同。也可用使用其他的限制方 式,比如all、choice、group等等,具体可查阅相关文档,这里不详细表述。 同简单元素的匿名定义一样, 如果该复杂类型只限定在该元素中使用, 复杂类型的元素也可 以采用匿名方式定义,如下。表示的意思与上面是一样的。 上例中,复杂元素 person 有三个子元素,均为字符类型。也可以对三个子元素进行定义, 比如三个子元素可以定义为简单类型, 也可以定义为复杂类型, 同时也可以定义三个子元素 的出现次数、长度、大小等等,定义的方法与简单类型定义是一样的。 比如:使用 maxOccurs、minOccurs 来定义 name 出现的次数,使用 simpleType 限制 age 的 范围为 1~150 之间。如下: 根据上述 XML Schema 的定义,XML 文件可写如下: abc 25 张三 小名 4)元素之间的嵌套 其实,刚才介绍复杂元素定义时,已经说明了元素的嵌套关系。 如果元素中间含有子元素,则该元素为复杂元素,其遵循复杂类型元素的定义方式即可。 5)元素的属性定义 上面几节主要介绍了如何定义元素的标签、元素的嵌套关系、元素的取值类型的定义,元素 的属性如何定义呢?比如,为 person 元素增加一个 sex 属性,XML Schema 该怎么定义呢? abc 25 张三 元素 person 的属性定义如下: 如前所述,简单的元素不能有属性。如果一个元素有属性,那么他就是一个复合的元素,意 思就是说有属性的元素总是被定义为复合的类型。另外,属性只能被声明为简单类型。总结 注意两点: 所有的属性都被声明为简单的类型。 只有复合的元素能有属性。 例如,将元素 person 的 sex 属性声明为简单类型,并且为枚举: 6)采用 ref 引用方式定义元素和属性 为了增加 XML Schema 文档的可读性,我们可以采用 ref 引用方式来定义元素和属性。 先看看,采用 ref 引用方式定义元素,如下。元素 k 为复杂类型,包含子元素 e1、