Neueste Web-Entwicklung Tutorials
 

Ein XSD Beispiel


In diesem Kapitel wird gezeigt, wie ein XML-Schema zu schreiben. Sie lernen auch, dass ein Schema kann auf verschiedene Weise geschrieben werden.


Ein XML-Dokument

Lassen Sie uns an diesem XML - Dokument einen Blick namens "shiporder.xml" :

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

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

Das XML - Dokument besteht oberhalb eines Wurzelelement "shiporder" , die ein erforderliches Attribut namens enthält "orderid" . Das "shiporder" Element enthält drei verschiedene Kind - Elemente: "orderperson" , "shipto" und "item" . Das "item" Element erscheint zweimal, und es enthält einen "title" , ein optionales "note" Element, eine "quantity" und einen "price" Element.

Die Zeile oben: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" erzählt die XML-Parser, der dieses Dokument gegen ein Schema validiert werden soll. Die Zeile: xsi: noNamespaceSchemaLocation = "shiporder.xsd" gibt , wo das Schema wohnt (here it is in the same folder as "shiporder.xml") .


Erstellen eines XML-Schemas

Jetzt wollen wir über ein Schema für das XML-Dokument zu erstellen.

Wir beginnen mit einer neuen Datei zu öffnen , die wir nennen "shiporder.xsd" . Um das Schema erstellen wir könnten einfach die Struktur im XML-Dokument folgen und jedes Element definieren, wie wir sie finden. Schema-Element, das ein Schema definiert: Wir werden mit der Standard-XML-Deklaration vom xs gefolgt beginnen:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>

Im Schema oben wir die Standard - Namespace verwenden (xs) und der mit diesem Namensraum URI ist die Schema - Sprache Definition, die den Standardwert von http://www.w3.org/2001/XMLSchema hat.

Als nächstes müssen wir die zu definieren "shiporder" Element. Dieses Element hat ein Attribut und andere Elemente enthält, deshalb haben wir es als eine komplexe Art betrachten. Die untergeordneten Elemente des "shiporder" Sequenz - Element , das eine geordnete Folge von Unterelemente definiert: Element wird von einem xs umgeben:

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

Dann müssen wir das definieren "orderperson" Element als einfache Art (weil es keine Attribute oder andere Elemente enthält). Die Art (xs:string) wird mit dem Namespacepräfix mit dem Präfix XML - Schema zugeordnet sind, die eine vordefinierte Schema - Datentyp angibt:

<xs:element name="orderperson" type="xs:string"/>

Als nächstes müssen wir zwei Elemente definieren , die der komplexen Art sind: "shipto" und "item" . Wir beginnen mit der Definition von "shipto" Element:

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Mit Schemas können wir die Anzahl der möglichen Vorkommen für ein Element mit den maxOccurs und minOccurs Attribute definieren. maxOccurs gibt die maximale Anzahl der Vorkommen für ein Element und minOccurs gibt die Mindestanzahl der Vorkommen für ein Element. Der Standardwert für beide maxOccurs und minOccurs ist 1!

Nun können wir das definieren "item" Element. Dieses Element kann mehrere Male innerhalb eines erscheinen "shiporder" Element. Dies wird festgelegt durch die Einstellung maxOccurs Attribut des "item" Element "unbounded" , was bedeutet , dass es so viele Vorkommen der sein kann "item" Element wie der Autor wünscht. Beachten Sie, dass die "note" Element ist optional. Wir haben dies angegeben , indem die minOccurs - Attribut auf Null:

<xs:element name="item" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Wir können nun das Attribut des deklarieren "shiporder" Element. Da dies ein erforderliches Attribut ist, dass wir die Verwendung angeben = "erforderlich".

Note: Die Attributdeklarationen müssen immer an letzter Stelle :

<xs:attribute name="orderid" type="xs:string" use="required"/>

Dies ist die komplette Liste der Schemadatei namens "shiporder.xsd" :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Teilen Sie das Schema

Die bisherige Design-Methode ist sehr einfach, aber kann schwierig sein, zu lesen und zu pflegen, wenn Dokumente komplex sind.

Das nächste Design - Methode basiert alle Elemente auf die Definition und Attribute zuerst und unter Bezugnahme dann ihnen die Verwendung von ref - Attribut.

Hier ist das neue Design der Schemadatei ("shiporder.xsd") :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Mit Named-Typen

Die dritte Design-Methode definiert Klassen oder Typen, die uns Elementdefinitionen wiederverwenden können. Dies geschieht durch die Simple und complex Elemente zu benennen, und zeigen Sie dann auf sie durch die type Attribut des Elements.

Hier ist das dritte Design der Schemadatei ("shiporder.xsd") :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
  <xs:sequence>
    <xs:element name="name" type="stringtype"/>
    <xs:element name="address" type="stringtype"/>
    <xs:element name="city" type="stringtype"/>
    <xs:element name="country" type="stringtype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
  <xs:sequence>
    <xs:element name="title" type="stringtype"/>
    <xs:element name="note" type="stringtype" minOccurs="0"/>
    <xs:element name="quantity" type="inttype"/>
    <xs:element name="price" type="dectype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
  <xs:sequence>
    <xs:element name="orderperson" type="stringtype"/>
    <xs:element name="shipto" type="shiptotype"/>
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  </xs:sequence>
  <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

Das Begrenzungselement zeigt an, dass der Datentyp von einem W3C XML Schema-Namespace-Datentyp abgeleitet wird. So bedeutet das folgende Fragment, dass der Wert des Elements oder Attributs muss ein Zeichenfolgenwert sein:

<xs:restriction base="xs:string">

Das Begrenzungselement wird häufiger verwendet Einschränkungen Elemente anzuwenden. Schauen Sie sich die folgenden Zeilen aus dem Schema oben:

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

Dies zeigt, dass der Wert des Elements oder Attributs muss ein String sein, muss es genau sechs Zeichen in einer Reihe sein, und diese Zeichen muss eine Zahl von 0 bis 9 sein.