Schema XML

XML Schema, sau XSD (XML Schema Definition) pe scurt , este o recomandare W3C pentru definirea structurilor pentru documentele XML . Spre deosebire de clasicele DTD XML , structura este descrisă sub forma unui document XML. Un număr mare de tipuri de date sunt, de asemenea, acceptate.

Schema XML descrie tipuri de date, instanțe individuale de schemă (documente) și grupuri de astfel de instanțe într-un limbaj de schemă complex . O schemă XML specifică este, de asemenea, cunoscută sub numele de XSD (XML Schema Definition) și fișierul are de obicei extensia .xsd . Spre deosebire de DTD-uri , atunci când se utilizează scheme XML, se poate face distincție între numele tipului XML și numele etichetei XML utilizate în instanță.

În plus față de schema XML, există și alte concepte pentru definirea structurilor XML, cum ar fi RELAX NG sau Schematron . De asemenea, DTD ca componentă standard a XML-ului în sine poate fi utilizat.

Tipuri de date

Schema XML face distincție între tipurile de date simple (atomice) și tipurile de date complexe. În textul următor, termenul tip denotă specificația abstractă a structurii unei secțiuni într-un document XML. Tipurile de date din schema XML sunt clasificate în tipuri de date încorporate sau predefinite (încorporate) și personalizate (definite de utilizator) .

În specificația W3C pentru schema XML , sunt definite 19 tipuri de date primitive prestabilite (de exemplu , boolean, șir, float, dată și NOTAȚIE ) și alte 25 de tipuri de date primitive derivate (cum ar fi ID și număr întreg ).

Băieți simpli

Schema XML oferă câteva tipuri de date atomice de bază. Tipurile de date atomice conțin tipurile „clasice”, deoarece sunt, de asemenea, parțial specificate în alte sisteme de tip (de exemplu , C , Java sau SQL ):

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:float
  • xs:boolean
  • xs:date
  • xs:time

Există, de asemenea, alte tipuri atomice XML specifice, inclusiv:

  • QName: nume calificat, identificator unic la nivel global. Compus din așa-numitele NCNames (Non-Colonized Names), fiecare NCName până la ultimul spațiu de nume (namespace) , respectiv. Ultimul NCName corespunde numelui local din spațiul de nume. Numele NCN individuale sunt combinate pentru a forma un QName folosind un punct (.) .
  • anyURI: Uniform Resource Identifier ( URI )
  • language: Numele limbii, de ex. B. de-DE, en-US, fr
  • ID: Atribut de identificare în cadrul elementelor XML
  • IDREF: Referință la o valoare ID

Tipurile simple de date XML nu trebuie să conțină elemente copil XML și nici să aibă atribute XML.

În plus față de tipurile de date atomice, listele și uniunile (formate din elemente și liste atomice) aparțin tipurilor simple:

  • Următorul exemplu definește un nou tip de date XML cu numele monatIntși o listă a monateacestui nou tip:
<xs:simpleType name="monatInt">
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="1"/>
    <xs:maxInclusive value="12"/>
  </xs:restriction>
</xs:simpleType>
<xs:simpleType name="monate">
  <xs:list itemType="monatInt"/>
</xs:simpleType>

O instanță de nou tip ar putea arăta astfel:

<monate>
   1 2 3 4 5 6 7 8 9 10 11 12
</monate>

Elementele individuale ale unei liste sunt separate prin spațiu alb (aici: spațiu).

  • Tipurile simple includ și așa-numitele uniuni .

Un tip nou este definit ca unirea tipurilor deja existente. Fiecare instanță își alege apoi tipul din acest set. Următorul exemplu definește un alt tip monatsnameși un tip de uniune monat:

<xs:simpleType name="monatsname">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Jan"/>
    <xs:enumeration value="Feb"/>
    <xs:enumeration value="Mär"/>
    <!-- und so weiter … -->
  </xs:restriction>
</xs:simpleType>
<xs:simpleType name="monat">
  <xs:union memberTypes="monatsname monatInt"/>
</xs:simpleType>

Elementele XML ale tipului monatpot conține fie valori întregi cuprinse între 1-12 sau unul dintre numele lunilor corespunzătoare ca șir de caractere. Instanțele valide sunt, de exemplu:

<monat>Jan</monat>
<monat>2</monat>

Tipuri complexe

În plus față de tipurile simple, definițiile complexe ale tipurilor de date XML oferă posibilitatea definirii structurilor de elemente împreună. Astfel de structuri pot conține elemente și atribute suplimentare.

Următorul exemplu definește un nou tip pc-Typcu elemente copil corespunzătoare name, herstelleretc., precum și un atribut id:

<xs:complexType name="pc-Typ">
  <xs:sequence>
    <xs:element name="name"       type="xs:string"/>
    <xs:element name="hersteller" type="xs:string"/>
    <xs:element name="prozessor"  type="xs:string"/>
    <xs:element name="mhz"        type="xs:integer" minOccurs="0"/>
    <xs:element name="kommentar"  type="xs:string"  minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute name="id" type="xs:integer"/>
</xs:complexType>

Opțiunile pentru definirea tipurilor complexe sunt explicate aici doar ca exemple. Cititorul interesat este trimis la linkurile de mai jos către site-ul web W3C.

Copiii de tip complex pot fi combinați în trei moduri diferite:

  • xs:sequence: Este specificată o listă de elemente copil. Fiecare dintre aceste elemente nu poate apărea niciodată, o dată sau de mai multe ori (atribute minOccursși maxOccurs). Dacă nu există nici un occursatribut, valoarea implicită 1 este utilizată în ambele cazuri. Elementele dintr-un sequencetrebuie să apară în ordinea specificată. În exemplul de mai sus, elementele trebuie name, herstellerși prozessorexact odată ce apar, mhzelementul poate apărea zero sau unul, kommentarelementele pot apărea la fel de des sau deloc.
  • xs:choice: Un element poate fi selectat dintr-o listă de alternative. Următorul exemplu definește un nou tip computercare are fie un desktopelement (de tip pc-Typ), fie un laptopelement ca element copil :
<xs:complexType name="computer">
  <xs:choice>
    <xs:element name="desktop" type="pc-Typ"/>
    <xs:element name="laptop" type="laptop-Typ"/>
  </xs:choice>
</xs:complexType>
  • xs:all: xs:allEticheta poate fi utilizată pentru a defini un grup de elemente copil, fiecare dintre acestea putând apărea o singură dată ( miniar maxOccurselementele copil pot avea doar valorile 0 sau 1). Ordinea elementelor este arbitrară.

Orice conținut

Elementele XML cu orice conținut pot fi anyTypedefinite folosind tipul de bază . Următorul cod specifică un kommentarelement al oricărui conținut, i. H. pot apărea elemente XML complexe, precum și text.

<xs:element name="kommentar" type="xs:anyType"/>

Dacă textul și etichetele trebuie să apară în orice ordine în conținut, valoarea atributului „mixt” trebuie setată la „adevărat”:

<xs:element name="tagname">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="child" type="xs:integer"/>
      <!-- Weitere Elemente … -->
    </xs:sequence>
  </xs:complexType>
</xs:element>

Elemente goale

Din elemente XML goale este atunci când elementul respectiv este format dintr-o singură etichetă XML și nu există alte elemente XML care să cuprindă sau text (de exemplu, întreruperea liniei XHTML <br />). Schema XML folosește un mic truc în acest moment: un xs:complexTypetip nou este definit fără a specifica un element copil. Deoarece xs:complexTypenumai elementele copil XML complex sunt permise ca conținut în mod implicit, respectivul element rămâne gol în acest caz.

Derivarea de noi tipuri

Noi tipuri de date pot fi create prin definirea unui tip nou (vezi secțiunea anterioară) sau prin derivarea unui tip nou din cele existente.

Derivarea unui nou tip nu este o moștenire în sensul orientării obiectului , deoarece nu sunt moștenite proprietăți comparabile cu metodele sau atributele claselor orientate obiect . Mai degrabă, este vorba de reutilizarea definițiilor de tip existente. În consecință, nu există substituibilitate implicită atunci când se derivă noi tipuri, așa cum este obișnuit în alte sisteme de tip (cu toate acestea, sunt posibile conversii de tip explicit ).

Derivarea unui nou tip se poate face în două moduri: a crescut sau redus.

Extinderea unui tip

Extensia unui tip existent (engl. Extension ) la alte proprietăți, d. H. se adaugă elemente sau atribute noi. În exemplul următor, tipul definit mai sus este extins pc-Typcu un element ram:

<xs:complexType name="myPC-Typ">
  <xs:complexContent>
    <xs:extension base="pc-Typ">
      <xs:sequence>
        <xs:element name="ram" type="xs:integer"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

Tipul XML nou definit myPC-Typconstă din toate elementele copil ale tipului pc-Typși ale elementului ram. Acesta din urmă este xs:sequenceatașat elementelor secundare anterioare , ca într-o definiție.
Deoarece nu există substituibilitate, un element de tip pc-Typnu poate fi utilizat pur și simplu într-un punct în care se așteaptă un element de tip myPC-Typ.

Restricția unui tip

Prin restricționarea tipurilor existente (engleză. Restricție ) pot fi derivate și noi definiții. În acest scop, toate definițiile elementelor de tipul de bază trebuie repetate, modificate de restricțiile mai restrictive. Următorul exemplu derivă un nou tip myPC2-Typde pc-Typ. În acest caz, kommentarpoate apărea maximum un element (spre deosebire de orice număr pentru tip pc-Typ)

<xs:complexType name="myPC2-Typ">
  <xs:complexContent>
    <xs:restriction base="pc-Typ">
      <xs:sequence>
       <xs:element name="name"       type="xs:string"/>
       <xs:element name="hersteller" type="xs:string"/>
       <xs:element name="prozessor"  type="xs:string"/>
       <xs:element name="mhz"        type="xs:integer" minOccurs="0"/>
       <xs:element name="kommentar"  type="xs:string" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
    </xs:restriction>
  </xs:complexContent>
</xs:complexType>

În plus față de restricționarea tipurilor complexe, este de asemenea posibil să se definească tipuri noi ca restricționare a tipurilor simple. Un exemplu de astfel de definiție poate fi găsit deja în secțiunea privind tipurile simple. Un tip nou monatInteste definit ca o restricție a tipului întreg la intervalul de valori 1-12. Practic, următoarele primitive sunt disponibile pentru a descrie restricțiile privind tipurile simple:

  • length, maxLength, minLength- Limitează lungimea unui șir de caractere sau o listă.
  • enumeration - Restricție prin specificarea valorilor alternative
  • pattern- Restricție prin specificarea unei expresii regulate
  • minExclusive, minInclusive, maxExclusive, maxInclusive- limitarea domeniului de valori.
  • totalDigits, fractionDigits- Restricționarea zecimalelor (numărul total și locurile după punctul zecimal)
  • whiteSpace - Manipularea spațiilor și a filelor

Următoarele exemple ilustrează utilizarea acestor componente:

  • Temperatura corpului, 3 zecimale, 1 zecimală, valoarea minimă și maximă
<xs:simpleType name="celsiusKörperTemp">
  <xs:restriction base="xs:decimal">
    <xs:totalDigits value="3"/>
    <xs:fractionDigits value="1"/>
    <xs:minInclusive value="35.0"/>
    <xs:maxInclusive value="42.5"/>
  </xs:restriction>
</xs:simpleType>
  • Coduri poștale germane, opțional „ D ” urmat de cinci cifre
<xs:simpleType name="plz">
   <xs:restriction base="xs:string">
     <xs:pattern value="(D )?[0-9]{5}"/>
   </xs:restriction>
</xs:simpleType>
  • Specificația mărimii
<xs:simpleType name="size">
  <xs:restriction base="xs:string">
    <xs:enumeration value="XS"/>
    <xs:enumeration value="S"/>
    <xs:enumeration value="M"/>
    <xs:enumeration value="L"/>
    <xs:enumeration value="XL"/>
  </xs:restriction>
</xs:simpleType>

Când se definește un tip, este posibil să se determine dacă și în ce mod pot fi derivate din acest tip alte elemente XML. De exemplu, puteți specifica că pc-Typalte tipuri pot fi derivate doar dintr-un tip prin setarea unor restricții suplimentare - și nu prin adăugarea de elemente secundare noi.

Definirea elementului

Așa cum s-a explicat în secțiunea anterioară, Schema XML vă permite să definiți noi tipuri de date XML și să le utilizați la definirea propriilor elemente XML. Următorul exemplu ilustrează utilizarea tipului deja definit pc-Typîntr-o listă de elemente pentru PC:

<xs:element name="pc-liste">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="pc" type="pc-Typ" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Un element XML corespunzător ar putea arăta astfel:

<pc-liste>
  <pc>
    <name>Dimension 3100 </name>
    <hersteller>Dell</hersteller>
    <prozessor>AMD</prozessor>
    <mhz>3060</mhz>
    <kommentar>Arbeitsplatzrechner</kommentar>
  </pc>
  <pc>
    <name>T 42</name>
    <hersteller>IBM</hersteller>
    <prozessor>Intel</prozessor>
    <mhz>1600</mhz>
    <kommentar>Laptop</kommentar>
  </pc>
</pc-liste>

În acest exemplu, specificația tipului de listă anonimă se face direct în definiția elementului, în timp ce specificația tipului de computer se face extern.

Atunci când se proiectează o schemă XML complexă, reutilizarea și extensibilitatea tipurilor individuale de element XML, precum și lizibilitatea schemei în sine ar trebui luate în considerare. Utilizarea tipurilor de element XML anonime ca parte a elementelor mai mari face, în general, mai ușor de citit schemele XML mai mici. Definirea și denumirea tipurilor individuale de elemente XML, mai mici și reutilizabile, pe de altă parte, permite o mai mare modularizare a structurii schemei XML. Datorită numărului mare de scenarii posibile de aplicație, nu au apărut încă principii de proiectare valabile în general pentru schemele XML (comparabile cu formularele normale pentru bazele de date relaționale).

Concepte și proprietăți avansate

Cheie unică

Similar cu cheile primare din bazele de date relaționale , cheile unice pot fi definite folosind schema XML . Schema XML este diferită (engleză între unicitatea unică ) și proprietatea cheie.

Următorul exemplu definește un nou element pc-list cu o listă de pcelemente copil:

<xs:element name="pc-list">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="pc" type="pc-Typ" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:unique name="hersteller-name">
    <xs:selector xpath="pc"/>
    <xs:field xpath="name"/>
    <xs:field xpath="hersteller"/>
  </xs:unique>
  <xs:key name="idKey">
    <xs:selector xpath="pc"/>
    <xs:field xpath="@id"/>
  </xs:key>
</xs:element>

Cele două elemente uniqueși keyselectați un set de elemente cu o expresie de cale XPath (în exemplu :) . Unicitatea respectivă sau condiția cheie respectivă trebuie îndeplinite pentru acest set. În exemplul de mai sus, se specifică că combinația elementelor și trebuie să fie unică pentru fiecare element din această listă. Cele mai precizează element care atributul trebuie să fie unic în cadrul acestei liste și că aceasta poate fi referite din exterior. pcpcnameherstellerpc
keyid

Următorul exemplu arată referințarea acestei chei cu atributul referși cuvântul cheie @references.

<xs:keyref name="idFremdKey" refer="idKey">
  <!-- idKey von obigem Beispiel -->
  <xs:selector xpath="computerFremd"/>
  <xs:field xpath="@references"/>
</xs:keyref>
Înștiințare

Cu refervă referiți la nameatributul unei condiții - cheie, nu la câmpul cheie. Prin referencesurmare, valorile din trebuie să fie întotdeauna găsite sub tastele pentru computern. (Fundalul acestei construcții este asigurarea integrității referențiale , așa cum o știm din sistemele de baze de date relaționale.)

Importați, includeți și redefiniți

Schema XML permite reutilizarea schemelor străine.
Atât eticheta include- cât și - importsunt disponibile în acest scop, precum și opțiunea unei noi definiții sau adaptări a schemelor externe la integrare.

include

Definițiile de tip dintr-un spațiu de nume care sunt distribuite pe mai multe fișiere pot fi includecombinate cu.

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:pcTeile="http://www.example.com/pcTeile"
        targetNamespace="http://www.example.com/pcTeile"><include schemaLocation="http://www.example.com/schemata/harddisk.xsd"/>
  <include schemaLocation="http://www.example.com/schemata/ram.xsd"/></schema>
  • Pot fi incluse mai multe scheme.
  • targetNamespacedes harddisk.xsdtrebuie să se potrivească cu cea a schemei de includere.
redefine

Același exemplu ca acum. Presupunerea că există una complexType Herstellerîn schemă harddisk.xsd.

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:pcTeile="http://www.example.com/pcTeile"
        targetNamespace="http://www.example.com/pcTeile"><redefine schemaLocation="http://www.example.com/schemata/harddisk.xsd">
    <!-- redefinition of Hersteller -->
    <complexType name="Hersteller">
      <complexContent>
        <!-- redefinition of Hersteller mit ''restriction'' oder auch ''extension'' etc. -->
        <restriction base="pcTeile:Hersteller">
          <sequence>
            <element name="hersteller" type="string" minOccurs="10" maxOccurs="10"/>
          </sequence>
        </restriction>
      </complexContent>
    </complexType>
  </redefine><include schemaLocation="http://www.example.com/schemata/ram.xsd"/></schema>
  • redefinepoate fi folosit în locul include.
  • Numele tipului nu se schimbă.
import

importEticheta permite elementelor să fie importate din alte namespace, având în vedere un prefix, și , astfel , componentele de schemă din diferite spații de nume pentru a fi reutilizate.
Presupunerea este că există un tip definit superTypîn pcTeile.

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:pcTeile="http://www.example.com/pcTeile"
        targetNamespace="http://www.example.com/firma"><import namespace="http://www.example.com/pcTeile"/><<xs:attribute name="xyz" type="pcTeile:superTyp"/>
    …/>
  …
</schema>

Utilizarea schemelor XML

Pentru a utiliza o schemă XML într-un fișier XML, atributul schemaLocationspațiului de nume al instanței schemei poate fi utilizat pentru a face cunoscută adresa schemei. Aceasta permite unei aplicații, cum ar fi un analizor XML, să încarce schema dacă nu este deja conștientă de aceasta. Alternativ, schema poate fi făcută cunoscută aplicației și în alte moduri, de ex. B. prin fișiere de configurare. Această din urmă opțiune, totuși, nu este standardizată și, prin urmare, diferă de la aplicație la aplicație.

Următorul exemplu exprimă faptul că spațiul de nume standard http://www.w3.org/1999/xhtmleste și apoi specifică faptul că schema XML pentru acest spațiu de nume poate www.w3.org/1999/xhtml.xsdfi găsită sub .

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/1999/xhtml
                          http://www.w3.org/1999/xhtml.xsd">

Definiția se aplică elementului XML pentru care sunt specificate atributele și tuturor elementelor copil.

Dacă elementelor care nu aparțin unui spațiu de nume li se atribuie o schemă XML, acest lucru se face folosind atributul, așa cum se arată în exemplul următor noNamespaceSchemaLocation.

<html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="http://www.w3.org/1999/xhtml.xsd">

exemplu

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:bsp="http://de.wikipedia.org/wiki/XML_Schema#Beispiel"
        targetNamespace="http://de.wikipedia.org/wiki/XML_Schema#Beispiel"
        elementFormDefault="qualified">
  <element name="doc">
    <complexType>
      <sequence>
        <element ref="bsp:head"/>
        <element name="body" type="string"/>
      </sequence>
    </complexType>
  </element>
  <element name="head">
    <complexType>
      <sequence>
        <element name="title" type="string"/>
      </sequence>
    </complexType>
  </element>
</schema>

În afară de spațiul de nume, aceasta corespunde următoarei DTD

<!ELEMENT doc (head, body)>
<!ELEMENT head (title)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT body (#PCDATA)>

O structură XML care corespunde schemei este următoarea:

<?xml version="1.0" encoding="UTF-8"?>
<doc xmlns="http://de.wikipedia.org/wiki/XML_Schema#Beispiel">
  <head>
    <title>
      Dies ist der Titel
    </title>
  </head>
  <body>
    Dies ist der Text.
  </body>
</doc>

Vezi si

literatură

  • Alfons Kemper, André Eickler: Sisteme de baze de date - o introducere . Oldenbourg Wissenschaftsverlag, München 2004, ISBN 3-486-27392-2 .
  • Helmut Vonhoegen: Noțiuni introductive despre XML . Standarde actuale: Schema XML, XSL, XLink . Ediția a 5-a. Galileo Press, 2009, ISBN 978-3-8362-1367-7 .
  • Margit Becher: XML - DTD, XML-Schema, XPath, XQuery, XSLT, XSL-FO, SAX, DOM . W3L Verlag, Witten 2009, ISBN 978-3-937137-69-8 .
  • Marco Skulschus, Marcus Wiederstein: Schema XML . Comelio Medien, Berlin 2009, ISBN 978-3-939701-22-4 .
  • Eric van der Vlist: Schema XML . O'Reilly, Köln 2003, ISBN 978-3-89721-345-6 ( online ).

Link-uri web

Dovezi individuale

  1. www.w3.org/1999/xhtml.xsd ( Memento din 10 noiembrie 2000 în Arhiva Internet )