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