XML Tutorial/XML Schema/complexType

Материал из Web эксперт
Версия от 08:26, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Build complexType with complexType

File: Data.xml
<?xml version="1.0"?>
<products xmlns ="http://www.wbex.ru"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.wbex.ru Schema.xsd">
      <product>
          <description>description 1</description>
          <warranty>lifetime warranty</warranty>
          <name>name 1</name>
          <image>a.gif</image>
          <cost>41.95</cost>
          <retailer>http://www.wbex.ru</retailer>
      </product>
      <product>
          <description>description 1</description>
          <warranty>lifetime warranty</warranty>
          <name>name 2</name>
          <image>b.gif</image>
          <cost>239.00</cost>
          <retailer>http://www.wbex.ru</retailer>
      </product>
</products>
File: Schema.xsd
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.wbex.ru"
            xmlns="http://www.wbex.ru"
            elementFormDefault="qualified">
    <xsd:complexType name="appliance">
        <xsd:sequence>
            <xsd:element name="description" type="xsd:string"/>
            <xsd:element name="warranty" type="xsd:string" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="productType">
        <xsd:complexContent>
            <xsd:extension base="appliance">
                <xsd:sequence>
                    <xsd:element name="name" type="xsd:string"/>
                    <xsd:element name="image" type="imageType"/>
                    <xsd:element name="weight" type="xsd:positiveInteger" minOccurs="0"/>
                    <xsd:element name="cost" type="money" maxOccurs="unbounded"/>
                    <xsd:element name="retailer" type="xsd:anyURI"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element name="products">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="product" type="productType" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="money">
        <xsd:restriction base="xsd:decimal">
            <xsd:fractionDigits value="2"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="imageType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="(.)+\.(gif|jpg|jpeg|bmp)"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>


Complex type for element with child elements and attribute

File: Data.xml
<?xml version="1.0"?>
<BOOK InStock="true">
   <TITLE>title 1</TITLE>
   <AUTHOR>author 1</AUTHOR>
   <BINDING>trade paperback</BINDING>
   <PAGES>473</PAGES>
   <PRICE>10.95</PRICE>
</BOOK>
File: Schema.xsd

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="BOOK">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="TITLE" type="xsd:string"/>
            <xsd:element name="AUTHOR" type="xsd:string"/>
            <xsd:element name="BINDING" type="xsd:string"/>
            <xsd:element name="PAGES" type="xsd:positiveInteger"/>
            <xsd:element name="PRICE" type="xsd:decimal"/>
         </xsd:sequence>
         <xsd:attribute name="InStock" type="xsd:boolean" 
            use="required"/>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>

If an element does not contain any character data, it?considered empty. 

<xsd:element name="mark">
  <xsd:complexType/>
</xsd:element>


Complex type with sequence

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.wbex.ru"
  xmlns="http://www.wbex.ru" 
  elementFormDefault="qualified">
  <xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to" type="xs:string" />
        <xs:element name="from" type="xs:string" />
        <xs:element name="heading" type="xs:string" />
        <xs:element name="body" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Content Models

In XML Schemas you can specify an element"s content model using the following: 
A <sequence>declaration 
A <choice>declaration 
A reference to a global <group>declaration 
An <all>declaration 
Each of these declarations may contain the following: 
Inner content models 
Element declarations 
Element wildcards


Defining Complex Types

An element that can contain other elements or that is allowed to contain attributes is a complex type.
There are four kinds of elements of complex type: 
"element only" contain just other elements or attributes-but no text, 
"empty" elements contain attributes-but never elements or text, 
"mixed content" elements contain a combination of elements, attributes, and/or text-especially elements and text, 
"text only" elements contain only text-and possibly attributes.
Within <complexType> definitions, you can specify the allowable element content for the declaration: 
When we created a local declaration, we did not include a name attribute in our <complexType> definition. 
Local <complexType> definitions are not named, which are called anonymous complex types. 
Global <complexType> definitions are always named, so that they can be identified later. 
<complexType> definitions can also be used to create mixed and empty content models. 
Mixed content models allow you to include both text and element content within a single content model. 
<element name="description"> 
    <complexType mixed="true"> 
        <choice minOccurs="0" maxOccurs="unbounded"> 
            <element name="em" type="string"/> 
            <element name="strong" type="string"/> 
            <element name="br" type="string"/> 
        </choice> 
    </complexType> 
</element>


Defining Elements to Contain Only Elements

An element with the most basic of complex types can contain other elements, and possibly attributes as well-but not text.
The elements contained within a complex type must be part of a sequence, choice, unordered group, or named group.
 
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.wbex.ru" xmlns="http://www.wbex.ru"
  elementFormDefault="qualified">
  <xsd:complexType name="endspeciesType">
    <xsd:sequence>
      <xsd:element name="animal" type="xsd:string" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>


Defining Elements with Mixed Content

When creating a complex type that will define such an element, you must declare that the content will be mixed.
 
File: Schema.xsd
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.wbex.ru" xmlns="http://www.wbex.ru"
  elementFormDefault="qualified">
  <xsd:complexType name="paragraph" mixed="true">
    <xsd:sequence>
      <xsd:element name="name" type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="length" type="xsd:string" />
  </xsd:complexType>
  <xsd:element name="description" type="paragraph" />
</xsd:schema>

File: Data.xml 
<description xmlns="http://www.wbex.ru" length="short">The 
<name>tiger</name>
world. 
</description>


To declare an empty content model in a <complexType> definition

Create the <complexType> definition without any <element> or content model declarations. 
<element name="knows"> 
    <complexType> 
    </complexType> 
</element> 
<element name="knows"> 
    <complexType/> 
</element> 
In both cases, the <complexType> definition is empty, indicating that knows will not contain text or element children.
When used in our instance document, <knows> must be empty.
Even when you are declaring an empty element, attribute declarations may still appear within the <complexType>. 
For example, the following elements would be valid:
<knows/> 
<knows></knows> 
<element name="knows"> 
    <complexType> 
        <attribute name="contacts" type="IDREFS"/> 
    </complexType> 
</element>


When an element contains both child elements and character data, it follows the mixed content model

<message>
   A
   <projectLead>B</projectLead>
   C
   <projectMember>D</projectMember>
   E
   <projectMember>F</projectMember>.
   G<client>H<client>
   I
</message>
The declaration that should be used to define a mixed content model is as follows:
<xsd:element name="message">
  <xsd:complexType mixed="true">
   <xsd:sequence>
    <xsd:element name="projectMember" type="xsd:string"/>
    <xsd:element name="projectLead" type="xsd:string"/>
    <xsd:element name="client" type="xsd:string"/>
   </xsd:sequence>
  </xsd:complexType>
</xsd:element>