3.【xml schema】复杂元素

4.复合元素

xml 包含下面几种类型的复合元素【复合元素指包含其他元素及/或属性的 XML 元素。】
  • 空元素
  • 包含其他元素的元素
  • 仅包含文本的元素
  • 包含元素和文本的元素

上面几种都可以包含属性

<product pid="1234"/> 是一个空元素

<employ>
    <firstname>John</firstname> <lastname>Smith</lastname> </employ>

这个是一个复合元素 包含其他的元素 下面是一个只包含文本的复合元素

<food type="dessert">Ice Cream</food> 也可包含文本和元素

<description>
    I have a book on <date lang="norwegian">01.01.99</date> .... </description>

上面的这个就和原生的xml 不一样了

xsd 定义复合元素

方式1

<employee>
    <firstname>John</firstname> <lastname>Smith</lastname> </employee>

可以直接对 employee 进行定义

<xs:element name="employment">
  <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"> <xs:element name="lastname" type="xs:string"> </xs:sequence> </xs:complexType> </xs:element>

被包围在指示器 <sequence>中。这意味着子元素必须以它们被声明的次序出现 具体查询 连接

一样的可以使用type属性 可以多个element 使用同一个 type

<xs:element name="employment" type="employmentType"/> <xs:element name="another_employment" type="employmentType"/> <xs:complexType name="employmentType"> <xs:sequence> <xs:element name="firstname" type="xs:string"> <xs:element name="lastname" type="xs:string"> </xs:sequence> </xs:complexType>

在某个的基础上

<xs:complexType name="employmentType">
  <xs:sequence> <xs:element name="firstname" type="xs:string"> <xs:element name="lastname" type="xs:string"> </xs:sequence> </xs:complexType> <xs:complexType name="fullinfo"> <xs:extension base="employmentType"> <xs:sequence> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexType>
上面 代码有错误 

正确要加一个xs:complexContent 应该是下面的代码:

<xs:complexType name="employmentType">
    <xs:sequence>
	<xs:element name="firstname" type="xs:string"/>
	<xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="fullinfo">
    <xs:complexContent>
	<xs:extension base="employmentType">
	  <xs:sequence>
		<xs:element name="address" type="xs:string"/>
		<xs:element name="city" type="xs:string"/>
		<xs:element name="country" type="xs:string"/>
	  </xs:sequence>
	</xs:extension>
    </xs:complexContent>
</xs:complexType>    

  

1 详解【空的复合元素】

不能包含内容,只能含有属性。
<product prodid="1345" />

<xs:element name="product">
    <xs:complexType> <xs:complexContext> <xs:restriction base="xs:integer"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:restriction> </xs:complexContext> </xs:complexType> </xs:element>

和之前不一样的是 多了一个 xs:complexContext
xs:attribute 类型 没有element restriction

complexContent 元素给出的信号是,我们打算限定或者拓展某个复合类型的内容模型,而 integer 限定则声明了一个属性但不会引入任何的元素内容 integer 虽然声明了 但是没有一个element

<xs:element name="product">
  <xs:complexType> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:complexType> </xs:element>

xs:positiveInteger 正整数 这个是一个紧凑的写法是和上面 xs:complexContent>xs:restriction 的一样

或者您可以为一个 complexType 元素起一个名字,然后为 "product" 元素设置一个 type 属性并引用这个 complexType 名称(通过使用此方法,若干个元素均可引用相同的复合类型

不使用type的时候 将会使用 element 包住 complexType

<xs:element name="product" type="prodtype"/> //注意这边只是一个 闭合标签 <xs:complexType name="prodtype"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:complexType>
2.仅含文本的复合元素

内容添加 simpleContent 元素

<xs:element name="product">
  <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:positiveInteger"> <xs:element name="lastname" type="xs:positiveInteger"> </xs:sequence> </xs:complexType> </xs:element>
3.仅含文本复合元素

<label>content</label> 此类型仅包含简易的内容(文本和属性)所有使用 simpleContent元素

<xs:element name="simplename">
    <xs:complexType> <simpleContent> <xs:extension base="basetype"> .... </xs:extension> </simpleContent> </xs:complexType> </xs:element>

或者

<xs:element name="simplename">
    <xs:complexType> <simpleContent> <xs:restriction base="basetype"> .... </xs:restriction> </simpleContent> </xs:complexType> </xs:element>

使用xs:extension 或者 xs:restriction 元素扩展或限制元素的基本简易类型

<shoesize country="france">35</shoesize>

<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>

或者

<xs:element name="shoesize">
    <xs:complexType> <xs:simpleContent> <xs:restriction base="xs:integer"> <xs:attribute name="country" type="xs:string"> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>

xml 如下
<?xml version="1.0" encoding="UTF-8"?>

<shoesize xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="test1.xsd" country="ste">
1233 </shoesize>
上面的xml 可以通过验证
4.带有混合内容的复合类型

包含属性,元素 和文本

DEMO

<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid> will be shipped on <shipdate>2001-07-13</shipdate>. </letter>

下面是xsd

<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>

转载于:https://www.cnblogs.com/martinding/p/7478944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值