上一讲我们主要讲了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的schema写法_xml文件用什么软件打开[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89112.html