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ă amonate
acestui 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 monat
pot 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-Typ
cu elemente copil corespunzătoare name
, hersteller
etc., 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 (atributeminOccurs
șimaxOccurs
). Dacă nu există nici unoccurs
atribut, valoarea implicită 1 este utilizată în ambele cazuri. Elementele dintr-unsequence
trebuie să apară în ordinea specificată. În exemplul de mai sus, elementele trebuiename
,hersteller
șiprozessor
exact odată ce apar,mhz
elementul poate apărea zero sau unul,kommentar
elementele 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 tipcomputer
care are fie undesktop
element (de tippc-Typ
), fie unlaptop
element 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:all
Eticheta poate fi utilizată pentru a defini un grup de elemente copil, fiecare dintre acestea putând apărea o singură dată (min
iarmaxOccurs
elementele copil pot avea doar valorile 0 sau 1). Ordinea elementelor este arbitrară.
Orice conținut
Elementele XML cu orice conținut pot fi anyType
definite folosind tipul de bază . Următorul cod specifică un kommentar
element 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:complexType
tip nou este definit fără a specifica un element copil. Deoarece xs:complexType
numai 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-Typ
cu 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-Typ
constă din toate elementele copil ale tipului pc-Typ
și ale elementului ram
. Acesta din urmă este xs:sequence
atașat elementelor secundare anterioare , ca într-o definiție.
Deoarece nu există substituibilitate, un element de tip pc-Typ
nu 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-Typ
de pc-Typ
. În acest caz, kommentar
poate 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 monatInt
este 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-Typ
alte 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 pc
elemente 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 key
selectaț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.
pc
pc
name
hersteller
pc
key
id
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 refer
vă referiți la name
atributul unei condiții - cheie, nu la câmpul cheie. Prin references
urmare, 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 - import
sunt 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 include
combinate 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.
-
targetNamespace
desharddisk.xsd
trebuie 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>
-
redefine
poate fi folosit în loculinclude
. - Numele tipului nu se schimbă.
import
import
Eticheta 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 schemaLocation
spaț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/xhtml
este și apoi specifică faptul că schema XML pentru acest spațiu de nume poate www.w3.org/1999/xhtml.xsd
fi 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
- Lista spațiilor de nume XML
- RELAX NG
- WSDL
- Schematron
- Descrierea structurii documentului (DSD)
- railML
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
- Specificația schemei XML W3C: grunduri, structuri, tipuri de date și diverse; Traduceri în germană: introducere, structuri, tipuri de date
- Introducere în schema și referința XML
Dovezi individuale
- ↑ www.w3.org/1999/xhtml.xsd ( Memento din 10 noiembrie 2000 în Arhiva Internet )