Tuesday, May 29, 2007

XML Schema

Defizite von DTDs:
  • Präzise Unterscheidung von Datentypen
  • Festlegung von erlaubten Wertebreichen
  • Kontrolle über bestimmte Zeichenmuster
  • Vorgabe von Standardwerten
  • DTDs sind nicht selbst in XML formulierbar ==> zusätzlicher Editor notwendig
  • Nicht über Programmierschnittstellen zugreifbar ( wie z.B. DOM)

Ein Schema beschreibt und definiert also eine Klasse von XML-Dokumenten, indem es die Bedeutung, die mögliche Verwendung und die Beziehung der Teile festlegt, aus denen das Dokument besteht:

  • Datentypen
  • Elemente und ihr Inhalt
  • Attribute und ihre möglichen Werte
  • Entitäten und ihr Inhalt
  • Notation

Wichtig: Ein Schema ist selbst ein XML-Dokument und kann dadruch auf Wohlgeformtheit und Gültigkeit überprüft werden.

Komplexe Datentypen

  • Können einfache oder auch komplexe Datentypen enthalten
  • Komplexe Datentypen können auch ohne Namenszuordnung definiert werden. (= anonyme Datentypen)

Das Inhaltsmodell eines komplexen Datentyps setzt sich aus Teilen zusammen, die auch Partikel genannt werden.

Sequenzen

  • Legt Reihenfolge der Elemente verbindlich fest
  • Angeführte Elemente müssen vorkommen
  • Abfolge der angeführten Elemente muss genau eingehalten werden

Einfache Datentypen

Elemente die nur einen Wert enthalten, wie z.B. eine Zahl, ein Datum oder Text. Der Wert von Attributen gehört immer zu den simpleTypes ==> Keine Kindelemente oder Unterelemente!

Anonyme Datentypen

Diese sind immer dann problemlos, wenn der jeweilige Datentyp nur einmal verwendet wird und auch eine Übernahme in ein anderes Schema nicht vorgesehen ist. Restrictions sind ebenfalls nicht möglich.

Attribute

Dieses Element kann innerhalb von komplexen Datentypen verwendet werden, wobei es immer hinter den Elementendeklarationen erscheinen muss. Attribute können nicht geschachtelt werden oder andere Elemente enthalten. Die Reihenfolge der Attributdeklaration zu einem Datentyp ist beliebig. Die Namen der Attribute innerhalb eines koplexen Datentyps müssen aber eindeutig sein.

Namensräume

XML-Schema unterstützt die Verwendung von Namensräumen und ermöglicht dadurch die Überprüfung der Gültigkeit von XML-Dokumenten, die verschiedene Vokabulare mischen. Namenskonflikte können somit vermieden werden.

Der Default-Namespace kann durch weglassen des Präfixes bei der Deklaration des Namensraumes definiert werden. Dies hat aber den Nachteil, dass vorgegebene Datentypen und benutzerdefinierte Datentypen nicht mehr sofort unterschieden werden können.

Die Zuordnung der Namen zu den Komponenten eines bestimmten Schemas kann in jedem Fall einen eigenen Namensraum konstituieren, die Empfehlung nennt ihn target namespace. Dieser Namensraum wird dadurch gebildet, dass er über eine entsprechende Deklaration identifiziert wird.

Valide Schema Definitionen

1. Default Namespace mit Präfix

From Misc

Zugehörige valide XML-Instanz:

From Misc

Error durch weglassen des Präfixes im Schema-Dokument:

From Misc

2. Definition eines Target-Namespaces:

From Misc

Zugehörige valide XML-Instanz:

From Misc


Error da das elementFormDefault Attribut im XML-Schemadokument default-mässig auf unqualified eingestellt ist und in der XML-Instanz als Default-Namespace der selebe Namespace wie der targetNamespace im Schema-File deklariert ist.

Dadurch erwartet der XML-Parser als erstes Element innerhalb des Wurzel-Eelements ein unqualifiziertes Element. Das Problem kann dadurch behoben werden indem dem Wurzel-Element und dem Default-Namespace ein Präfix zugeordnet wird. In der validen Abbildung geschieht dies durch das default-Präfix.


Weiters kann der Fehler behoben werden indem das elementFormDefault-Attribut im Schema-File auf qualified gesetzt wird, da jetzt der Namensraum als Vorgabe verwendet wird. Diese Einstellung kann man in der letzten Abbildung sehen.

From Misc

Hier ist das elementFormDefault-Attribut im Schema auf qualified gesetzt und daher können die Präfixe komplette in der zugehörigen XML-Instaz weggelassen werden.

From Misc

Hacks

Um z.B. xsd:decimal um ein Attribug "waehrung" zu erweitern, um diesen einfachen Datentyp mit dem Eurozeichen zu verknüpfen dient folgender Code:

From Misc


No comments: