上一讲我们主要讲了Schema中simpleType等一些基本的属性用法,这一讲我们继续来Schema中的其他内容,同时对之前学习的过程来一个小阶段的总结。

1. choise 元素

1) 作用:允许唯一的一个元素从一个组中被选择

2) 属性:minOccurs/maxOccurs

3) 示例:

4) 下面我们针对这个元素进行一下简单的Demo。

新建一个test1.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"><xs:complexType name="myType"><xs:choice minOccurs="1" maxOccurs="1"><!--注意:在choice中定义元素,这种元素有两种定义方式了,第一种方式是像上例中在choice里面引用其他定义好的了元素,第二种方式直接在choice里面定义元素,此时这些元素就不能被其他地方所用到了,类似它属于内部类一样。--><xs:element name="hello" type="xs:string"/><xs:element name="world" type="xs:string"/></xs:choice></xs:complexType><xs:element name="helloworld" type="myType"/>
</xs:schema>

新建一个对应的test1.xml

<?xml version="1.0" encoding="UTF-8"?>
<helloworld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test1.xsd">
<hello>welcome</hello></helloworld>

[说明]:<xs:choice minOccurs="1" maxOccurs="1">

       上面语句的作用是针对上面定义的整个整体来说最小出现1个,最多出现1个。而整体的每一次出现都是从choice里面选择一次。也就是说有且仅有一个元素从给定的元素中取出。

[修改]:修改上面test1.xsd

     <xs:choice minOccurs="1" maxOccurs="3"><xs:element name="hello" type="xs:string"/><xs:element name="world" type="xs:string"/>

[说明]:这就表示针对下面的这组元素(看成整体)最小每次从里面选择一次(可能选择hello,或者选择world),最多每次从里面选择3次。

所以其对应的XML文档有可能是以下情况:

<?xml version="1.0" encoding="UTF-8"?>
<helloworld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test1.xsd">
<hello>welcome</hello>
<hello>welcome</hello>
<hello>welcome</hello></helloworld>

【注意】:上面可能是三次这样的数据,但是可以肯定的是它不可能出现四种数据。

2. sequence元素

1) 作用:给一组元素一个特定的序列
2) 示例:

[说明]:sequence里面也有minOccurs和maxOccurs,但是它和choice里面意义是完全不同,它是表示是整组数据(把它下面的元素作为整体)出现3次,而且也是按按照序列来的。

3) 我们来针对它这种情况举一个Demo例子:

新建一个test2.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"><xs:complexType name="myType"><xs:sequence minOccurs="1" maxOccurs="1"><xs:element name="hello" type="xs:string"/><xs:element name="world" type="xs:string"/></xs:sequence></xs:complexType><xs:element name="helloworld" type="myType"/>
</xs:schema>

新建一个test2.xml

<?xml version="1.0" encoding="UTF-8"?>
<helloworld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test2.xsd">
<hello>abc</hello>
<world>xyz</world>
</helloworld>

[说明]:注意它跟前面choise不同的是,它是针对下面的整体元素来的。

[修改]:test2.xsd 中的 mixOccurs,如下所示:

<xs:sequence minOccurs="1" maxOccurs="3"><xs:element name="hello" type="xs:string"/><xs:element name="world" type="xs:string"/></xs:sequence>

则对应满足这个Schema文件的XML文档应该是如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<helloworld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test2.xsd"><hello>abc</hello>
<world>xyz</world><hello>abc</hello>
<world>xyz</world><hello>abc</hello>
<world>xyz</world></helloworld>

【说明】:上面是把sequence下的元素做为整体来判断的,最多整组元素出现三次,此时出现四组数据肯定也是不符合要求的。

3. schema我们差不多就讲到这边了,下面我们来总结一下:

1) 用schema的数据及元素类型声明XML文档的元素和属性

声明元素 :<xs:element>

声明属性 :<xs:attribute>

2) 声明元素的实例:

[注意]:<xs:element name="redDog" type="xs:string" substitutionGroup="dog" />

substitutionGroup  这个元素比较少出现。

表示的是可以用 dog 这个元素代替 redDog,也就是说本来是出现redDog的地方,可以用dog元素替代之。 这个元素了解一下即可

3) 声明元素的方法

(1) 使用内置的数据类型

(2) 使用用户定义的simpleType

[说明]:上述两种simpleType的声明方式是一回事,第一种是先定义类型了,再去定义元素,第二种是定义好元素了,在元素里面定义类型。也就是说第一种的simpleType我可以复用,而第二种的simpleType是没法复用的,所以第二种的simpleType类型没有name属性,除了自己,其它人不能用。

(3) 引用已经定义的元素

(4) 使用complexType

4) 声明属性的方法

5. 下面我们来写一个schema文件来复习一下所学内容

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/po.xsd" targetNamespace="http://tempuri.org/po.xsd"><xs:element name="purchaseOrder" type="PurchaseOrderType"/><xs:element name="comment" type="xs:string"/><xs:complexType name="PurchaseOrderType"><xs:sequence><xs:element name="shipTo" type="USAddress"/><xs:element name="billTo" type="USAddress"/><xs:element ref="comment" minOccurs="0"/><xs:element name="items" type="Items"/></xs:sequence><xs:attribute name="orderDate" type="xs:date"/></xs:complexType><xs:complexType name="USAddress"><xs:sequence><xs:element name="name" type="xs:string"/><xs:element name="street" type="xs:string"/><xs:element name="city" type="xs:string"/><xs:element name="state" type="xs:string"/><xs:element name="zip" type="xs:decimal"/></xs:sequence><xs:attribute name="country" type="xs:NMTOKEN" fixed="US"/></xs:complexType><xs:complexType name="Items"><xs:sequence><xs:element name="item" minOccurs="0" maxOccurs="unbounded"><xs:complexType><xs:sequence><xs:element name="productName" type="xs:string"/><xs:element name="quantity"><xs:simpleType><xs:restriction base="xs:positiveInteger"><xs:maxExclusive value="100"/></xs:restriction></xs:simpleType></xs:element><xs:element name="USPrice" type="xs:decimal"/><xs:element ref="comment" minOccurs="0"/><xs:element name="shipDate" type="xs:date" minOccurs="0"/></xs:sequence><xs:attribute name="partNum" type="SKU" use="required"/></xs:complexType></xs:element></xs:sequence></xs:complexType><!-- Stock Keeping Unit, a code for identifying products --><xs:simpleType name="SKU"><xs:restriction base="xs:integer"><xs:minInclusive value="2"/><xs:maxInclusive value="10"/></xs:restriction></xs:simpleType>
</xs:schema>

[说明]:根据上面的schema文档,它对应的XML文档结构应该如下所示的:

<purchaseOrder>

<shipTo>

<name> </name>

</shipTo>

</purchaseOrder>

现在我们用XMLSpy工具自动添加对应schema文件的XML文档,然后来分析一下里面的内容。

<?xml version="1.0" encoding="UTF-8"?>
<n1:purchaseOrder xmlns:n1="http://tempuri.org/po.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/po.xsd
F:\圣思园\XML\[北京圣思园XML培训视频]_XML.CODE\LESSON~2\code\schema_source\test11.xsd"><shipTo><name/><street/><city/><state/><zip/></shipTo><billTo><name/><street/><city/><state/><zip/></billTo><items/>
</n1:purchaseOrder>

[说明]:以上就是XMLSpy自动帮我们根据Schema文档生成的一个XML文档,但是它还是不合法的,因为根据schema自动生成XML 它不像DTD,它只是生成一个大概结构,里面的元素不会帮我们实现。所以我们必须要加上它所提示的内容,整个文档如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<n1:purchaseOrder xmlns:n1="http://tempuri.org/po.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/po.xsd
test11.xsd"><shipTo><name/><street/><city/><state/><zip>1.2</zip></shipTo><billTo><name/><street/><city/><state/><zip>1.2</zip></billTo><items/>
</n1:purchaseOrder>


[说明]:DTD可以检查出根元素,但是在schema中两个元素,自动生成XML文档,则如何判断它们哪个是跟元素呢?

通过DOCTYPE可以明确指定文档的根元素,因为DOCTYPE后面跟的元素就是文档的根元素;通过Schema是没法明确指定目标XML文档的根元素,XmlSpy是通过推断哪个元素包含了其他元素来选择包含其他元素最多的那个元素作为文档的根,但我们可以明确指定文档的根元素而不必按照XmlSpy的生成来做。

它会让你自动选择一个作为根元素。因为它们是平等的元素。它没法确定哪个元素可以作为XML的根元素,它不像DTD可以通过DOCTYPE来显示的指定,但是它会做一个推断,看哪一个元素尽量多的包含其他元素,它就会认为这个元素就是根元素。所以在上诉schema文档中,把comment做为根也是可以的。

XML第十讲:XML中Schema深入详解、元素、属性、关系相关推荐

  1. Objective-C中的@Property详解

    Objective-C中的@Property详解 @Property (属性) class vairs 这个属性有nonatomic, strong, weak, retain, copy等等 我把它 ...

  2. Spring中,applicationContext.xml 配置文件在web.xml中的配置详解

    Spring中,applicationContext.xml 配置文件在web.xml中的配置详解 2016年10月04日 15:22:26 阅读数:7936 转自http://www.cnblogs ...

  3. 50.深度解密五十:裂变营销(图片营销)中”图片制作”奥秘详解

    网络营销推广技术.技巧深度解密(五十)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解图片营销中的图片制作奥秘的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬 ...

  4. 站长在线Python教程精讲:在Python函数中的局部变量详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的局部变量详解>.本文的主要内容有:变量的作用域的概念.局部变量的概念.局部变量的举例. 目录 1.变量 ...

  5. Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有java层的,也有jni层深入到Frame ...

  6. 《深入理解 Spring Cloud 与微服务构建》第十六章 Spring Boot Security 详解

    <深入理解 Spring Cloud 与微服务构建>第十六章 Spring Boot Security 详解 文章目录 <深入理解 Spring Cloud 与微服务构建>第十 ...

  7. Maven中scope标签详解

    概述 scope元素的作用:控制 dependency 元素的使用范围.通俗的讲,就是控制 Jar 包在哪些范围被加载和使用.具体值如下: compile:默认值.表示被依赖项目需要参与当前项目的编译 ...

  8. oracle中的用户详解 【转】

    oracle中的用户详解 [转] - feiyun8616 - 博客园 (cnblogs.com)https://www.cnblogs.com/feiyun8616/p/6497690.htmlor ...

  9. WebService中的WSDL详解

    WebService中的WSDL详解 有人在WebService开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户(或后台)给你一个WSDL文件(或网址),说按照上面的进行适配, 这 ...

  10. DevExpress控件GridControl中的布局详解 【转】

    DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28|  分类: devexpress |  标签:devexpress  |举报|字号 订阅 h ...

最新文章

  1. github分段下载
  2. Java - 框架之 SpringBoot 攻略day01
  3. R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能
  4. CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
  5. MyEclipse 10(汉化版)安装教程
  6. 如何攻克目标检测?百度全球顶级会议双料冠军团队有话说!
  7. 在linux下配置java,在Linux下配置Java开发环境
  8. Spring MVC教程
  9. Pytorch:数据并行和模型并行,解决训练过程中内存分配不均衡的问题
  10. Word字体修改(罚抄,抄作业专用)
  11. freeswitch 文件包含关系图
  12. line-height和height的区别
  13. 杭州最新公交线路一览(91-100)
  14. 如何在python 设置输入字符的 颜色 背景色,前景色
  15. python中 {0:2.2f}与{1:2.2f}的区别
  16. 李宏毅老师《机器学习》课程笔记-6 GAN
  17. 对复利计算器和股票投资的总结
  18. Multisim基础 NPN型三极管 简单放大电路示例
  19. NICO EXCHANGE NICO 交易所系統維護公告
  20. Learning Hammerspoon中英文互译

热门文章

  1. 扫码点餐小程序有哪些优势
  2. bitvise SSH 打开代码中文显示乱码的问题
  3. matlab2014a如何画电机效率云图,maxwell电机转矩扫描与使用MTPA策略绘制效率map图...
  4. 推荐10个让电脑「 效率高到爆炸 」的软件
  5. ImDisk(似收费的primo ramdisk)免费软件/内存作硬盘
  6. origin 截断y轴
  7. elementui 多选框的使用
  8. html生成pdf字体错误,使用wkhtmltopdf时显示为PDF的错误字体
  9. 有趣的USB接口和颜色分类
  10. python为什么被称为胶水语言_为什么只有python成了胶水语言?