« Übersicht: Schema

Ein eigener Datentyp

Lernziel

Neben den eingebauten, können Sie eigene Datentypen definieren. Wie, wird hier gezeigt. Dafür gibt es in einer DTD keine vergleichbare Deklarationsmöglichkeit.

Handlungsanweisungen

Aufgaben:
  1. Erweitern Sie das Schema aus der vorherigen Station
  2. Die Werte für einen eigenen Datentyp können über Reguläre Ausdrücke sehr genau definiert werden.

Die DTD als Vorlage

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT adressdb (adresse+)>
<!ENTITY % sichtbarkeit "einsicht (privat|public|proteced) #REQUIRED">
<!ELEMENT adresse (anrede, name, strasse, postanschrift, email?, bild)>
<!ELEMENT anrede (#PCDATA)>
<!ELEMENT name (nachname, vorname)>
<!ELEMENT postanschrift (plz, wohnort)>
<!ELEMENT nachname (#PCDATA)>
<!ELEMENT vorname (#PCDATA)>
<!ELEMENT plz (#PCDATA)>
<!ELEMENT wohnort (#PCDATA)>
<!ELEMENT strasse (#PCDATA) >
<!ELEMENT email (#PCDATA)>
<!ATTLIST strasse %sichtbarkeit;>
<!ATTLIST postanschrift land
          (Deutschland | Schweiz | Oesterreich) #REQUIRED %sichtbarkeit; >
<!ATTLIST adresse nr CDATA #REQUIRED>
<!ELEMENT bild EMPTY>
<!ATTLIST bild bezeichnung CDATA #REQUIRED>
<!ENTITY email_default "keine E-Mail angegeben" %sichtbarkeit; >

Datentyp PLZ

Eine Postleitzahl besteht aus maximal 5 Ziffern. Diese Regel soll in einem eigenen Datentyp definiert werden (Siehe Zeilen 54, 82-86).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="adressdb">
    <xs:annotation>
      <xs:documentation>Meine Adressammlung</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="adresse" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute ref="nr" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="adresse">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="anrede" minOccurs="1"/>
        <xs:element ref="name" minOccurs="1"/>
        <xs:element ref="strasse" minOccurs="1"/>
        <xs:element ref="postanschrift" minOccurs="1"/>
        <xs:element ref="email" minOccurs="0"/>
        <xs:element ref="bild" minOccurs="1"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="anrede" type="xs:string"/>
  <xs:element name="name">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="nachname"/>
        <xs:element ref="vorname"/>
        <xs:element name="geburtstag" type="xs:date"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
 <xs:element name="postanschrift">
    <xs:complexType>
        <xs:sequence>
        <xs:element ref="plz"/>
        <xs:element ref="wohnort"/>
      </xs:sequence>
      <xs:attribute name="land" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Deutschland"/>
            <xs:enumeration value="Schweiz"/>
            <xs:enumeration value="Östereich"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute ref="einsicht" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="strasse">
  <xs:element name="plz" type="plz-type"/>
  <xs:element name="wohnort" type="xs:string"/>
  <xs:element name="email" type="xs:string"/>
    <xs:complexType>
      <xs:attribute ref="einsicht"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="email" type="xs:string" default="Keine E-Mail angegeben"/>
  <xs:element name="bild">
    <xs:complexType>
      <xs:attribute name="bildbezeichnung" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="nachname" type="xs:string"/>
  <xs:element name="vorname" type="xs:string"/>
  <xs:attribute name="einsicht">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="privat"/>
        <xs:enumeration value="public"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>
  <xs:attribute nr="nr">
    <xs:simpleType>
      <xs:restriction base="xs:positiveInteger"/>
    </xs:simpleType>
  </xs:attribute>
  <xs:simpleType name="plz-type">
    <xs:restriction base="xs:integer">
      <xs:pattern value="[0-9]{5}"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

Das fertige XML-Dokument

<adressdb xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:noNamespaceSchemaLocation="artikel05.xsd">
   <adresse nr='1'>
    <anrede/>
    <name>
      <nachname/>
      <vorname/>
    </name>
    <strasse einsicht="privat"/>
    <postanschrift einsicht="privat" land="Deutschland">
      <plz>14548</plz>
      <wohnort/>
    </postanschrift>
    <email>Keine E-Mail angegeben</email>
    <bild bildbezeichnung="testbild.jpg"></bild>
  </adresse>
</adressdb>