XSD详解三 - 复合元素+总结篇
一、复合元素介绍
1、什么是复合元素?
复合元素指包含其他元素及/或属性的 XML 元素。
有四种类型的复合元素:
- 空元素
- 包含其他元素的元素
- 仅包含文本的元素
- 包含元素和文本的元素
注释:上述元素均可包含属性!
2、如何定义复合元素?
类似属性定义和内容限定,定义复合元素同样有两种方式
1. 直接对"employee"元素进行声明,就像这样:
- <xs:element name="employee">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="firstname" type="xs:string"/>
- <xs:element name="lastname" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
假如您使用上面所描述的方法,那么仅有 "employee" 可使用所规定的复合类型。请注意其子元素,"firstname" 以及 "lastname",被包围在指示器 <sequence>中。这意味着子元素必须以它们被声明的次序出现。
2. "employee" 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称:
- <xs:element name="employee" type="personinfo"/>
- <xs:complexType name="personinfo">
- <xs:sequence>
- <xs:element name="firstname" type="xs:string"/>
- <xs:element name="lastname" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
二、指示器
通过指示器,我们可以控制在文档中使用元素的方式。xsd有七种指示器:
Order 指示器:
- All
- Choice
- Sequence
Occurrence 指示器:
- maxOccurs
- minOccurs
Group 指示器:
- Group name
- attributeGroup name
1、Order 指示器
Order 指示器用于定义元素的顺序。
All
<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次。
Choice
<choice> 指示器规定对应的XML可出现<choice>声明中的某个子元素;
实例:
- <xs:element name="project">
- <xs:complexType>
- <xs:choice >
- <xs:element name="a"/>
- <xs:element name="b"/>
- </xs:choice>
- </xs:complexType>
- </xs:element>
那么此时对应的xml中project元素仅能包含<a/>或<b/>。
Sequence
<sequence> 规定子元素必须按照特定的顺序出现,默认每个仅能出现一次。
2、Occurrence 指示器
Occurrence 指示器用于定义某个元素出现的频率。
注释:对于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。
maxOccurs
<maxOccurs> 指示器可规定某个元素可出现的最大次数。
minOccurs
<minOccurs> 指示器可规定某个元素能够出现的最小次数。
提示:如需使某个元素的出现次数不受限制,请使用 maxOccurs="unbounded" 这个声明:
3、Group 指示器
元素组
实例:
- <xs:group name="persongroup">
- <xs:sequence>
- <xs:element name="firstname" type="xs:string"/>
- <xs:element name="lastname" type="xs:string"/>
- <xs:element name="birthday" type="xs:date"/>
- </xs:sequence>
- </xs:group>
- <xs:element name="person" type="personinfo"/>
- <xs:complexType name="personinfo">
- <xs:sequence>
- <xs:group ref="persongroup"/>
- <xs:element name="country" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
属性组
属性组通过 attributeGroup 声明来进行定义:
- <xs:attributeGroup name="personattrgroup">
- <xs:attribute name="firstname" type="xs:string"/>
- <xs:attribute name="lastname" type="xs:string"/>
- <xs:attribute name="birthday" type="xs:date"/>
- </xs:attributeGroup>
- <xs:element name="person">
- <xs:complexType>
- <xs:attributeGroup ref="personattrgroup"/>
- </xs:complexType>
- </xs:element>
三、复合元素
1、空元素
空的复合元素不能包含内容,只能含有属性。
一个空的 XML 元素:
- <product prodid="1345" />
对应的XSD
- <xs:element name="product">
- <xs:complexType>
- <xs:attribute name="prodid" type="xs:positiveInteger"/>
- </xs:complexType>
- </xs:element>
2、仅含元素
XML 元素,"person",仅包含其他的元素:
- <person>
- <firstname>John</firstname>
- <lastname>Smith</lastname>
- </person>
您可在 schema 中这样定义 "person" 元素:
- <xs:element name="person">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="firstname" type="xs:string"/>
- <xs:element name="lastname" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
3、仅含文本
仅含文本的复合元素可包含文本和属性。
这里有一个 XML 元素的例子,"shoesize",其中仅包含文本:
- <shoesize country="france">35</shoesize>
下面这个例子声明了一个复合类型,其内容被定义为整数值,并且 "shoesize" 元素含有名为 "country" 的属性:
- <xs:element name="shoesize">
- <xs:complexType>
- <xs:simpleContent>
- <xs:extension base="xs:integer">
- <xs:attribute name="country" type="xs:string" />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- </xs:element>
4、混合内容
混合的复合类型可包含属性、元素以及文本。
XML 元素,"letter",含有文本以及其他元素:
- <letter>
- Dear Mr.<name>John Smith</name>.
- Your order <orderid>1032</orderid>
- will be shipped on <shipdate>2001-07-13</shipdate>.
- </letter>
下面这个 schema 声明了这个 "letter" 元素:
- <xs:element name="letter">
- <xs:complexType mixed="true">
- <xs:sequence>
- <xs:element name="name" type="xs:string"/>
- <xs:element name="orderid" type="xs:positiveInteger"/>
- <xs:element name="shipdate" type="xs:date"/>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
总结
定义复合元素的时候,刚接触到人可能会对元素(extension、simpleContent、complexContent、simpleType、complexType)的使用产生混淆,这里简要归纳一下希望对大家有帮助:
使用extension扩展的功能都可以在complexType内完成,但是当我们可能或需要在不同的地方对同一块复杂或者简单的类型(complexType or simpleType)进行重复引用时,我们可以把需要重用的代码块单独出来然后使用extension进行引用。
extension的父元素是simpleContent或者complexContent,当我们扩展的是简单类型时,比如属性、文本,应使用simpleContent,而当扩展的是复杂类型时,比如元素,则应使用complexContent。
本章关于xsd的介绍就到这里结束了,如有错误欢迎指出。
转载请注明出处:http://www.cnblogs.com/cjh-notes/p/7992006.html
XSD详解三 - 复合元素+总结篇的更多相关文章
- XSD详解二 - 简易元素、属性、内容限定
一.XSD 简易元素 XML Schema 可定义 XML 文件的元素. 简易元素指那些只包含文本的元素.它不会包含任何其他的元素或属性. 1.什么是简易元素? 简易元素指那些仅包含文本的元素.它不会 ...
- Nginx详解三:Nginx基础篇之yum安装
Nginx快速搭建 Mainline version ----开发版:具有最新功能的版本,用于测试.研究.学习,不用于企业生成环境 Stable version----稳定版:官方认可,且通过测试的 ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
- WebSocket安卓客户端实现详解(三)–服务端主动通知
WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...
- .NET DLL 保护措施详解(三)最终效果
针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...
- logback -- 配置详解 -- 三 -- <encoder>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
- pika详解(三)SelectConnection及其他Connection
pika详解(三)SelectConnection及其他Connection 本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...
随机推荐
- vue.js打包后,接口安全问题
后面有一位朋友回答后台origin判断,但另一个朋友说可以通过代理请求就绕过跨域. 想想也对,代理的话origin就无效了,页面还是可以跑起来. 不知道有没有人想过这个问题,还是我想的方向有误,请各位 ...
- CSAPP 第二章随笔
类型转换问题 (1)int -> short 二进制位高位截断,低位保持不变 (2)同类型 unsign -> sign 记住二进制位是不变的 (3)P101页提到的编译器乘法优化问题,一 ...
- mysql 两个时间段的差,可以是秒,天,星期,月份,年...
SELECT TIMESTAMPDIFF(SECOND, now(), "2012-11-11 00:00:00") 语法为:TIMESTAMPDIFF(unit,datetime ...
- RAC某节点v$asm_disk查询hang分析处理
主题:RAC某节点v$asm_disk查询hang分析处理 环境:Oracle 11.2.0.3 RAC 故障描述:RAC环境2个节点,节点1查询v$asm_disk正常返回结果,节点2查询v$asm ...
- 【转】WPF 从FlowDocument中找到Hyperlink
原文地址:How can I get a FlowDocument Hyperlink to launch browser and go to URL in a WPF app? #region Ac ...
- Linux指令--性能监控和优化命令相关指令
原文出处:http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html.感谢作者无私分享 性能监控和优化命令相关指令有:top,free,v ...
- linkin大话数据结构--Collections类
操作集合的工具类:Collections Collections 是一个操作 Set.List 和 Map 等集合的工具类.Collections 中提供了大量方法对集合元素进行排序.查询和修改等操作 ...
- 反编译class文件并重新编译的方法
在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler ...
- XML (二)
1 SAX 在使用DOM解析XML文档的时候,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而再对XML文档进行操作.此种情况下,如果XML文档特别大,就会消耗计算机的 ...
- java IO(四):键盘录入
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...