XML Schema Seite 1
XML Schema Weiterführende Konzepte: SimpleContent Complex Content Unique / key-keyref Dokumenterweiterung Dokument-Modularisierung Seite 2
XML Schema complextype Komplexe Typen sind in zwei Gruppen unterteilt: Solche mit simplecontent: Erlauben Attribute, aber keine Kindelemente nur CharacterInhalt Solche mit complexcontent: Erlauben Attribute und Kindelemente Diese Unterscheidung hat Auswirkung auf abgeleitetetypen: Aus komplexen Typen mit simplecontent können keine komplexe Typen mit complexcontent abgeleitet werden. Seite 3
XML Schema Beispiel: complextype - simplecontent <xs:complextype name="preis"> <xs:simplecontent> <xs:extension base="xs:decimal"> <xs:attribute name="currency" type="xs:string"/> </xs:extension> </xs:simplecontent> </xs:complextype> Seite 4
XML Schema Beispiel:complexType - complexcontent <xs:complextype name="adresse"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="strasse" type="xs:string"/> <xs:element name="stadt" type="xs:string"/> </xs:sequence> </xs:complextype> Explizite Syntax ohne Nutzung von Defaults <xs:complextype name="adresse"> <xs:complexcontent> <xs:restriction base="xs:anytype"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="strasse" type="xs:string"/> <xs:element name="stadt" type="xs:string"/> </xs:sequence> </xs:restriction> </xs:complexcontent> </xs:complextype> Seite 5
XML Schema: Substitution Group Die SubstitutionGroup erlaubt in XML Schema, ein Element zu deklarieren, das ein anderes Element des aktuellen Schema ersetzen kann. Das ersetzbare Element heißt Headelement und muss Als Toplevel Element deklariert sein Die Elemente der SubstitutonGroup müssen vom selben Typ wie das Headelement sein oder von einem abgeleiteten Typ. Anwendung: Mehrsprachigkeit von Element- und Attributbezeichnern. Seite 6
XML Schema: Substitution Group <xs:element name="name" type="xs:string"/> HeadElement <xs:element name="navn" substitutiongroup="name"/> SubstitutionGroup <xs:complextype name="custinfo"> <xs:sequence> <xs:element ref="name"/> </xs:sequence> </xs:complextype> <xs:element name="customer" type="custinfo"/> HeadElement <xs:element name="kunde" substitutiongroup="customer"/> SubstitutionGroup <customer> <name>john Smith</name> </customer> <kunde> <navn>john Smith</navn> </kunde> Seite 7
XML Schema unique Zeigt an, dass ein Element/Attribut in einem bestimmten Bereich eindeutig sein muss: <xs:complextype name="employeetype" mixed="true"> <xs:sequence> <xs:element name="id" type="xs:int" minoccurs="2 maxoccurs="5"> <xs:unique name="u1"> <xs:selector xpath="employee"/> SCOPE <xs:field xpath="id"/> </xs:unique> </xs:element> <xs:element name="name" type="xs:string"/> <xs:element name="hiredate" type="xs:date"/> </xs:sequence> </xs:complextype> Seite 8
XML Schema unique kombinierter Wert Zeigt an, dass eine Element/Attribut Kombination in einem bestimmten Bereich eindeutig sein muss: <xsd:element name="items" type="items"> <xsd:unique name="partnumandname"> <xsd:selector xpath="items"/> <xsd:field xpath="@partnum"/> <xsd:field xpath="productname"/> </xsd:unique> </xsd:element> SCOPE Seite 9
XML Schema key, keyref Mit dem Paar key, keyref kann sichergestellt werden, dass korrespondierende Werte existieren (Referentielle Integrität). <xs:complextype name="employeetype" mixed="true"> <xs:sequence> <xs:element name="name" type="myname"> <xs:keyref name="k1" refer="idatt"> <xs:selector xpath="employee/name"/> <xs:field xpath="@nnummer"/> </xs:keyref> </xs:element> <xs:element name="hiredate" type="xs:date"/> <xs:element name="id" type="xs:int"> <xs:key name="idatt"> <xs:selector xpath="employee"/> <xs:field xpath="id"/> </xs:key> </xs:element> </xs:sequence> </xs:complextype> Seite 10
XML Dokument Extension Das <any> Element The <any> Element erlaubt XML Dokumente mit Elementen zu erweitern, die nicht Bestandteil des Schemas sind. Das Schema "family.xsd definiere eine Person wie folgt: <xs:element name="person"> <xs:complextype> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:any minoccurs="0"/> </xs:sequence> </xs:complextype> </xs:element> Seite 11
XML Dokument Extension Wir haben ein Schema "children.xsd": <?xml version="1.0" encoding="iso-8859-1"?> <xs:schema xmlns:xs= http://www.w3.org/2001/xmlschema" targetnamespace="http://www.h_da.com" xmlns="http://www.h_da.com" elementformdefault="qualified"> <xs:element name="children"> <xs:complextype> <xs:sequence> <xs:element name="childname" type="xs:string maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> </xs:element> </xs:schema> Seite 12
XML Dokument Extension Wir können nun das Element "person" mit einem "children" Element erweitern. <?xml version="1.0" encoding="iso-8859-1"?> <persons xmlns="http://www.fhg.de" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.fhg.de/family.xsd http://www.h_da.com/children.xsd"> <person> <firstname>hege</firstname> <lastname>refsnes</lastname> <children> <childname>cecilie</childname> </children> </person> <person> <firstname>stale</firstname> <lastname>refsnes</lastname> </person> </persons> Seite 13
XML Dokument Extension Das <anyattribute> Element Das <anyattribute> Element erlaubt XML Dokumente mit Attributen zu erweitern, die nicht Bestandteil des Schemas sind. Beispiel: <xs:attributegroup name="ag1" id="i11"> <xs:anyattribute namespace="##any" processcontents="strict"/> </xs:attributegroup> Seite 14
XML Dokument Extension Wert des NamespaceAttributes Erlaubter Inhalt ##any Any well-formed XML from any namespace (default) ##local Any well-formed XML that is not qualified, i.e. not declared to be in a namespace ##other Any well-formed XML that is from a namespace other than the target namespace of the type being defined (unqualified elements are not allowed) "http://www.w3.org/1999/xhtml ##targetnamespace" Any well-formed XML belonging to any namespace in the (whitespace separated) list; ##targetnamespace is shorthand for the target namespace of the type being defined Seite 15
XML Dokument Extension Wert des processcontents Attributes lax skip strict Bedeutung instructs an XML processor to validate the content on a can-do basis: It will validate attributes for which it can obtain schema information, but it will not signal errors for those it cannot obtain any schema. XML processor skips validating the schema associated with the required namespace XML processor is obliged to obtain the schema associated with the required namespace, and validate it. Seite 16
Beispiel: Attribute Erweiterung <xs:complextype name="tt1"> <xs:simplecontent> <xs:extension base="xs:string"> <xs:attribute name="a1" use="required"/> <xs:attribute name="a2" use="optional"/> <xs:anyattribute namespace="##any processcontents="lax"/> </xs:extension> </xs:simplecontent> </xs:complextype> Seite 17
XML Schema Wiederbenutzbare Schemata Komplexere Schemata werden aus existierenden Schemata zusammengesetzt oder beim Entwurf in mehrere Schemata untergliedert, um eine einfachere Pflege und eine Wiederbenutzung von Schemata zu ermöglichen. Es gibt zwei Mechanismen: Include: Definitionen und Deklarationen werden in den Namensraum eingebracht, d.h. der Targetnamespace der inkludierten Komponenten muss identisch mit dem Targetnamespace des Ziels sein. Import: Definitionen und Deklarationen unterschiedlicher Namensräume können gemeinsam genutzt werden. Die unterschiedlichen Namensräume müssen Prefixes zugeordnet werden (siehe Beispiel) Redefine: erlaubt, inkludierte Komponenten neu zu definieren (siehe Beispiel) Seite 18
XML Schema Wiederbenutzbare Schemata- redefine Definition einer Adresse in einer Schemadefinition (Datei 1) <complextype name="address"> <!-- Adressdefinition in Schema 1 --> <sequence> <element name="name" type="string"/> <element name="strasse" type="string"/> <element name="stadt" type="string"/> </sequence> </complextype> Seite 19
XML Schema Wiederbenutzbare Schemata- redefine Redefinition der Adresse (Erweiterung um ein Element) <!-- Adressdefinition in Schema 2 --> <redefine schemalocation="http://www.iese.fhg.de/schemas/address.xsd"> <!-- redefinition of Address --> <complextype name="address"> <complexcontent> <extension base="address"> <sequence> <element name="land" type="string"/> </sequence> </extension> </complexcontent> </complextype> </redefine> Seite 20
XML Schema Namespaces Namespaces definieren ein "Vokabular" für eine bestimmte Anwendung (Elemente und Attribute). Das Attribut xmlns:xx ordnet dem Vokabular einen Prefix zu. XML/Schema erlaubt in einer Deklaration unterschiedliche Vokabulare (Namespaces) zu benutzen. Die Verbindung zu dem Namespace, gegen den ein Dokument validiert werden soll, wird mit dem Attribut targetnamespace spezifiziert. <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema" elementformdefault="qualified" attributeformdefault="unqualified" version="1.0" targetnamespace="documents\ns2"> Die Attribute elementformdefault und attributeformdefault legen fest, wie die Qualifizierung der lokalen Namen in den Dokumentexemplaren gehandhabt wird. qualified bedeutet Qualifizierung mit Prefix erforderlich, unqualified bedeutet, Qualifizierung nicht erforderlich (default) Seite 21
XML Schema Namespaces Spezielle XML/Schema Namespaces: xmlns:xs=http://www.w3.org/2001/xmlschema Vokabular Schema-Deklaration Namespace für Attribute in Dokumentinstanzen xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" definierte Attribute: - xsi:type spezifiziert den verwendeten Type (einfach/komplex) bei der Validierung - xsi:nil erlaubt, dass ein Element als gültig validiert wird, auch wenn es keinen Inhalt hat und obwohl ein Inhaltsmodell definiert ist. - xsi:schemalocation, xsi:nonamespaceschemalocation Adresse des beim Validieren verwendeten Schemata Seite 22