Für diverse Programmiersprachen existieren mittlerweile gängige Schnittstellen, um auf XML-Dokumente zuzugreifen und diese weiterzuverarbeiten. Die Simple API for XML (SAX) ist eine sehr einfach (=leichtgewichtig) gehaltene API für die ereignisbasierte Verarbeitung von XML-Dokumenten. Die Charakterisierung als leichtgewichtiger Ansatz bezieht sich sowohl auf den Implementierungsaufwand der API selbst, als auch ihren Integrationsaufwand in eigene Applikationen.
Für die Verarbeitung von XML-Dokmenten sind im Wesentlichen zwei Ansätze verfügbar.
Ein Parser (engl. to parse „analysieren“ bzw. von lateinisch pars „Teil“; im Deutschen gelegentlich auch Zerteiler) ist ein Computerprogramm, das in der Computertechnik für die Zerlegung und Umwandlung einer beliebigen Eingabe in ein für die Weiterverarbeitung brauchbares Format zuständig ist. Häufig werden Parser eingesetzt, um im Anschluss an den Analysevorgang die Semantik der Eingabe zu erschließen und daraufhin Aktionen durchzuführen.
Quelle: Wikipedia
SAX-Implementierungen weisen üblicherweise drei erkennbare Blöcke auf.
startDocument
,
startElement
,
processingInstruction
...) Hinweis: In älterer Literatur findet sich
häufig statt des ContentHandlers eine mit
DocumentHandler benannte Schnittstelle. Dabei
handelt es sich um die Schnittstelle der
Vorgängerversion (SAX1). Sie bietet unter anderem
keine Namensraumintegration und wurde durch den
ContentHandler
ersetzt.
java.net
eine mit
ContentHandler
benannte Klasse an. Diese kann durch
Importanweisungen mit der gleichnamigen
SAX-Schnittstelle aus dem Paket
org.xml.sax
kollidieren!
1.0
oder
1.1
im XML-Prolog oder ein
nichtdeterministisches Inhaltsmodell (siehe
nächste Seite).
((b, c) | (b, d))
. Ein Prozessor kann, wenn er das Element
b
in einem Dokument liest, nicht wissen, ob als
nächstes Element
c
oder
d
erscheint. Welche der beiden Möglichkeiten trifft
zu? Der Prozessor müßte zur Beantwortung dieser
Frage im Dokument bereits
vorauslesen. Eine Umformulierung der Grammatik hilft in diesen Fällen. Wäre das Inhaltsmodell als
(b, (c | d))
definiert, so treten diese Probleme nicht auf, denn
der Prozessor muß nicht zwischen zwei Regeln
auswählen, er muß hier nicht
vorauslesen, sowohl
c
als auch
d
würden akzeptiert.
EinfacheAufgaben, bei denen es nicht nötig ist, das gesamte Dokument mit seiner Struktur im Speicher zu behalten.
Blickfeldsehr eingeschränkt ist.
java -version
. Prüfen Sie das Vorhandensein des Java Compilers (
javac
).
javac SAXExample1.java
$ java SAXExample1 erstes-XML-dokument.xml document started document ended
Was ist während der Ausführung des Beispiels passiert?
Eine Analyse.
erstes-XML-dokument.xml
) ein.
java SAXExample1 erstes-XML-dokument.xml
startDocument
auf.
SAXExample2.java
) implementiert. Sie gibt die eine Zeile mit dem
Text
document started
aus.
public void startDocument() {
System.out.println("document started");
} //startDocument()endDocument
. Auch diese wurde in der Applikation implementiert,
sie gibt eine Zeile mit dem Text
document ended
aus.
public void endDocument() {
System.out.println("document ended");
} //endDocument()
DefaultHandler
(definiert im Paket
org.xml.sax.helpers
).
startDocument
und
endDocument
festgelegt (
In JAXP API Dokumentation nachlesen
).
nichts tun, von dieser Klasse. In der Beispielklasse werden die Methoden dann überschrieben und die oben erwähnten Textausgaben produziert.
public class SAXExample1 extends DefaultHandler {XMLReaderFactory.createXMLReader()
E stehen verschiedene konfigurierbare SAX-Parser
Implementierungen zur Verfügung. Unter Nutzung der
aktuellen Systemkonfiguration wird mittels
createXMLReader
ein neuer Parser erzeugt. Im Beispiel wird die
Vorgabekonfiguration verwendet.
XMLReader xr = XMLReaderFactory.createXMLReader();
setContentHandler
und
setErrorHandler
der XMLReader Schnittstelle. Werden diese Handler
nicht gesetzt, so werden sämtliche Ereignisse, die
der Parser meldet, schlichtweg von der Anwendung
ignoriert. Es passiert
nichts.
SAXExample1 handler = new SAXExample1();
xr.setContentHandler(handler);
xr.setErrorHandler(handler);parse
des
XMLReader
-Objekts führt auf dem über Kommandozeilenparameter
(
args[0]
) übergebenen Dokument den Lesevorgang durch.
InputSource
gekapselt werden, damit sie eingelesen werden kann.
FileReader r = new FileReader(args[0]);
xr.parse(new InputSource(r));startElement
und
endElement
in der Applikation implementiert.
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
System.out.println("Element " + localName + " started.");
} //startElement()
public void endElement(String namespaceURI, String localName, String qName){
System.out.println("Element " + localName + " ended.");
} //endElement() startElement
erfordert das Einbinden der Schnittstelle
Attributes
aus dem Paket
org.xml.sax
.
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.Attributes;
import java.io.FileReader;
import org.xml.sax.InputSource;
public class SAXExample2 extends DefaultHandler {
public void startDocument() {
System.out.println("document started");
} //startDocument()
public void endDocument() {
System.out.println("document ended");
} //endDocument()
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
System.out.println("Element " + localName + " started.");
} //startElement()
public void endElement(String namespaceURI, String localName, String qName){
System.out.println("Element " + localName + " ended.");
} //endElement()
public static void main(String args[]) throws Exception {
XMLReader xr = XMLReaderFactory.createXMLReader();
SAXExample2 handler = new SAXExample2();
xr.setContentHandler(handler);
xr.setErrorHandler(handler);
FileReader r = new FileReader(args[0]);
xr.parse(new InputSource(r));
} //main()
public SAXExample2 ()
{
super();
}
}//class SAXExample2
Die grundlegende Schnittstelle der SAX2-API wird mit
ContentHandler bezeichnet, sie versammelt Operationen
zur Abbildung des logischen Inhaltes eines
XML-Dokumentes. Die in unseren Beispielen verwendete
Basisklasse
DefaultHandler
implementiert u.a. diese Schnittstelle und stellt sie so
der Beispielapplikation zur Verfügung.
Die Übersicht in untenstehender Tabelle stellt die
wichtigsten Operationen der Schnittstelle mit ihrer
Signatur und Funktionalität zusammen.
| Operation | Funktionalität |
|---|---|
startDocument()
|
Aufruf zu Beginn eines Dokuments. Naturgemäß wird diese Methode nur einmal ausgeführt. |
endDocument()
|
Aufruf am Ende des Einlesevorgangs eines Dokuments. Auch diese Methode wird vom SAX Parser nur einmal aufgerufen. |
startElement(String namespaceURI,
String localName, String qName,
Attributes atts)
|
Die Operation wird am Anfang (öffnender Tag)
eines jeden Elements in einem XML-Dokument
aufgerufen (auch bei leeren Elementen!). Sie
gibt unter den Namen des Elementes als Namen
ohne Namensraumpräfix (
localName
) sowie auch den qualifizierten Namen des
Elements (
qName
) zurück.
Anmerkung: Namensrauminformationen werden nur erzeugt, wenn der Parser entsprechend konfiguriert wurde.
Das bedeutet z.B., der qualifizierte
Name wird nur dann zurückgegeben, wenn
der Parser konfiguriert wurde,
Namensraum-Präfixe zu verwenden.
Objekte des Type Attributes enthalten die Attribute eines Elements in der Reihenfolge ihrer Definition. Zu jedem Attribut sind neben dem lokalen und dem qualifizierten Namen die Namensraum URI sowie Typ und Attributwert gemäß XML v1.0 abrufbar. |
endElement(String namespaceURI,
String localName, String qName)
|
Die Operation wird aufgerufen, wenn das Ende
eines jeden Elements in einem XML-Dokument
erreicht ist (auch bei leeren Elementen!)
Die Übergabeparameter entsprechen denen des zugehörigen startElement-Aufrufs. |
processingInstruction(String target,
String data)
|
Liefert die deklarierten
Verarbeitungsanweisungen. Diese können vor
und nach Eintritt des
startDocument
-Ereignisses auftreten. Der XML-Prolog wird
hierbei nicht als Processing Instruction
behandelt, entsprechend wird daher auch kein
Ereignis dieses Typs ausgelöst.
|
startPrefixMapping(String prefix,
String uri)
|
Signalisiert den Beginn des
Gültigkeitsbereits des Namensraumkürzels
prefix
.
uri
enthält die vollständige URI des gebundenen
Namensraums. Ist
prefix
leer, so handelt es sich um die Redefinition
des Vorgabenamensraums. Das Ereignis wird
vor dem ersten Element des Namensraums (d.h.
dem Element, das die Präfixbindung enthält
oder den Vorgabenamensraum überschreibt)
ausgelöst.
|
endPrefixMapping(String prefix)
|
Signalisiert das Ende des
Gültigkeitsbereichs des Namensraumkürzels
prefix
. Ist der Übergabeparameter leer, so bezieht
sich das Ereignis auf den Vorgabenamensraum.
Das Ereignis tritt nach dem
endElement
-Ereignis des letzten Elements im Namensraum
ein.
|
characters(char[] ch, int start, int
length)
|
Aufruf bei der Verarbeitung von
Zeichenkettendaten innerhalb eines Elements.
ch
enthält ab der Position
start
Zeichenketten-artige Daten der Länge
length
.
Hinweis: Manche Parser melden Leerzeichen innerhalb von Elementen mit Hilfe der Operation ignorableWhitespace
. Validierenden Parsern ist dies sogar
vorgeschrieben.
|
ignorableWhitespace(char[] ch, int
start, int length)
|
Diese Operation wird aufgerufen, wenn der
Parser ignorierbare Leerzeichen im Inhalt
von Elementen liest.
Validierende Parser müssen hierbei diese Operation verwenden, nicht validierende Parser können sie verwenden. |
SAXExample3
einige Variablen deklariert und mit
0
vorinitialisiert.
public class SAXExample3 extends DefaultHandler {
private int startDocument = 0,
endDocument = 0,
characters = 0,
startElement = 0,
endElement = 0,
attributes = 0;startElement++;
in
startElement()
.
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
startElement++;
attributes += atts.getLength();
} //startElement()endDocument
, werden die aufsummierten Zahlen durch die Methode
printStatistics
auf der Standardausgabe dargestellt.
public void endDocument() {
endDocument++;
printStatistics();
} //endDocument()java SAXExample3 erstes-XML-dokument.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Vorlesung> <Pflichtfach/> <Hochschule>Fachhochschule Augsburg</Hochschule> <Studiengang semester="3">IAM</Studiengang> <Titel>XML</Titel> <Semester>WS 2008/2009</Semester> Montag, 08:00h - 09:30h <Praktikum>Seminar</Praktikum> </Vorlesung>
Analyzing ... # startDocument events:1 # endDocument events:1 # startElement events:7 # endElement events:7 # character events:12 # attributes:1
character events
.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Vorlesung> <Pflichtfach/> <Hochschule></Hochschule> <Studiengang semester="3"></Studiengang> <Titel></Titel> <Semester></Semester> <Praktikum></Praktikum> </Vorlesung>
characters
die Anzahl
7
. Der Parser meldet alle Zeilenumbrüche in
Elementinhalt als Ereignis.
Analyzing ... # startDocument events:1 # endDocument events:1 # startElement events:7 # endElement events:7 # character events:7 # attributes:1
java.util.HashMap
eingebunden.
import java.util.HashMap;
HashMap
eine Liste mit Tupeln aus Elementnamen und
Auftretensanzahlen verwaltet. Eintragungen und
Aktualisierungen dieser Liste erfolgen bei jedem
startElement
-Ereignis.
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
Integer freq = (Integer) elementHM.get(qName);
if (freq == null) {
elementHM.put(qName, ONE);
}
else {
elementHM.put(qName, new Integer (freq.intValue()+1 ));
}
} //startElement()HashMap
erfolgt in der Operation
endDocument()
.
public void endDocument() {
System.out.println(elementHM);
} //endDocument(){Hochschule=1, Semester=1, Titel=1, Vorlesung=1, Praktikum=1, Studiengang=1, Pflichtfach=1}
<?xml version="1.0" standalone="yes"?>
<document>
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="translate(100,100)">
<text id="TextElement" x="0" y="0" style="font-family:Verdana; font-size:35.27; visibility:hidden">
It's alive!
<set attributeName="visibility" attributeType="CSS" to="visible" begin="3s" dur="6s" fill="freeze"/>
</text>
</g>
</svg>
<math xmlns="http://www.w3.org/1998/Math/MathML">
<set>
<ci> b </ci>
<ci> a </ci>
<ci> c </ci>
</set>
</math>
</document>Exception in thread "main" org.xml.sax.SAXParseException: Content is not allowed in prolog. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) at SAXExample4.main(SAXExample4.java:35)
Content is not allowed in prolog.
deutet auf ein Problem bei der Verarbeitung des
XML-Prologes hin.
Byte Order Mark
. Dies sind Zeichen, die in Unicode-codierten
Dateien an den Anfang der Datei gestellt werden
können. Die Byte Order Mark gibt an, welche
Codierung bei der Datei vorliegt (z.B. UTF-16) und
in welcher Byte-Reihenfolge (Little-Endian,
Big-Endian) die Datei gespeichert ist.
| Codierungsschema | Signatur |
|---|---|
| UTF-8 | EF BB BF |
| UTF-16 Big-endian | FE FF |
| UTF-16 Little-endian | FF FE |
| UTF-32 Big-endian | 00 00 FE FF |
| UTF-32 Little-endian | FF FE 00 00 |
<?xml version="1.0" standalone="yes"?>
<document>
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="translate(100,100)">
<text id="TextElement" x="0" y="0" style="font-family:Verdana; font-size:35.27; visibility:hidden">
It's alive!
<set attributeName="visibility" attributeType="CSS" to="visible" begin="3s" dur="6s" fill="freeze"/>
</text>
</g>
</svg>
<math xmlns="http://www.w3.org/1998/Math/MathML">
<set>
<ci> b </ci>
<ci> a </ci>
<ci> c </ci>
</set>
</math>
</document>{math=1, g=1, text=1, document=1, svg=1, set=2, ci=3}
namespaces
und
namespace-prefixes
abzufragen.
try {
String id = "http://xml.org/sax/features/namespaces";
if (xr.getFeature(id)) {
System.out.println("Parser supports namespaces.");
} else {
System.out.println("Parser does not support namespaces.");
}
} catch (SAXNotRecognizedException e) {
System.out.println("Feature not recognized");
} catch (SAXNotSupportedException e) {
System.out.println("Can't set feature currently.");
}
try {
String id = "http://xml.org/sax/features/namespace-prefixes";
if (xr.getFeature(id)) {
System.out.println("Parser supports qualified names for elements and attributes.");
} else {
System.out.println("Parser does not support qualified names for elements and attributes.");
}
} catch (SAXNotRecognizedException e) {
System.out.println("Feature not recognized");
} catch (SAXNotSupportedException e) {
System.out.println("Can't set feature currently.");
}Parser supports namespaces. Parser does not support qualified names for elements and attributes.
setFeature
auf
true
zu setzen und somit die Unterstützung für
Namensraum-Präfixe zu erhalten.
try {
String id = "http://xml.org/sax/features/namespace-prefixes";
if (xr.getFeature(id)) {
System.out.println("Parser supports qualified names for elements and attributes.");
} else {
System.out.println("Parser does not support qualified names for elements and attributes.\nSetting...");
xr.setFeature(id, true);
if (xr.getFeature(id)){
System.out.println("Parser set to support qNames now.");
} else {
System.out.println("Failed to configure parser.");
}
}
} catch (SAXNotRecognizedException e) {
System.out.println("Feature not recognized");
} catch (SAXNotSupportedException e) {
System.out.println("Can't set feature currently.");
}Parser supports namespaces. Parser does not support qualified names for elements and attributes. Setting... Parser set to support qNames now.
private HashMap elementHM;
private final Integer ONE = new Integer(1);
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
String elementFullName = new String(namespaceURI + ":" + localName);
Integer freq = (Integer) elementHM.get(elementFullName);
if (freq == null) {
elementHM.put(elementFullName, ONE);
}
else {Parser does not support namespace-prefixes.
Setting...
Parser set to support namespace-prefixes now.
{http://www.w3.org/1998/Math/MathML:set=1,
http://www.w3.org/2000/svg:text=1,
:document=1,
http://www.w3.org/1998/Math/MathML:math=1,
http://www.w3.org/1998/Math/MathML:ci=3,
http://www.w3.org/2000/svg:svg=1,
http://www.w3.org/2000/svg:set=1,
http://www.w3.org/2000/svg:g=1}
document
, für das kein Namensraum definiert ist (es befindet
sich daher spezifikationsgemäß im NULL-Namensraum),
die leere Namensraum-URI vorangestellt.
namespaces
und
namespace-prefixes
definiert die SAX2-Schnittstelle noch weitere
Features.
| Feature-URI | Funktionalität |
|---|---|
external-general-entities
|
Zeigt an/Steuert, ob der Parser externe
Textentitäten verarbeitet. Bei
validierenden Parsern ist diese
Eigenschaft immer
true
.
|
external-parameter-entities
|
Zeigt an/Steuert, ob der Parser externe
Parameterentitäten verarbeitet. Bei
validierenden Parsern ist diese
Eigenschaft immer
true
.
|
is-standalone
|
Diese Eigenschaft kann nur abgefragt
werden, während der Parser gerade ein
Dokument einliest (nachdem die Methode
startDocument()
abgearbeitet wurde). Der Wert der
Eigneschaft ist
true
, wenn im Prolog des Dokumentes
standalone="yes"
spezifiziert wurde, andernfalls
false
.
|
lexical-handler/parameter-entities
|
true
zeigt an, daß der LexicalHandler (eine
optionale Erweiterung von SAX, die etwa
Informationen über die Grenzen von
lexikalischen Bereichen, wie z.B.
Kommentarbereichen liefert) den Start
und das Ende von Parameterentitäten
anzeigt.
|
namespaces
|
true
zeigt an, daß Namensraum-URIs und lokale
Namen für Elemente und Attribute
abfragbar sind.
|
namespace-prefixes
|
true
zeigt an, daß qualifizierte Namen und
Namensraumattribute abfragbar sind.
|
resolve-dtd-uris
|
true
zeigt an, daß System-IDs in
Deklarationen als absolute URIs (im
Gegensatz zu relativen URIs)
zurückgeliefert werden.
false
bedeutet, daß die URIs als relative URIs
zurückgegeben werden. Zugriff auf die
Basis-URI ist dann über
Locator.getSystemId()
möglich.
|
string-interning
|
true
bedeutet, daß alle XML-Namen (für
Elemente, Attribute, Präfixe, Entities,
Notations) mit Hilfe von
java.lang.String.intern
als kanonische Repräsentation vorliegen
und damit eindeutig sind. Vorteil:
Schnelles Testen auf Gleichheit mit
Stringkonstanten (schneller als ein
Aufruf von
String.equals()
).
|
unicode-normalization-checking
|
Steuert, ob der Parser Fehler meldet,
die bei der Unicode Normalisierung
entstehen (siehe
XML 1.1 Spezifikation, Abschnitt
2.13
).
Derartige Fehler stellen keine schwerwiegenden Fehler bei der Verarbeitung dar. Ein Dokument bleibt wohlgeformt, auch wenn die betreffenden Konstrukte nicht vollständig normalisiert wurden. |
use-attributes2
|
true
zeigt an, ob die Attributobjekte, die
dieser Parser in der Operation
startElement()
übergibt, der Schnittstellen
org.xml.sax.ext.Attributes2
entsprechen. Diese Schnittstelle erlaubt
weitergehende Information, wie etwa, ob
der Attributwert im Dokument angegeben
wurde oder ob der Defaultwert, der in
der DTD spezifiziert war, angenommen
wurde.
|
use-locator2
|
true
bedeutet, daß die
Locator
objekte, die der Parser in der Methode
setDocumentLocator()
übergibt, die Schnittstelle
org.xml.sax.ext.Locator2
unterstützt. Diese Schnittstelle
unterstützt weitergehende Information
über das Dokument, wie etwa die
Zeichenkodierung sowie die verwendete
XML-Version.
|
use-entity-resolver2
|
true
zeigt an, wenn der Entity Resolver die
Schnittstelle
org.xml.sax.ext.EntityResolver2
unterstützt. In diesem Fall werden die
dort definierten (neuen) Methoden
verwendet.
|
validation
|
Steuert, ob ein validierender Parser
verwendet wird, der alle
Validierungsfehler meldet. Wenn ja (
true
), werden alle externen Entitäten
gelesen.
|
xmlns-uris
|
Steuert, ob der Parser Attribute mit
Namensraumdeklarationen so behandelt,
daß sie sich im Namensraum
http://www.w3.org/2000/xmlns/
befinden. Ursprünglich befinden sich
diese Attribute explizit in keinem
Namensraum (siehe
Namespaces in XML
). Eine spätere Ausgabe der
Spezifikation (siehe
Namespaces in XML 1.0 (Second
Edition)
oder
Namespaces in XML 1.1 (Second
Edition)
definiert für diese Attribute jedoch den
oben angegebenen Namensraum.
|
xml-1.1
|
Wenn der Parser sowohl XML 1.0 als auch
XML 1.1 unterstützt, so besitzt diese
Eigenschaft den Wert
true
.
|
parse
SAXException
abgeleiteten Ausnahmeereignisklassen an
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.FileReader;
import org.xml.sax.InputSource;
public class SAXExample6 extends DefaultHandler {
public static void main(String args[]) throws Exception {
XMLReader xr = XMLReaderFactory.createXMLReader();
SAXExample6 handler = new SAXExample6();
xr.setContentHandler(handler);
xr.setErrorHandler(handler);
try {
System.out.println(xr.getProperty("http://www.barbara-zengler.de/"));
} //try
catch (SAXException e) {
System.out.println("SAXException:" + e);
} //catch()
FileReader r = new FileReader(args[0]);
xr.parse(new InputSource(r));
} //main()
}//class SAXExample6SAXException:org.xml.sax.SAXNotRecognizedException: Property 'http://www.barbara-zengler.de/' is not recognized.
{http://www.w3.org/1998/Math/MathML:set=1, http://www.w3.org/2000/svg:text=1, :document=1, http://www.w3.org/1998/Math/MathML:math=1, http://www.w3.org/1998/Math/MathML:ci=3, http://www.w3.org/2000/svg:svg=1, http://www.w3.org/2000/svg:set=1, http://www.w3.org/2000/svg:g=1}
SAXParseException
-Ausnahmeereignis erzeugt. Es stellt Methoden zur
näheren Lokalisierung der Fehlerstelle im
Eingabedokument zur Verfügung.
getColumnNumber
und
getLineNumber
lassen sich Spalten- und Zeilennummer des Fehlers
ermitteln.
getSystemId
und
getPublicId
können zur Ausgabe des System-Identifiers, der bei
lokaler Referenzierung identisch zum Dateisystempfad
ist, bzw. zur Ausgabe des Public-Identifiers --
falls gesetzt -- herangezogen werden.
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.FileReader;
import org.xml.sax.InputSource;
public class SAXExample7 extends DefaultHandler {
public static void main(String args[]) throws Exception {
XMLReader xr = XMLReaderFactory.createXMLReader();
SAXExample7 handler = new SAXExample7();
xr.setContentHandler(handler);
xr.setErrorHandler(handler);
try {
FileReader r = new FileReader(args[0]);
xr.parse(new InputSource(r));
} //try
catch (SAXParseException spe) {
System.out.println("A SAXParseException occured ...\n" +
"at column " + spe.getColumnNumber() + "\n" +
"at line " + spe.getLineNumber() + "\n" +
"public identifier of document is: " + spe.getPublicId() + "\n" +
"system identifier of document is: " + spe.getSystemId());
} //catch()
} //main()
}//class SAXExample7<?xml version="1.0"?> <root> <elementA att=a oder b> <elementB> if a<b ==> c </elementA> <elementC att1="42" att1="3.14"> <elementD <?do-something?> > </elementC> </elementD> <!---- dies ist nicht erlaubt ----> </root>
A SAXParseException occured ... at column 16 at line 3 public identifier of document is: null system identifier of document is: null
SAXNotSupportedException
wird durch den Versuch ausgelöst, eine zulässige und
erkannte Parameterisierung des SAX-Parsers
vorzunehmen, die durch diesen nicht unterstützt
wird.
ContentHandler
-Schnittstelle.
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.FileReader;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
public class SAXExample8 extends DefaultHandler {
public void startDocument() {
System.out.println("EVENT: startDocument");
} //startDocument()
public void endDocument() {
System.out.println("EVENT: endDocument");
} //endDocument()
public void startPrefixMapping(String prefix, String uri) {
System.out.println("EVENT: startPrefixMapping");
System.out.println("prefix="+prefix);
System.out.println("namespaceURI="+uri);
} //startPrefixMapping()
public void endPrefixMapping(String prefix) {
System.out.println("EVENT: endPrefixMapping");
System.out.println("prefix="+prefix);
} //endPrefixMapping()
public void processingInstruction(String target, String data) {
System.out.println("EVENT: processingInstruction");
System.out.println("target="+target);
System.out.println("data="+data);
} //processingInstruction()
public void ignorableWhitespace(char[] ch, int start, int length) {
System.out.println("EVENT: ignorableWhitespace");
for (int i=start; i<start+length; i++)
System.out.print(ch[i]);
System.out.print("\n");
} //ignorableWhietespace()
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
System.out.println("EVENT: startElement");
System.out.println("namespaceURI="+namespaceURI);
System.out.println("localName="+localName);
System.out.println("qName="+qName);
for (int i=0; i<atts.getLength(); i++) {
System.out.println("attribute:");
System.out.println("localName="+atts.getLocalName(i));
System.out.println("qName="+atts.getQName(i));
System.out.println("type="+atts.getType(i));
System.out.println("namespaceURI="+atts.getURI(i));
System.out.println("value="+atts.getValue(i));
} //for
} //startElement()
public void endElement(String namespaceURI, String localName, String qName) {
System.out.println("EVENT: endElement");
System.out.println("namespaceURI="+namespaceURI);
System.out.println("localName="+localName);
System.out.println("qName="+qName);
} //endElement()
public void characters(char[] ch, int start, int length) {
System.out.println("EVENT: characters");
for (int i=start; i<start+length; i++)
System.out.print(ch[i]);
System.out.print("\n");
} //characters()
public static void main (String args[]) throws Exception {
XMLReader xr = XMLReaderFactory.createXMLReader();
SAXExample8 handler = new SAXExample8();
xr.setContentHandler(handler);
xr.setErrorHandler(handler);
// set parser namespace-aware
xr.setFeature("http://xml.org/sax/features/namespaces", true);
xr.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
FileReader r = new FileReader(args[0]);
try {
xr.parse(new InputSource(r));
} catch (SAXParseException spe) {
System.out.println("A SAXParseException occured ...\n"+
"at column "+spe.getColumnNumber()+"\n"+
"at line "+spe.getLineNumber()+"\n"+
"public identifier of document is: "+spe.getPublicId()+"\n"+
"system identifier of document is: "+spe.getSystemId());
} //catch()
} //main(args[])
}//class SAXExample8<?xml version="1.0"?>
<?myPI this is a test?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg">
<head>
<title>Testpage</title>
</head>
<body>
<p>This is a <a href="http://www.jeckle.de">link</a>
<svg:svg width="4cm" height="8cm">
<svg:ellipse cx="2cm" cy="4cm" rx="2cm" ry="1cm"/>
</svg:svg>
</p>
</body>
</html><?xml version="1.0" encoding="UTF-8"?>
<?xslidy counter-separator=": " ?>
<?xslidy counter-format="full" ?>
<?xslidy extension-file="html" ?>
<?xslidy extension-link="" ?>
<?xslidy img-path="../pics" ?>
<?xslidy link-author="http://www.barbara-zengler.de/" ?>
<?xslidy link-contents="./" ?>
<?xslidy link-glossary="http://dret.net/glossary/" ?>
<?xslidy link-home="./" ?>
<?xslidy listing-class="listing" ?>
<?xslidy listing-path="." ?>
<?xslidy outline-class="outline" ?>
<?xslidy outline-title="Inhalt" ?>
<?xslidy outlink-mark="a" ?>
<?xslidy outlink-style="class(outlink)" ?>
<?xslidy part-slide-count="all" ?>
<?xslidy part-slide-text=" [*]" ?>
<?xslidy slidy-prefix="slidy" ?>
<?xslidy style-uri="../css/xslidy-fha.css" ?>
<?xslidy xslidy-prefix="xslidy" ?>
<xslidy
xmlns="http://dret.net/xmlns/xslidy/1"
xmlns:xslidy="http://dret.net/xmlns/xslidy/1">
<title short="XML">
<a href="./">XML (i3.DATA)</a>
</title>
<author short="B. Zengler">
<a
href="http://www.barbara-zengler.de/"
title="Homepage of B. Zengler">
Barbara Zengler
</a>
</author>
<affiliation short="HSA">
<a
href="http://www.hs-augsburg.de/"
title="Fachhochschule Augsburg">
Fachhochschule Augsburg
</a>
,
<a
href="http://www.hs-augsburg.de/hochschule/fakultaet/informatik/index.html"
title="Fakultät für Informatik">
Fakultät für Informatik
</a>
,
<a
href="http://www.hs-augsburg.de/hochschule/fakultaet/informatik/studium/studiengang/interaktive_medien_bachelor/index.html"
title="Interaktive Medien">
Studiengang Interaktive Medien
</a>
</affiliation>
<copyright>2008, Barbara Zengler</copyright>
<layout>
<slide
class="cover"
cover="slidycover">
<h1>
<title />
</h1>
<h3>
<title level="xslidy" />
</h3>
<h5>
<author />
<br />
<affiliation />
<br />
Wintersemester 2008/2009
</h5>
<a
rel="license"
title="view full text of license"
href="http://creativecommons.org/licenses/by-nc-sa/2.5/"
class="bottom-align"
style="margin-bottom : 2%">
<table>
<tr>
<td align="left">
<img
alt="Creative Commons License"
border="0"
src="../pics/somerights20.png"
height="31"
width="88" />
</td>
<td
style="font-size : small ; line-height : 120%;"
valign="middle"
align="left">
<p>
This work is licensed under a Creative
Commons
<br />
Attribution-NonCommercial-ShareAlike 2.5
License.
</p>
</td>
</tr>
</table>
</a>
</slide>
<class />
</layout>
<style
type="text/css"
src="css/xslidy-fha.css" />
<index name="index.html">
<category
element="xml"
class="xml" />
<category
element="elem"
class="xml elem" />
<category
element="cssp"
class="css" />
<category
element="csss"
class="css" />
<category
element="css"
class="css" />
<category
element="xpathf"
class="xpath" />
<category
element="xpath"
class="xpath" />
<category
element="xslte"
class="xslt elem" />
<category
element="xslta"
class="xslt" />
<category
element="xslt"
class="xslt" />
<category
element="xq"
class="xq" />
<category
element="xsde"
class="xsd elem" />
<category
element="xsda"
class="xsd" />
<category
element="xsd"
class="xsd" />
</index>
<toc
id="html-toc"
name="toc.html">
<table
rules="all"
cellspacing="0"
cellpadding="5"
width="100%">
<thead>
<tr>
<th>Date</th>
<th>Subject</th>
<th>Slides</th>
<th>Resources</th>
</tr>
</thead>
<tbody>
<xslidy:for-each-presentation>
<tr>
<td
align="right"
valign="top">
<xslidy:date />
</td>
<td valign="top">
<b>
<xslidy:title />
<span class="toggle">:</span>
</b>
<span class="toggle">
<span class="abstract">
<xslidy:toc id="abstract" />
</span>
</span>
</td>
<td align="center">
<xslidy:presentation-link
title="Lecture Slides">
<xslidy:title form="short" />
</xslidy:presentation-link>
<xslidy:slides>(* Slides)</xslidy:slides>
</td>
<td>
<xslidy:toc id="resources" />
</td>
</tr>
</xslidy:for-each-presentation>
</tbody>
</table>
</toc>
<!-- <presentation id="uebungsaufgaben">
<title short="uebungsaufgaben">Übungsaufgaben</title>
<date>2007-12-02</date>
<toc id="resources" />
<toc id="abstract">
Hier finden Sie eine Zusammenstellung der Übungsaufgaben.
</toc>
<part>
<title>Übungsaufgaben zur Wohlgeformtheit</title>
<part>
<title>Übungsaufgabe zur Wohlgeformtheit</title>
<slide>
<title>Übungsaufgabe zur Wohlgeformtheit</title>
<ul>
<li>
Das untenstehende XML-Dokument ist nicht
wohlgeformt. Wandeln Sie es in ein
wohlgeformtes XML-Dokument um.
</li>
<listing src="uebung1.xml"></listing>
</ul>
</slide>
</part>
</part>
<part>
<title>Übungsaufgaben zu Namensräumen</title>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 1
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 1
</title>
<p>
Nachfolgend finden Sie verschiedene
Multiple-Choice Aufgaben zu Namensräumen. Es
können je Aufgabe auch mehrere Antworten korrekt
sein.
</p>
<p>
Einblenden der Lösungen (sie befinden sich
jeweils am Ende der Seite) durch Drücken der
Taste
<code>n</code>
!
</p>
<ul>
<li>Verwendung</li>
<ul>
<li>
A) XML-Namensräume sind die
hierarchische Sammlung von
XML-Elementen.
</li>
<li>
B) XML-Namensräume gruppieren
XML-Elemente und -Attribute.
</li>
<li>
C) XML-Namensräume sind durch einen
Hyperlink eindeutig adressierbar.
</li>
<li>
D) XML-Namensräume werden durch eine URL
identifiziert.
</li>
<li>
E) XML-Namensräume werden durch eine URI
benannt.
</li>
</ul>
<note>
<li>
Lösung: Die Alternativen B und D sind
korrekt!
</li>
</note>
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 2
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 2
</title>
<ul>
<li>Definition</li>
<ul>
<li>
A) Namensräume müssen für jedes
XML-Vokabular definiert werden.
</li>
<li>
B) Namensräume können ausschließlich
durch Standardisierungsgremien definiert
werden.
</li>
<li>
C) Namensräume können wahlfrei durch den
Ersteller eines XML-Vokabulars definiert
werden.
</li>
<li>
D) Namensräume müssen beim World Wide
Web Consortium registriert werden.
<br />
Es weist ihnen dann eine eineindeutige
URL zu.
</li>
<li>
E) Namensräume können durch eine URL
identifiziert werden.
</li>
</ul>
<note>
<li>
Lösung: Die Alternativen C und E sind
korrekt!
</li>
</note>
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 3
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 3
</title>
<ul>
<li>Syntax</li>
<ul>
<li>
A) Die Deklaration der
Namensraumattribute muß in der
Dokumentgrammatik erfolgen.
<br />
Dort sind sie als optionale Attribute
definiert.
</li>
<li>
B) Namensräume müssen zwingend als
Wurzelelement (
<em>document element</em>
) des XML-Dokuments definiert werden.
</li>
<li>
C) Namensräume können ausschließlich für
Elemente definiert werden.
</li>
<li>
D) Die Redefinition bereits gebundener
Namensraumpräfixe ist zulässig.
</li>
<li>
E) Wird für ein Element kein Namensraum
definiert, so ist sein Verhalten im
Namensraumkontext undefiniert.
</li>
</ul>
<note>
<li>
Lösung: Die Alternative D ist korrekt!
</li>
</note>
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 4
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 4
</title>
<ul>
<li>
Namensraumauflösung - Explizite Definition
</li>
<ul>
<li>Gegeben sei folgendes XML-Dokument.</li>
<listing
src="uebung-namensraeume-aufg4.xml">
</listing>
<li>
Zur besseren Übersichtlichkeit sind den
Namensräumen folgende Nummern
zugewiesen:
</li>
<ol>
<li>
<em>(leerer Namensraum)</em>
</li>
<li>
<code>http://www.example.com</code>
</li>
<li>
<code>
http://www.example.com/bar
</code>
</li>
<li>
<code>
http://www.example.com/foo
</code>
</li>
<li>
<code>
http://www.fh-augsburg.de
</code>
</li>
<li>
<code>
http://www.barbara-zengler.de
</code>
</li>
<li>
<code>http://www.beispiel.de</code>
</li>
<li>
<code>http://www.w3.org</code>
</li>
</ol>
<li>
Folgende Tabelle zeigt unterhalb der
Buchstaben A-E fünf alternative
Namensraumzuordnungen für alle Elemente,
unter Verwendung der soeben definierten
Nummern.
<br />
Finden Sie die richtige!
</li>
<table
width="80%"
border="1">
<thead>
<tr>
<th>
Element- oder Attributename
</th>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
<th>E</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>root</code>
</td>
<td>7</td>
<td>7</td>
<td>1</td>
<td>5</td>
<td>7</td>
</tr>
<tr>
<td>
<code>elemA</code>
</td>
<td>7</td>
<td>1</td>
<td>7</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemB</code>
</td>
<td>5</td>
<td>5</td>
<td>5</td>
<td>1</td>
<td>5</td>
</tr>
<tr>
<td>
<code>elemC</code>
</td>
<td>5</td>
<td>1</td>
<td>7</td>
<td>8</td>
<td>1</td>
</tr>
<tr>
<td>
<code>attA</code>
</td>
<td>7</td>
<td>7</td>
<td>1</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>
<code>elemD</code>
</td>
<td>7</td>
<td>1</td>
<td>7</td>
<td>5</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemE</code>
</td>
<td>7</td>
<td>1</td>
<td>6</td>
<td>8</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemF</code>
</td>
<td>5</td>
<td>2</td>
<td>5</td>
<td>5</td>
<td>4</td>
</tr>
<tr>
<td>
<code>attB</code>
</td>
<td>5</td>
<td>3</td>
<td>6</td>
<td>7</td>
<td>3</td>
</tr>
<tr>
<td>
<code>elemG</code>
</td>
<td>5</td>
<td>2</td>
<td>5</td>
<td>1</td>
<td>8</td>
</tr>
</tbody>
</table>
</ul>
<note>
<li>
Lösung: Die Alternative E ist korrekt!
</li>
</note>
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 5
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 5
</title>
<ul>
<li>
Namensraumauflösung - Implizite Definition
</li>
<ul>
<li>Gegeben sei folgendes XML-Dokument.</li>
<listing
src="uebung-namensraeume-aufg5.xml">
</listing>
<li>
Zur besseren Übersichtlichkeit sind den
Namensräumen folgende Nummern
zugewiesen:
</li>
<ol>
<li>
<em>(leerer Namensraum)</em>
</li>
<li>
<code>urn:example.com:bar</code>
</li>
<li>
<code>urn:example.com:foo</code>
</li>
<li>
<code>
urn:xmlns:fh-augsburg.de:vorlesung:XML
</code>
</li>
<li>
<code>urn:xmlns:beispiel.de</code>
</li>
</ol>
<li>
Folgende Tabelle zeigt unterhalb der
Buchstaben A-E fünf alternative
Namensraumzuordnungen für alle Elemente,
unter Verwendung der soeben definierten
Nummern.
<br />
Finden Sie die richtige!
</li>
<table
width="80%"
border="1">
<thead>
<tr>
<th>
Element- oder Attributename
</th>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
<th>E</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>theDocument</code>
</td>
<td>1</td>
<td>1</td>
<td>4</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>
<code>elemA</code>
</td>
<td>1</td>
<td>4</td>
<td>4</td>
<td>1</td>
<td>5</td>
</tr>
<tr>
<td>
<code>elemB</code>
</td>
<td>4</td>
<td>4</td>
<td>5</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>
<code>att1</code>
</td>
<td>5</td>
<td>1</td>
<td>1</td>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>
<code>elemC</code>
</td>
<td>4</td>
<td>1</td>
<td>4</td>
<td>5</td>
<td>1</td>
</tr>
<tr>
<td>
<code>att2</code>
</td>
<td>5</td>
<td>1</td>
<td>4</td>
<td>5</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemD</code>
</td>
<td>5</td>
<td>1</td>
<td>4</td>
<td>5</td>
<td>3</td>
</tr>
<tr>
<td>
<code>elemE</code>
</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>
<code>elemF</code>
</td>
<td>1</td>
<td>4</td>
<td>1</td>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>
<code>elemG</code>
</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>4</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemH</code>
</td>
<td>2</td>
<td>1</td>
<td>3</td>
<td>1</td>
<td>1</td>
</tr>
</tbody>
</table>
</ul>
<note>
<li>
Lösung: Die Alternative B ist korrekt!
</li>
</note>
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 6
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 6
</title>
<ul>
<li>Namensraumbildung</li>
<ul>
<li>Gegeben seien folgende Aussagen.</li>
<ul>
<li>
Das Element Information Item
<code>elemA</code>
befindet sich im Namensraum
<code>
http://www.fh-augsburg.de
</code>
</li>
<li>
Das Element Information Item
<code>elemB</code>
befindet sich im Namensraum
<code>
http://www.barbara-zengler.de/vorlesung/
</code>
</li>
<li>
Die Attribut Information Items
<code>href</code>
,
<code>actuate</code>
und
<code>show</code>
befinden sich im Namensraum
<code>
http://www.fh-augsburg.de
</code>
</li>
<li>
Die Element Information Items
<code>elemC</code>
und
<code>elemD</code>
befinden sich im Namensraum
<code>http://www.beispiel.de</code>
</li>
<li>
Das Element Information Item
<code>elemE</code>
befindet sich im Namensraum
<code>http://www.example.com</code>
</li>
</ul>
<li>
Frage: Welche der folgenden Dokumente
erfüllen diese Aussagen?
</li>
<li>Dokument A</li>
<listing src="dokumentA.xml"></listing>
<li>Dokument B</li>
<listing src="dokumentB.xml"></listing>
<li>Dokument C</li>
<listing src="dokumentC.xml"></listing>
<li>Dokument D</li>
<listing src="dokumentD.xml"></listing>
<li>Dokument E</li>
<listing src="dokumentE.xml"></listing>
</ul>
<note>
<li>
Lösung: Die Dokumente A, C und E sind
korrekt!
</li>
</note>
</ul>
</slide>
</part>
</part>
<part>
<title>Übungsaufgaben zu DTDs</title>
<part>
<title>Übungsaufgabe zu DTDs</title>
<slide>
<title>Übungsaufgabe zu DTDs</title>
<ul>
<li>
Die folgende DTD ist syntaktisch falsch.
Korrigieren Sie die Fehler.
<br />
Die Lösung (am Ende der Seite) kann durch
Drücken der Taste
<code>n</code>
eingeblendet werden.
</li>
<listing src="wrong.dtd"></listing>
<note>
<li>Lösung:</li>
<listing src="right.dtd"></listing>
</note>
</ul>
</slide>
</part>
</part>
<part>
<title>Übungsaufgaben zu XML Schema</title>
<part>
<title>Übungsaufgaben zu XML Schema - Aufgabe 1</title>
<slide>
<title>
Übungsaufgaben zu XML Schema - Aufgabe 1
</title>
<ul>
<li>
Gegeben ist folgende DTD. Erstellen Sie ein
äquivalentes Schema gemäß der
<a
href="http://www.w3.org/TR/xmlschema-1/">
W3C XML Schema Recommendation
</a>
.
</li>
<listing src="dtd-fuer-schemaumwandlung.dtd"></listing>
</ul>
</slide>
</part>
<part>
<title>Übungsaufgaben zu XML Schema - Aufgabe 2</title>
<slide>
<title>
Übungsaufgaben zu XML Schema - Aufgabe 2
</title>
<p>
Erstellen Sie ein Schema, das die nachfolgend
aufgeführten Zusammenhänge abbildet:
</p>
<ul>
<li>
Das Element Information Item
<code>Autor</code>
verfügt über die Kindknoten
<code>Vorname</code>
(mindestens einmaliges, aber höchstens
zweimaliges Auftreten) sowie
<code>Nachname</code>
.
<br />
Beide Elemente stellen Namen im
herkömmlichen Sinne dar und verfügen über
keine interne Formatierung durch Leerzeichen
oder Zeilenumbrüche
</li>
<li>
Der Wurzelknoten
<code>Zeitschrift</code>
enthält genau ein als
<code>Verlag</code>
bezeichnetes Kindelement des Typs
<code>string</code>
.
</li>
<li>
Jeder
<code>Beitrag</code>
besitzt mindestens einen aber beliebig viele
<code>Autor</code>
en.
</li>
<li>
Jedes Element Information Item des Typs
<code>Beiträge</code>
enthält eine positive Anzahl von Element
Information Items des Namens
<code>Beitrag</code>
.
</li>
<li>
Jedes Element Information Item des Typs
<code>Beitrag</code>
enthält das Attribut
<code>Seitenanzahl</code>
(positive Ganzzahl) und
<code>Annahmedatum</code>
(Datum)
</li>
<li>
Jedes Element Information Item des Typs
<code>Zeitschrift</code>
enthält genau ein Element Information Item
des Namens
<code>Beiträge</code>
.
</li>
<li>
Zu jedem
<code>Beitrag</code>
existiert eine Menge von
<code>Schlagworten</code>
. Diese werden in einem Element Information
Item
<code>Schlagworte</code>
abgelegt. Dieses Element kann zwischen drei
und fünf Zeichenketten als
<code>Eintrag</code>
beinhalten.
</li>
</ul>
</slide>
</part>
<part>
<title>Übungsaufgaben zu XML Schema - Aufgabe 3</title>
<slide>
<title>
Übungsaufgaben zu XML Schema - Aufgabe 3
</title>
<p>
Gegeben sei nachfolgendes Schema. Geben Sie dazu
eine
<em>schema-gültige</em>
Dokumentinstanz an.
</p>
<listing src="uebung-schema-valid-instanz.xsd"></listing>
</slide>
</part>
<part>
<title>Übungsaufgaben zu XML Schema - Aufgabe 4</title>
<slide>
<title>
Übungsaufgaben zu XML Schema - Aufgabe 4
</title>
<p>
Gegeben sei nachfolgendes Dokument. Entwerfen
Sie dafür ein gültiges XML-Schema.
</p>
<listing src="uebung-schemaentwurf.xml"></listing>
</slide>
</part>
</part>
<part>
<title>Übungsaufgaben zu XPath</title>
<slide>
<title>Übungsaufgaben zu XPath</title>
<p>
Folgenden Aufgaben liegt die
<a
href="http://www.barbara-zengler.de/vorlesung/projektverwaltung-erweitert.xml">
erweiterte Projektverwaltung
</a>
aus der Vorlesung zugrunde.
</p>
<ol>
<li>
Wie muß ein XPath-Ausdruck lauten, um folgendes
zu selektieren?
</li>
<ul>
<li>
Selektion aller Personen mit Nachnamen
„Obermüller“.
</li>
<li>
Selektion aller Nachnamen von Personen die
über mehr als eine Qualifikation verfügen.
</li>
<li>
Selektion der Nachnamen aller Projektleiter.
</li>
</ul>
</ol>
</slide>
</part>
</presentation> -->
<!-- Ende Übungsaufgaben -->
<!--
<presentation id="seminarthemen">
<title short="seminarthemen">
Seminarthemen: Daten und Vortragende
</title>
<date>2007-10-08</date>
<toc id="resources" />
<toc id="abstract">
Hier finden Sie eine Übersicht der Seminarthemen, sowie die
Zuteilung zu Vortragenden und das Vortragsdatum.
</toc>
<slide>
<title>Seminarthemen und Termine</title>
<p>
<b>Achtung:</b>
Die Reihenfolge der Themennennungen ist zunächst
willkürlich und spiegelt nicht eine eventuelle
Reihenfolge im Seminar wider, solange die Termine für
die Vorträge noch nicht feststehen.
<br />
<b>Achtung:</b>
Die Teilnahme am Seminar ist selbstverständlich
verpflichtend. Die Bekanntgabe der Noten erfolgt am Ende
des Semesters.
</p>
<table
border="1"
cellpadding="20">
<tr>
<th
align="left"
valign="middle">
Thema
</th>
<th
align="left"
valign="middle">
Datum
</th>
<th
align="left"
valign="middle">
Vortragende
</th>
</tr>
<tr>
<td>Das World Wide Web Consortium (W3C)</td>
<td>22.10.2007</td>
<td>Peter Alt, Daniel Fontes, Bernhard Leitner</td>
</tr>
<tr>
<td>
Das Vektorgrafikformat Scalable Vector Graphics
(SVG)
</td>
<td>22.10.2007</td>
<td>
Caroline Jochno, Katja Loos, Lisa Raschupkin
</td>
</tr>
<tr>
<td>InkML</td>
<td>05.11.2007</td>
<td>Alvin Raminger, Krisztina Sárközi</td>
</tr>
<tr>
<td>
Verwendung von XML in Content Management
Systemen - am Beispiel ZOPE
</td>
<td>05.11.2007</td>
<td>Jeanne Haberland, Moritz Meyers</td>
</tr>
<tr>
<td>Really Simple Syndication (RSS)</td>
<td>19.11.2007</td>
<td>Andreas Fischer, Boris Heißerer</td>
</tr>
<tr>
<td>
Datenaustausch mit SOAP und bekannte Anwendungen
</td>
<td>19.11.2007</td>
<td>
Eugenia Merkel, Melissa Müller, Jörg Richter
</td>
</tr>
<tr>
<td>Die Wireless Markup Language (WML)</td>
<td>3.12.2007</td>
<td>Michael Ilg, Leon Zarbock</td>
</tr>
<tr>
<td>XSL-Formatting Objects (XSL-FO)</td>
<td>3.12.2007</td>
<td>Björn Gottwald, Frank Robnik, Rainer Wagner</td>
</tr>
<tr>
<td>
Das Oasis Open Document Format for Office
Applications (ODF)
</td>
<td>17.12.2007</td>
<td>Veronica Hanglberger, Marie Stöcker</td>
</tr>
<tr>
<td>XUL</td>
<td>17.12.2007</td>
<td>Marion Dandl, Melanie Friedrich</td>
</tr>
<tr>
<td>Das X in Ajax</td>
<td>17.12.2007</td>
<td>Manuel Piepereit, Susanne Woitsch</td>
</tr>
<tr>
<td>Adobe Flex</td>
<td>14.01.2008</td>
<td>Thomas Nolde, Marc Tomona</td>
</tr>
<tr>
<td>
Multimedia-Inhalte des Web: Synchronized
Multimedia Integration Language (SMIL)
</td>
<td>14.01.2008</td>
<td>Matthäus Baur, Melanie Schmidt</td>
</tr>
</table>
</slide>
</presentation>
-->
<!-- Erste VL am 6.10.2008-->
<presentation
id="intro"
cover="slidycover">
<title short="Introduction">Einführung und Überblick</title>
<date>2008-10-06</date>
<toc id="resources">
<a href="http://www.w3.org/Press/1998/XML10-REC">
XML 1.0 Press Release
</a>
</toc>
<toc id="abstract">
Die
<em>Extensible Markup Language (XML)</em>
wurde im Jahr 1998 durch das World Wide Web Consortium (W3C)
als Standard verabschiedet. Sie wurde vor dem Hintergrund
der Expansion der Internetnutzung in Richtung
applikationsspezifischer Formate erdacht. HTML als die
"Sprache des Web" war rein zum web-basierten Publizieren von
(Text-)Dokumenten erdacht. Mit XML hingegen eröffnete sich
zum ersten Mal die Möglichkeit, Daten im Web maschinenlesbar
und flexibel auszutauschen. Das
<em>Semantic Web</em>
versucht seit nunmehr einigen Jahren, mit XML-Mitteln
semantische Information darzustellen und nutzbar zu machen.
Mittlerweile hat sich die XML als weltweit akzeptiertes
Austauschformat für maschinenlesbare und strukturierte Daten
etabliert.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract" />
</p>
</slide>
<part>
<title>Diverses / Organisatorisches</title>
<slide>
<title>Über mich</title>
<ul>
<li>
Wissenschaftliche Mitarbeiterin der
<a href="http://www.daimlerchrysler.com/">
DaimlerChrysler Forschung
</a>
(2004-2006)
</li>
<ul>
<li>
Forschung auf diversen Gebieten der XML,
u.a. Mitarbeit in der W3C-Arbeitsgruppe zur
Web Service Description Language
</li>
</ul>
<li>
Beraterin bei der
<a href="http://www.altran.com/">
Altran Group
</a>
(2006-?)
</li>
<ul>
<li>
für die Altran tätig im Forschungs- und
Innovationszentrum der BMW AG
</li>
</ul>
<li>Veröffentlichungen</li>
<ul>
<li>
Buch über
<q>
<a href="http://www.soa-buch.de/">
Service-orientierte Architekturen
</a>
</q>
</li>
<li>
Buch
<q>
<a href="http://www.uml-glasklar.de/">
UML glasklar
</a>
</q>
</li>
<li>
Diverse Artikel in iX, ObjektSpektrum, ...
</li>
</ul>
</ul>
</slide>
<slide>
<title>Über Sie</title>
<img
style="margin : 4% ; width : 90% ; "
src="classroom.jpg" />
<p>
© S. Hofschlaeger /
<a href="http://www.pixelio.de">PIXELIO</a>
</p>
</slide>
<slide>
<title>Über diesen Kurs</title>
<ul>
<li>
Web page:
<code>
<a href="./">
http://www.barbara-zengler.de/vorlesung/
</a>
</code>
</li>
<li>Vorlesungszeiten:</li>
<ul>
<li>
Vorlesung: Montags 08:00 - 09:30. Raum I 102
</li>
<li>
Praktikum: Montags 09:50 - 11:20. Raum M2.03
(Betreuung durch Herrn Prof. Klever)
</li>
</ul>
<li>
Prüfung erfolgt durch Studienarbeit im Rahmen
des Praktikums (gemeinsam mit i3.NETZ)
</li>
<li>Ablauf des Praktikums:</li>
<ul>
<li>
1. Teil: Übungsaufgaben (1.10.-12.1.2008)
</li>
<li>
2. Teil: Anfertigen der Studienarbeit (ab
1.12.2008)
</li>
</ul>
<li>
Ausgabe der Studienarbeiten am 1. Dezember 2008.
Das Praktikum ist erfolgreich zu absolvieren.
</li>
</ul>
</slide>
<slide>
<title>Vorlesungstermine</title>
<ul>
<li>
Vorlesungstermine im WS 2008/09 (15
Veranstaltungen).
</li>
</ul>
<table
width="90%"
border="1">
<thead>
<tr>
<th width="30%">Termin</th>
<th>Inhalt</th>
<th>Praktikum</th>
</tr>
</thead>
<tbody>
<tr>
<td>06. Oktober 2008</td>
<td>Einführungsveranstaltung</td>
<td>
Achtung: An diesem Tag kein Praktikum!
</td>
</tr>
<tr>
<td>13. Oktober 2008</td>
<td>XML-Dokumente / Wohlgeformtheit</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>20. Oktober 2008</td>
<td>Namensräume</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>27. Oktober 2008</td>
<td>DTD / XML Schema</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>03. November 2008</td>
<td>XML Schema</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>10. November 2008</td>
<td>SAX</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>17. November 2008</td>
<td>DOM</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>24. November 2008</td>
<td>DOM</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>01. Dezember 2008</td>
<td>DOM, Ausgabe der Seminararbeiten</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>08. Dezember 2008</td>
<td>XPath</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>15. Dezember 2008</td>
<td>RDF und RSS</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>22. Dezember 2008</td>
<td>XSLT</td>
<td>
Praktikumsaufgaben zum Vorlesungs-Thema
</td>
</tr>
<tr>
<td>12. Januar 2009</td>
<td>XFORMS</td>
<td>
Kleinere Praktikumsaufgabe +
Fragestellungen zur Studienarbeit
</td>
</tr>
<tr>
<td>19. Januar 2009</td>
<td>JAXB</td>
<td>Fragestellungen zur Studienarbeit</td>
</tr>
<tr>
<td>26. Januar 2009</td>
<td>SVG und SMIL</td>
<td>Fragestellungen zur Studienarbeit</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
Ablauf des Praktikums und der Studienarbeiten
</title>
<ul>
<li>Ablauf</li>
<ul>
<li>
Praktikum: Durchführung kleinerer
Übungsaufgaben bis zum 12.1.2009
</li>
<li>
Am 1.12. erfolgt die Ausgabe der gemeinsamen
Studienarbeiten XML (i3.DATA) und
Datenkommunikation (i3.NETZ).
</li>
<li>
Ausarbeitung dieser Studienarbeiten bis zum
Ende des Semesters. Abgabe bei Herrn Klever,
Datum wird noch bekanntgegeben.
</li>
<li>
Benotet wird der XML-Anteil Ihrer
Studienarbeiten sowie die erfolgreiche
Durchführung der Praktikumsübungen.
</li>
</ul>
<li>Ziel</li>
<ul>
<li>
Eigenständiges Erarbeiten eines neuen
Themenkomplexes
</li>
<li>Eigenständiges Lösen von Problemen</li>
<li>
Erste Erfahrungen in der
"Netz-Programmierung" sammeln
</li>
</ul>
</ul>
</slide>
<slide>
<title>Über dieses Skript</title>
<ul>
<li>
Dieses Skript wurde aus einer XML-Datei
generiert, unter Zuhilfenahme des Tools
<a href="http://dret.net/projects/xslidy/">
XSLidy
</a>
von
<a href="http://dret.net/netdret/">
Erik Wilde
</a>
.
</li>
<ul>
<li>
Es besteht aus einer Reihe von
<a
href="http://www.w3.org/Talks/Tools/Slidy/">
Slidy
</a>
Präsentationen, die alle aus einer Quelle
erzeugt werden.
</li>
<li>
Auf der Seite
<code>
<a href="./toc.html">toc.html</a>
</code>
sehen Sie eine knappe Inhaltsübersicht der
<a href="./">Webseite zu diesem Kurs</a>
.
</li>
<li>
Ein Tastendruck auf
<code>a</code>
zeigt Ihnen alle Seiten des Skripts. Diese
können Sie dann ausdrucken.
</li>
<li>
Es gibt keine PDF-Version dieses Skripts.
</li>
</ul>
<li>Als Quellen für dieses Skript dienten</li>
<ul>
<li>
Die
<a
href="http://dret.net/lectures/xml-fall07/">
XML-Vorlesung
</a>
von
<a href="http://dret.net/netdret/">
Erik Wilde
</a>
</li>
<li>
Die
<a
href="http://www.jeckle.de/vorlesung/xml/">
XML-Vorlesung
</a>
von
<a href="http://www.jeckle.de/">
Mario Jeckle
</a>
</li>
</ul>
</ul>
</slide>
<slide>
<title>Nützliches</title>
<ul>
<li>Werkzeuge</li>
<ul>
<li>
XML Editoren, z.B.
<ul>
<li>
Der XML Editor der
<a href="http://www.eclipse.org/">
IDE Eclipse
</a>
: Eclipse XML Editors and Tools, als
Teil der
<a
href="http://www.eclipse.org/webtools/">
Eclipse Web Tools Platform
</a>
(
<a
href="http://download.eclipse.org/webtools/downloads/">
Zum Download
</a>
)
</li>
<li>
<a
href="http://xml-copy-editor.sourceforge.net/">
XML Copy Editor
</a>
(frei verfügbarer Editor mit
Schemavalidierung und
XSLT-Unterstützung)
</li>
<li>
<a href="http://www.altova.com/">
Altova XML Spy
</a>
(freie Version ohne
Schemavalidierung zum Download
verfügbar, an der Hochschule in
Vollversion vorhanden)
</li>
</ul>
</li>
<li>
XSLT Prozessor, z.B.
<a href="http://www.saxonica.com/">Saxon</a>
</li>
<li>
XQuery Prozessor, z.B.
<a href="http://www.saxonica.com/">Saxon</a>
</li>
</ul>
</ul>
</slide>
<slide>
<title>Weiterführende Links</title>
<ul>
<li>
Das
<a href="http://www.w3.org/">
<em>World Wide Web Consortium (W3C)</em>
</a>
</li>
<ul>
<li>
die Organisation, die unter anderem XML
erfunden hat
</li>
<li>
und auch all die anderen Techniken, die in
diesem Kurs behandelt werden.
</li>
</ul>
<li>
Die
<a href="http://www.edition-w3c.de/">
Übersetzungen der W3C-Standards ins Deutsche
</a>
</li>
<ul>
<li>
initiiert und zusammengetragen von
<a href="http://www.mintert.com/">
Stefan Mintert
</a>
</li>
</ul>
<li>
Die
<a href="http://xml.coverpages.org/">
XML Cover Pages
</a>
von Robin Cover
</li>
<ul>
<li>
stets aktuelle gehaltene Seite mit
Nachrichten und neuesten Entwicklungen im
XML-Bereich
</li>
<li>
nicht nur Hype, sondern durchaus kritische
Betrachtung mancher Entwicklungen
</li>
</ul>
</ul>
</slide>
</part>
<part>
<title>Was ist XML - Struktur der Vorlesung</title>
<slide>
<title>
Was sagt die Presse? - frühe Definitionsversuche
</title>
<ul>
<li>
<q>
XML schickt sich an in die Fußstapfen von
HTML zu treten
</q>
(Aus: c't 10/2000, p. 200)
</li>
<li>
<q>
Das Datenformat [XML] erleichtert den
Informationsaustausch zwischen vernetzten
Computern
</q>
(Aus: DER SPIEGEL, 2000-06-19)
</li>
<li>
<q>Alle Dokumente sind gleich</q>
(Aus: SZ, 1999-02-16)
</li>
<li>
<q>Ein digitales Esperanto für das Internet</q>
(Aus: Die Welt, 2000-10-07)
</li>
<li>
<q>
Sortieren statt Stottern -
Programmiersprache HTML stößt an ihre
Grenzen, XML ist kommender Code im Netz
</q>
(Aus: SZ, 2000-01-11)
</li>
<li>
<q>
Sinnliche Suchmaschine [...] existierende
Systeme wie [...] XML
</q>
(Aus: DER SPIEGEL, 2000-06-07)
</li>
<li>
<q>Streit um Programmiersprache XML</q>
(Aus: F.A.Z., 2001-07-26)
</li>
<li>
<q>
Netzwerktechnik versagt oft bei Angriffen
via XML
</q>
(Aus: Computerzeitung, 2002-08-26)
</li>
</ul>
</slide>
<slide>
<title>Vorlesungsstruktur (1/3)</title>
<!-- Block 1 -->
<ul>
<li>1. Von Dokumenten und Daten</li>
<ol>
<li>Einführung</li>
<li>
XML-Dokumente / Wohlgeformtheit
(Strukturelle Grundkonzepte auf Basis des
<a
href="http://www.w3.org/TR/xml-infoset/">
<em>XML Information Set</em>
</a>
)
</li>
<li>XML Namensräume</li>
<li>Grammatik eines XML Dokuments</li>
<ol>
<li>Dokument-Typ-Definitionen (DTD)</li>
<li>XML Schemasprachen</li>
</ol>
</ol>
</ul>
</slide>
<slide>
<!-- Block 2 -->
<title>Vorlesungsstruktur (2/3)</title>
<ul>
<li>
2. Anwendungen der XML im praktischen Einsatz /
Programmierung
</li>
<ol>
<li>Die Simple API for XML (SAX)</li>
<li>Das Document Object Model (DOM)</li>
</ol>
</ul>
</slide>
<!-- Block 3 -->
<slide>
<title>Vorlesungsstruktur (3/3)</title>
<ul>
<li>
3. XML-Standards und weiterführende Anwendungen
</li>
<ol>
<li>Die Lokatorsprache XPath</li>
<li>
Der erste Schritt zum Semantic Web: Das
Resource Description Framework (RDF) und
Really Simple Syndication (RSS)
</li>
<li>
Transformation von XML-Dokumenten: XSL
Transformation
</li>
<li>Formulare für das Web: XForms</li>
<li>
Nahtlose Integration von XML und Hochsprache
- Java Architecture for XML Binding (JAXB)
</li>
<li>Multimedia im Web: SVG und SMIL</li>
</ol>
</ul>
</slide>
</part>
<part>
<title>Von Dokumenten und Daten - eine Einführung</title>
<slide>
<title>Kleine Geschichte der XML</title>
<p>
Es haben im Grunde zwei Entwicklungen zur Entstehung
der XML geführt. Zum einen stellt sie eine
Weiterentwicklung generischer Auszeichnungssprachen
wie der SGML dar, zum anderen hatte die Entwicklung
des World Wide Web starken Einfluß auf ihre
Entstehung.
</p>
<p />
<p>Aber gehen wir das ganze chronologisch an...</p>
</slide>
<slide>
<title>Auszeichnungssprachen</title>
<img
style="margin : 0% ; height : 20% ; position: absolute; top:0px; right: 25px"
src="Korrektur.jpg" />
<p>Was sind Auszeichnungssprachen?</p>
<p>
Auszeichnungssprachen beschreiben Information näher,
d.h. sie sagen etwas über den Charakter der
Information aus. Es handelt sich also um Information
über Information, sog.
<em>Metainformation</em>
.
</p>
<ul>
<li>
Informationen über den Inhalt, die nicht
Bestandteil des Dokumentinhalts sind. Sie sind
für den Leser unsichtbar.
</li>
</ul>
<p>
Beispiele: Korrekturfahnen bei Schulaufsätzen,
Buchdruck (Hinweise zu Fettdruck, etc.)
</p>
</slide>
<slide>
<title>Hypertext</title>
<img
style="margin : 0% ; width : 10% ; position: fixed; right:25px; top: 25px; float:right; "
src="img_m.gif" />
<p>
Erste Ideen zum Konzept Hypertext gab es bereits um
das Jahr 1950.
</p>
<ul>
<li>
Vannevar Bush beschreibt in seinem Artikel
<em>
<a
href="http://www.w3.org/History/1945/vbush/vbush-all.shtml">
As We May Think
</a>
</em>
aus dem Jahr 1945 ein für die damalige Zeit
futuristisches System
<em>Memex</em>
. Motivation für Bush ist die Frage, wie die
Unmenge des über Jahrtausende gesammelten
Wissens leichter zugänglich gemacht werden kann.
<br />
Sein fiktives System Memex basiert auf Mikrofilm
und erlaubt es dem Benutzer, beliebige Medien
wie Bücher, Zeitschriften, handschriftliche
Notizen, Fotografien, etc. zu archivieren, zu
annotieren sowie sich anhand selbst definierter
Pfade durch die gespeicherte Information zu
bewegen.
</li>
</ul>
</slide>
<slide>
<title>Hypertext</title>
<p>
Bush's Lösung des Problems "schneller Zugang zu
gesuchter Information":
</p>
<ul>
<li>
Verwendung von mechanisierten assoziativen
Verweisen (sogenannten
<em>trails</em>
) statt herkömmlicher Indizierung (alphabetisch
oder numerisch).
</li>
<li>
Die Verwendung von Verweisen lehnt sich an das
menschliche Denken an (Gehirn arbeitet mit
Assoziationen).
</li>
<li>
Verweise in Lexika sind ein erster Ansatz, haben
aber Unzulänglichkeiten (Verlassen des
Informationspfads für neue Suche, fehlende
Mechanisierung, starke Beschränkung verwendeter
Quellen).
</li>
</ul>
</slide>
<slide>
<title>Hypertext</title>
<img
style="margin : 0% ; width : 4% ; position: fixed; right:25px; top: 25px; float:right; "
src="Xanadu-Logo.png" />
<p>
1960 gründet
<a href="http://www.xanadu.com.au/ted/">
Ted Nelson
</a>
das
<em>
<a href="http://www.xanadu.com/">
XANADU Projekt
</a>
</em>
und prägt den Begriff des
<em>Hypertext</em>
.
</p>
<ul>
<li>
Nicht sequentielles Schreiben ("non-sequential
writing")
</li>
<li>
Stets gültige Verweise zwischen verschiedenen
Dokumenten
</li>
<li>
Koexistenz "paralleler" Dokumente (z.B.
verschiedene Versionen eines Dokuments,
Übersetzungen)
</li>
<li>Direkter Dokumentvergleich am Bildschirm</li>
<li>Annotation des Textes</li>
<li>
Einbindung von Teilen anderer Dokumente, "Pay
Per View"-Gedanke
</li>
<li>
Xanadu wurde seither aufgrund seiner Konplexität
und seines Universalanspruchs jedoch nie
vollständig implementiert
</li>
</ul>
</slide>
<slide>
<title>Hypertext (Zusammenfassung)</title>
<ul>
<li>
Hauptideen:
<ul>
<li>
Nichtlineares Schreiben und
Durcharbeiten von Texten
</li>
<li>
Trennung von Inhalt und Präsentation
</li>
</ul>
</li>
<img
style="margin : 0% ; width : 7% ; position: absolute; right:50px; float:left; "
src="Knoten-Anker-Netz.png" />
<li>Begriffe:</li>
<ul>
<li>
Verweis (Link):Eine Verbindung von einer
Ressource zu einer anderen.
</li>
<li>Anker: Die beiden Enden eines Links.</li>
<li>Knoten: Eine Informationseinheit.</li>
<li>
Netz: Eine Menge von Knoten, die mit Hilfe
von Verweisen miteinander verknüpft sind.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Beginnende technische Unterstützung</title>
<p>
In den 60er Jahren begann die technische
Unterstützung der Hypertext-Idee mit dem Aufkommen
der ersten Rechenanlagen.
</p>
<p>
Die damals gewohnten, grafischen Symbole zur
Textauszeichnung waren auf den Rechenanlagen nicht
verfügbar, man mußte sich nach einer Alternative
umsehen. Die Lösung waren beschreibende textuelle
Pendants wie etwa
<code>Überschrift</code>
.
</p>
<p>
<u>Wichtiges Konzept:</u>
<br />
<ul>
<li>
semantische Beschreibung des Inhalts statt
Formatierungsangaben!
</li>
<li>
Auszeichnung unabhängig von der (späteren)
Formatierung des Textes
</li>
</ul>
</p>
</slide>
<slide>
<title>Von GML zu HTML</title>
<ul>
<li>
1969: Goldfarb, Mosher und Loire entwickeln bei
IBM die
<em>Generalized Markup Language (GML)</em>
.
</li>
<li>
Weiterentwicklung zur
<em>Standard GML (SGML)</em>
:
<ul>
<li>
erste sogenannte
<em>Metasprache</em>
, d.h. die SGML erlaubt die Definition
von anderen Sprachen
<note>
<em>Meta-</em>
drückt in Bildungen mit Substantiven
aus, dass sich etw. auf einer
höheren Stufe, Ebene befindet,
darüber geordnet ist oder hinter
etw. steht: Metamarketing, -theorie.
© Duden - Deutsches
Universalwörterbuch 2001
</note>
</li>
<li>kein festes, definiertes Vokabular</li>
<li>
stattdessen zahlreiche Konstrukte zur
Definition von Grammatiken
</li>
<li>
Standardisierung der SGML durch die ISO
</li>
</ul>
</li>
<li>
Begriffsklärung "Einsatz der SGML"
<ul>
<li>
bedeutet eigentlich, daß mit Hilfe der
SGML eine auf SGML basierende Sprache
entwickelt wird, d.h. die Grammatik für
diese erstallt wird
</li>
<li>
im Volksmund jedoch synonym mit dem
Einsatz einer auf SGML basierenden
Sprache, einer sogenannten
<em>Anwendung der SGML</em>
, gebraucht.
</li>
</ul>
</li>
</ul>
</slide>
<slide>
<title>Von GML zu HTML</title>
<img
style="margin : 0% ; width : 9% ; position: fixed; right:25px; top: 25px; float:right; "
src="screenshot-first-browser_2.gif" />
<ul>
<li>
Beginnend Mitte der 80er Jahre:
<em>
<a
href="http://www.w3.org/People/Berners-Lee/">
Tim Berners-Lee
</a>
</em>
entwickelt am schweizer Kernforschungszentrum
<em>
<a href="http://www.cern.ch/">CERN</a>
</em>
eine vereinfachte Sprache zur Auszeichnung von
Dokumenten, die
<em>
<a href="http://www.w3.org/html/">
Hypertext Markup Language (HTML)
</a>
</em>
(basierend auf SGML). Motivation: vereinfachter
rechnergestützter Austausch von Dokumenten.
</li>
<li>
Er berücksichtigt hierbei die Konzepte des
Hypertext.
</li>
<li>
Entwicklung des Konzeptes
<em>Uniform Resource Locator (URL)</em>
als eindeutiger Identifikator (eindeutige
Adresse) für beliebige Inhalte.
</li>
<li>
Damit einher ging die Entwicklung des
<em>Hypertext Transfer Protocol (HTTP)</em>
.
</li>
<li>
Berners-Lee schlägt im Jahre 1989 mit
<a
href="http://www.w3.org/History/1989/proposal.html">
Information Management: A Proposal
</a>
dem CERN Management ein auf SGML basierendes
Hypertextsystem zum Austausch von Dokumenten
vor.
</li>
<li>
Im Jahre 1990 schrieb Berners-Lee den ersten
Web-Server und Web-Client, den WorldWideWeb
Browser (später umbenannt in Nexus).
</li>
</ul>
</slide>
<slide>
<title>Weiterentwicklung der HTML - Browser War</title>
<ul>
<li>
In den folgenden Jahren wurde das Web immer
stärker für den kommerziellen Gebrauch
erschlossen.
</li>
<li>
Es entstehen unterschiedliche Erweiterungen der
HTML, initiiert durch die beiden großen
Browser-Hersteller
<a href="http://www.microsoft.com/">
Microsoft
</a>
und
<a href="http://browser.netscape.com/">
Netscape
</a>
.Angetrieben von der Motivation, den eigenen
Browser zu stärken (
<em>Browser War</em>
), entstanden durch diese stark proprietären
Erweiterungen inkompatible HTML-Abwandlungen.
</li>
</ul>
</slide>
<slide>
<title>
Weiterentwicklung der HTML - semantische
Sprachanteile
</title>
<p>
Zunehmend wurden in die HTML immer mehr semantisch
auszeichnende Elemente aufgenommen.
</p>
<ul>
<li>
Zunächst wurde der Inhalt eines Dokuments rein
darstellungsorientiert ausgezeichnet:
<ul>
<li>
<code>b</code>
für Fettdruck
</li>
<li>
<code>u</code>
für Unterstreichung
</li>
<li>
<code>i</code>
für kursive Schrift
</li>
</ul>
</li>
<li>
Später begann man, die Bedeutung (semantik) des
Dokumentinhalts auszuzeichnen:
<ul>
<li>
<code>strong</code>
für stark hervorgehobenen, betonten Text
</li>
<li>
<code>acronym</code>
zur Auszeichnung von Abkürzungen
</li>
<li>
<code>address</code>
für Adressen
</li>
</ul>
</li>
</ul>
</slide>
<slide>
<title>
Weiterentwicklung der HTML - Problem Semantik
</title>
<p>
Die Einführung semantischer Elemente in die HTML
barg verschiedene Problematiken.
</p>
<ul>
<li>
Präsentationsorientierte Auszeichnung stellt
Benutzer der Sprache irgendwann zufrieden.
</li>
<li>
Semantische Auszeichnung ist nie ausreichend!
</li>
<li>
Gefahr, daß die Menge der Elemente ins
unendliche wächst.
</li>
<li>
Schwierigkeit der Definition, Abstimmung und
Verabschiedung der Bedeutung der einzelnen
Elemente.
</li>
</ul>
<p>
Semantik in der HTML war zum Scheitern verurteilt.
</p>
</slide>
<slide>
<title>SGML für das Web</title>
<p>
Das 1994 gegründete World Wide Web Consortium, das
seitdem für die Weiterentwicklung und
Standardisierung der HTML verantwortlich zeichnet,
suchte nach einer besseren Lösung zur semantischen
Auszeichnung von Dokumentinhalten.
</p>
<ul>
<li>
Rückgriff auf SGML als die Wurzel der HTML (wir
erinnern uns: HTML ist eine Anwendung der SGML)
</li>
<li>
Eine Untermenge der SGML wurde als
<em>
<a
href="http://www.w3.org/TR/1998/REC-xml-19980210">
eXtensible Markup Language (XML) 1.0
</a>
</em>
als Vorschlag (Recommendation) vom W3C
verabschiedet.
</li>
<li>
Jedes XML-Dokument ist ein gültiges
SGML-Dokument.
</li>
</ul>
</slide>
<slide>
<title>Die Entwicklungsziele für XML</title>
<ol>
<li>
Einfache Nutzung im Internet (im Gegensatz zur
SGML als offline Dokumentationsformat)
</li>
<li>
Unterstützung eines breiten Anwendungsspektrums
(mehr als nur technische Dokumentation, wofür
die SGML hauptsächlich genutzt wurde)
</li>
<li>
Kompatibilität zur SGML (XML als echte
Untermenge von SGML kann durch SGML Tools
verarbeitet werden)
</li>
<li>
Einfache Applikationsentwicklung (Untermenge XML
erlaubt einfachere Entwicklung von
verarbeitenden Applikationen)
</li>
<li>
Minimierung optionaler Sprachmerkmale
(Komplexitätsreduktion führt zu einfacherer
Benutzbarkeit und einfachere
Applikationsentwicklung)
</li>
<li>Lesbarkeit (für Mensch und Maschine)</li>
<li>
Kompakte Spezifikation (600 Seiten SGML
Spezifikation gegeüner 30 Seiten
XML-Spezifikation)
</li>
<li>
Formaler und präziser Sprachentwurf
(XML-Sprachentwurf sollte leicht, schnell und
eindeutig in Werkzeuge implementierbar sein und
damit von Anwendern schnell akzeptiert werden.)
</li>
<li>
Leichte Dokumenterstellung (ohne spezielle
Werkzeuge möglich)
</li>
<li>
Nicht notwendigerweise knappes Markup
(Auszeichnung in Textnotation im Fokus,
Binärrepräsentation jedoch möglich.)
</li>
</ol>
</slide>
<slide>
<title>XML in 10 Punkten</title>
<p>
Das W3C hat eine plakative Kurzcharakterisierung
<a
href="http://www.w3c.de/Misc/XML-in-10-points.html">
XML in 10 Punkten
</a>
veröffentlicht, die als Abschluß unserer Einführung
dienen soll.
</p>
<ol>
<li>
XML steht für strukturierte Daten:
<br />
XML ist ein Satz an Regeln für die Erstellung
von Textformaten zur Strukturierung von Daten.
XMl ist datenorientiert, nicht
präsentationsorientiert. XML ist keine
Programmiersprache und man kann es auch als
Nicht-Programmierer anwenden und lernen. XML ist
erweiterbar und plattformunabhängig.
</li>
<li>
XML sieht ein wenig wie HTML aus:
<br />
Aufgrund der Verwandtschaft zur SGML ähneln sich
die beiden Sprachen syntaktisch. Wie HTML
verwendet XML Tags (durch
<code><</code>
und
<code>></code>
geklammerte Wörter). In der HTML sind jedoch die
Bedeutung der Tags und Attribute festgelegt, in
der XML werden diese nur zur Abgrenzung der
Daten verwendet. Die Interpretation obliegt
allein der verarbeitenden Anwendung.
</li>
<li>
XML ist Text, aber nicht zum Lesen:
<br />
Primärer Zweck des Einsatzes der XML ist der
Datenaustausch zwischen Maschinen. Menschen
können die XML sicherlich lesen, sollten dies
aber eigentlich nicht tun (nur im "Notfall" oder
wenn sie die XML lernen ;-) )
</li>
<li>
XML ist vom Design her ausführlich:
<br />
Gemeint ist, daß XML ein verboses
(=geschwätziges) Format ist. Das W3C
argumentiert, daß heute Speicherplatz günstig
ist wie noch nie und Komprimierungsverfahren
gang und gäbe sind. Dennoch sind XML-Dateien
aufgrund ihrer Textbasiertheit immer größer als
entsprechende Binärformate, dies kann man nicht
abstreiten. Die Verwendung von XML birgt jedoch
so viele Vorteile, daß dieser Nachteil mehr als
ausgeglichen wird.
</li>
<li>
XML ist eine Familie von Techniken:
<br />
Hinter XML steht ein wachsender Satz an Modulen,
die wichtige Aufgaben erledigen. In ihrer
Gesamtheit sind sie sehr mächtig. Dazu gehören
bspw.
<a href="http://www.w3.org/TR/xlink/">XLink</a>
für Hyperlinks in XML-Dokumenten, das
<a
href="http://www.w3.org/TR/xptr-framework/">
XPointer
</a>
Framework für den Zugriff auf Teile eines
XML-Dokuments, die
<a href="http://www.w3.org/TR/xsl/">
Extensible Stylesheet Language (XSL)
</a>
, bestehend aus
<a href="http://www.w3.org/TR/xslt20/">
XSL Transformations (XSLT)
</a>
, einer Sprache zur Transformation von
XML-Dokumenten, und einem XML-Vokabular zur
Spezifizierung von Formatierungsangaben
(Stylesheets) sowie
<a href="http://www.w3.org/TR/xmlschema-1/">
XML Schema, Teil 1
</a>
und
<a href="http://www.w3.org/TR/xmlschema-2/">
Teil 2
</a>
zur genauen Definition der Daten in einem
eigenen XML-basierten Format.
</li>
<li>
XML ist neu, aber nicht so neu:
<br />
XML erhebt nicht den Anspruch, vollkommen neu zu
sein. Vielmehr werden bekannte und erprobte
Konzepte aus der Informatik wiederverwendet und
in einem neuen Verwendungskontext
weiterentwickelt.
</li>
<li>
XML überführt HTML in XHTML:
<br />
XHTML hat gleich viele Elemente wie HTML, die
Syntax ist aber ein wenig unterschiedlich, damit
sie mit den XML-Regeln konform ist. XML löst die
Abhängigkeit der HTML von der SGML auf, HTML
wird auf der Basis von XML neu formuliert.
</li>
<li>
XML ist modular:
<br />
XML erlaubt die Wiederverwendung von Formaten
(Kombination und Weiterbenutzung) für die
Definition eines neuen Formats. Sprachen aus der
XML-Familie können in freier Auswahl zur Lösung
von Problemen verwendet werden.
</li>
<li>
XML ist die Basis für RDF und das Semantic Web:
<br />
Das
<a href="http://www.w3.org/RDF/">
Resource Description Framework (RDF)
</a>
ist eine XML-basierte Sprache, um beliebige
Quellen mit beschreibenden Daten anzureichern.
Das Semantic Web nutzt diese Beschreibungen, um
den sichtbaren Teil des Web mit einem Netz von
Sinnzusammenhängen zu erweitern. Für
Vereinbarungen über diese Sinnzusammenhänge (die
Computer benötigen) werden überdies formale
Beschreibungen, sogenannte
<em>Ontologien</em>
benötigt.
</li>
<li>
XML ist lizenzfrei, plattformunabhängig und gut
unterstützt:
<br />
Zunächst ist XML eine kostenfrei zugängliche
Spezifikation, die ohne Lizenzgebühren in
eigenen Projekten und kommerziellen Produkten
verwendet werden kann. Die Standardisierung in
einem herstellerunabhängigen Gremium ist ein
Versuch sicherzustellen, daß die Unabhängigkeit
von einer bestimmten Plattform gewahrt werden
kann. Zudem gibt es mittlerweile eine beinahe
unüberschaubar große Menge an XML-Tools für die
unterschiedlichsten Einsatzzwecke.
</li>
</ol>
</slide>
<slide>
<title>Weiterführende Links</title>
<ul>
<li>
Stefan Mintert:
<a
href="http://mintert.com/xml/leise-revolution/leise_revolution.html">
Leise Revolution: Die Standard Generalized
Markup Language
</a>
</li>
<li>
<a
href="http://xml.coverpages.org/foottLect08.html">
Tutorial zu SGML
</a>
</li>
</ul>
</slide>
</part>
</presentation>
<presentation id="wohlgeformtheit">
<title short="dokumente-und-wohlgeformtheit">
XML-Dokumente und Wohlgeformtheit
</title>
<date>2008-10-13</date>
<toc id="resources" />
<toc id="abstract">
Nach einer einführenden Übersicht über die einzelnen
Mitglieder der XML-Sprachfamilie werden in diesem Abschnitt
die grundlegenden Strukturelemente der XML und des XML
Information Set eingeführt.
<br />
Sie erfahren, welche Strukturelemente es in der XML gibt und
was die Wohlgeformtheit eines XML-Dokuments bedeutet.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract" />
</p>
</slide>
<part>
<title>Die XML Sprachfamilie</title>
<slide>
<title>Definition XML-Sprache</title>
<p class="definition">
Eine Anwendung der XML wird XML-Sprache genannt. Sie
besteht aus einem Vokabular, das aus Symbolen und
der ihnen zugewiesenen Bedeutung (Semantik) gebildet
wird. Das Vokabular wird durch Regeln ergänzt, die
die Kombination der Elemente aus dem Vokabular
steuern: die grammatikalische Struktur sowie die
Gültigkeitsregeln für den Inhalt (z.B. Datentypen).
<br />
Eine Anwendung einer neu geschaffenen XML-Sprache
<em>L</em>
werden als XML-Dokumente, auch
<em>L</em>
-Dokumente bezeichnet.
</p>
<note>
Beispiele: XHTML-Dokument, SVG-Dokument,
XSL-Dokument
</note>
</slide>
<slide>
<title>Die XML-Sprachfamilie</title>
<img
style="margin : 0% ; width : 4% ; position: absolute; right:25px; top: 25px; float:right; "
src="languageFamily.gif" />
<note>
Die Abbildung markiert farblich alle Standards, zu
denen eine XML Darstellung existiert.
</note>
<ul>
<li>Basis</li>
<ul>
<li>
<a
href="http://www.w3.org/TR/xml-infoset/index.html">
XML Information Set
</a>
, definiert die Grundbausteine und zentralen
Konzepte der XML
</li>
<li>
<a href="http://www.unicode.org/">
Unicode
</a>
, ein Standard zur plattformunabhängigen
Zeichencodierung u.a. internationaler
Zeichensätze
</li>
</ul>
<li>
Dokumenttypdefinitionen (DTDs): Als Untermenge
der SGML definiert, besitzt die XML wie diese
die Möglichkeit der Grammatikdefinition via DTDs
(=eine textbasierte Sprache, um das Vokabular
einer XML-Sprache festzulegen).
</li>
<li>XML selbst</li>
<li>
XML Namensräume (Namespaces): mit ihrer Hilfe
können gleiche Namen von Bezeichnern in einem
Dokument eindeutig voneinander unterschieden
werden. Somit kann jeder, der eine XML-Sprache
definiert, Element- und Attributnamen völlig
frei wählen. Er muß nicht darauf achten, ob sein
Dokument irgendwann einmal mit einem anderen
Dokument kombiniert werden könnte (etwa im
Rahmen einer Syndikatisierung) und dann
Namenskonflikte auftreten könnten.
</li>
<li>
XHTML: eine präsentationsorientierte
Auszeichnungssprache (die
Weiterentwicklung/Neuformulierung der HTML 4.01
aus dem Jahre 1999, die durch das W3C nicht mehr
weiterentwickelt wird).
</li>
<li>
XLink: Verknüpfungsmechanismus zur nichtlinearen
Navigierbarkeit. Erlaubt mehrgliedrige Verweise,
die auf eine Menge von Dokumenten verweisen,
sowie unterschiedliche Verhaltensmuster beim
Verfolgen eines Links. Entspricht dem
Referenzieren einzelner Dokumente in einem
XML-Dokument.
</li>
<li>
XPath: Ermöglicht das extrahieren verschiedener
Information aus einem XML-Dokument:
Knotenmengen, Positionsangaben, Werte, ...
</li>
<li>
XSLT: XML-Sprache zur Umformung von
XML-Dokumenten (eigentlich: Bäumen).
</li>
<li>
XSL-FO: Ein Vokabular, um Formatierungsangaben
für Dokumentstrukturen auszudrücken. Daraus
können wiederum beispielsweise PDF-Dokumente
erzeugt werden.
</li>
<li>
XQuery: Eine SQL-artige algebraische
Anfragesprache für XML-Quellen. Die
XML-Repräsentation von XQuery trägt den Namen
<a href="http://www.w3.org/TR/xqueryx/">
XQueryX
</a>
.
</li>
<li>
RDF verwendet Namensräume als Grundlagen.
Erlaubt die Formulierung und maschinelle
Auswertung von Aussagen über Web Ressourcen
(Prädikatenlogik).
</li>
<li>
XML Schema stellt u.a. ein Typsystem und eine
Vielzahl von Regeln zur Verfügung, damit eine
XML-Sprache genau definiert werden kann.
</li>
<li>
Schema verwendend haben WSDL und SOAP im Bereich
Web Services große Bedeutung erlangt. Mit WSDL
werden die Schnittstellen sowie die
Eigenschaften von Funktionalitäten (=Diensten /
Services) beschrieben, die über
Internetprotokolle zur Verfügung gestellt
werden. SOAP erlaubt die Übertragung von
XML-basierten Nachrichten unabhängig vom
verwendeten Transportprotokoll.
</li>
</ul>
</slide>
</part>
<part>
<title>
Strukturelle Grundkonzepte: Die Extensible Markup
Language (XML) und das XML Information Set (1)
</title>
<slide>
<title>Einführende Definitionen (1/3)</title>
<p class="definition">
XML-Dokument
<br />
Ein XML-Dokument ist ein Datenstrom (der nicht
zwingend als Datei vorliegen muß), der den
Strukturierungsprinzipien (=Wohlgeformtheit) der
Extensible Markup Language genügt.
</p>
</slide>
<slide>
<title>Einführende Definitionen (2/3)</title>
<p class="definition">
XML Information Set
<br />
Die Spezifikation des XML Information Sets definiert
die zentralen Begriffe der XML. Es setzt diese
Begriffe miteinander in Beziehung und definiert so
unabhängig von der Syntax die Struktur eines
XML-Dokumentes.
</p>
</slide>
<slide>
<title>Einführende Definitionen (3/3)</title>
<p class="definition">
XML-Prozessor
<br />
Ein XML-Prozessor ist eine maschinelle Komponente
(typischerweise: Software), die zum Lesen, Speichern
und Verarbeiten eines XML-Dokuments eingesetzt wird.
Er erlaubt Zugriff auf den Inhalt und die Struktur
des XML-Dokuments.
</p>
<note>
Ein XML-Prozessor ist zumeist in Software
implementiert, kann aber auch in Hardware realisiert
sein.
</note>
</slide>
<slide>
<title>Ein erstes XML-Dokument</title>
<p>
Das folgende Listing zeigt ein einfaches
XML-Dokument mit den am meisten verwendeten
Sprachelementen der XML: Element, Attribut, Text.
</p>
<listing
src="erstes-XML-dokument.xml"
line="1-11" />
</slide>
<slide>
<title>
Das Information Set des ersten XML-Dokuments
</title>
<p>
Für jedes XML-Dokument gibt es ein abstraktes
Information Set (auch kurz als "Infoset"
bezeichnet). In ihm sind alle Informationselemente
in Form einer Baumstruktur enthalten.
<br />
Die untenstehende Abbildung gibt einen Auszug der
Knoten aus dem Information Set unseres ersten
XML-Dokuments in einem UML-Diagramm wieder. Die
Knoten sind als Objekte, ihre Eigenschaften als
Attribute dargestellt.
</p>
<img
style="margin : 4% ;"
src="Infoset-erstes-Beispiel.png" />
<listing
src="erstes-XML-dokument.xml"
line="1-11" />
</slide>
<slide>
<title>Ein erstes XHTML-Dokument</title>
<p>
Im folgenden Beispiel ist der Inhalt des ersten
XML-Dokuments als einfache XHTML Seite dargestellt.
<br />
Sprachelemente der XHTML: Titel, Überschriften 1.
und 2. Grades, Absatz.
</p>
<listing src="erstes-XML-dokument-html-beispiel.xml" />
</slide>
<slide>
<title>Die Elemente des Information Set</title>
<ul>
<li>
<b>Document Information Item (Dokument)</b>
</li>
<li>
<b>Element Information Item (Element)</b>
</li>
<li>
<b>Attribute Information Item (Attribut)</b>
</li>
<li>
<b>Character Information Item (Zeichen)</b>
</li>
<li>
<b>Comment Information Item (Kommentar)</b>
</li>
<li>
<b>
Document Type Declaration Information Item
(DTD-Deklaration)
</b>
</li>
<li>
<b>
Namespace Declaration Information Item
(Namensraum-Deklaration)
</b>
</li>
<li>Processing Instruction Information Item</li>
<li>Notation Information Item</li>
<li>
Unexpanded Entity Reference Information Item
</li>
<li>Unparsed Entity Information Item</li>
</ul>
</slide>
<slide>
<title>Document Information Item (Dokument)</title>
<ul>
<li>
Jedes Information Set hat genau ein Document
Information Item
</li>
<li>Rahmen des XML-Dokuments</li>
<li>
enthält Informationen, die das gesamte Dokument
betreffen
</li>
<ul>
<li>
geordnete Liste von
<em>Kindknoten</em>
</li>
<ul>
<li>
darunter genau ein
<code>Element Information Item</code>
, nämlich das Wurzelelement des
Dokuments (auch
<em>Document Element</em>
genannt).
</li>
<li>
<code>
Processing Instruction Information
Item
</code>
s, für alle Processing Instructions, die
außerhalb des Wurzelelements definiert
sind. Processing Instructions geben
einem XML-Prozessor Informationen zur
Verarbeitung des Dokuments.
</li>
<li>
<code>Comment Information Item</code>
s für Kommentare außerhalb des
Wurzelelements.
</li>
</ul>
<li>
<em>Document Element</em>
: Der Wurzelknoten des Dokuments als
<code>Element Information Item</code>
</li>
<li>
<em>Notations</em>
: eine ungeordnete Menge von
<code>Notation Information Items</code>
, die in einer DTD des Dokuments (sofern
vorhanden) definiert wurden.
</li>
<li>
<em>Unparsed Entities</em>
: eine ungeordnete Menge von
<code>
Unparsed Entity Information Items
</code>
. Ein Parser ist ein Programm, das eine
Syntaxanalyse eines Eingabestroms ausführt.
Entities kann man einfach umschreiben als
"Kürzel", diese Kürzel werden vom Parser
dann durch einen definierten Wert ersetzt.
Nicht geparste Entitäten sind Informationen,
die nicht durch den Parser analysiert
werden, da sie üblicherweise nicht im
XML-Format vorliegen (z.B. Binärdaten).
</li>
<li>
<em>Base URI</em>
: Eine URI (zur
<a
href="http://www.ietf.org/rfc/rfc2396.txt?number=2396">
entsprechenden Spezifikation, RFC 2396
</a>
)
</li>
<li>
<em>Character Encoding Scheme</em>
: Die Zeichenkodierung (z.B.
<code>ISO-8859-1</code>
,
<code>ISO-2022-JP</code>
,
<code>UTF-8</code>
), in der das Dokument gehalten ist (zur
<a
href="http://www.iana.org/assignments/character-sets">
Liste international standardisierter
Zeichenkodierungen
</a>
). Der Wert wird aus dem XML-Prolog des
Dokuments übernommen.
</li>
<li>
<em>Standalone</em>
: Legt fest, ob es externe
Markup-Deklarationen gibt, die Einfluß auf
das XML-Dokument haben, bevor es vom Parser
an eine Applikation übergeben wird.
Beispiel: vordefinierte
default-Attributwerte. Der Wert wird aus dem
XML-Prolog des Dokuments übernommen.
</li>
<li>
<em>Version</em>
: Die verwendete XML-Version (1.0 oder 1.1).
Der Wert wird aus dem XML-Prolog des
Dokuments übernommen.
</li>
<li>
<em>All Declarations Processed</em>
: Diese Eigenschaft ist streng genommen
nicht Bestandteil des Infoset.Der Boole'sche
Wert zeigt an, ob der verarbeitende
Prozessor die gesamte DTD gelesen hat.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Der XML-Prolog</title>
<ul>
<li>erste Zeile in einem XML-Dokument.</li>
<li>
in der XML 1.0 optional, in der XML 1.1
hingegend zwingend vorgeschrieben
</li>
</ul>
<listing
src="erstes-XML-dokument.xml"
line="1" />
<ul>
<li>
Die Angabe der verwendeten XML-Version ist
zwingend. Für XML 1.0 ist der Wert
<code>1.0</code>
anzugeben, für XML 1.1 entsprechend
<code>1.1</code>
.
</li>
<li>
Optional folgt die Angabe der im Dokument
verwendeten Zeichenkodierung. Hierbei wird
empfohlen, daß nur bei der
<a href="http://www.iana.org/">
Internet Assigned Numbers Authority (IANA)
</a>
als Zeichensatz registrierte Zeichenkodierungen
verwendet werden. Andere Kodierungen sollen
durch das einführende Präfix
<code>x-</code>
im Namen kenntlich gemacht werden.
</li>
<li>
Ebenfalls optional folgt hierauf die Standalone
Document Declaration.
</li>
</ul>
</slide>
<slide>
<title>
Document Information Item - Beispiel XHTML Dokument
</title>
<p>
Das Document Information Item des ersten XHTML
Beispiels beinhaltet folgende Informationen
</p>
<ul>
<li>
Das Element Information Item
<code>html</code>
als Wurzelelement des Dokuments
</li>
<li>
Das gleiche Element Information Item als
einziges Element einer
<em>geordneten Reihe von Kindknoten</em>
</li>
<li>Die in der XHTML DTD definierten Notations</li>
<li>
Die Basis URI des Dokuments:
<code>
http://www.barbara-zengler.de/vorlesung/erstes-XML-dokument-html-beispiel.xml
</code>
.
</li>
<li>
Die im Dokument verwendete Zeichenkodierung:
<code>UTF-8</code>
</li>
<li>
Standalone:
<code>no</code>
, denn es gibt eine DTD zu diesem Dokument, die
eventuell Vorbelegungen für Attributwerte
definiert.
</li>
<li>
Die im Dokument verwendete XML-Version
<code>1.0</code>
</li>
</ul>
<listing src="erstes-XML-dokument-html-beispiel.xml" />
</slide>
<slide>
<title>Automatische Zeichensatzerkennung (1/2)</title>
<ul>
<li>
Bevor ein XML-Prozessor die
XML-Encoding-Deklaration in einem Dokument
überhaupt erst lesen kann, muß er wissen, welche
Zeichenkodierung verwendet wird. Genau das aber
wird erst in der Deklaration mitgeteilt. Hier
"beißt sich die Katze in den Schwanz".
</li>
</ul>
<listing
src="XML-Grammatik.txt"
line="3" />
<ul>
<li>Ausweg durch automatische Zeichenerkennug.</li>
<lI>
XML Prozessoren versuchen, anhand der ersten
bekannten fünf Zeichen (Position und Inhalt der
Zeichen ist festgelegt!) den Zeichensatz des
Dokuments zu erkennen.
</lI>
<li>
Die Wahrscheinlichkeit, daß dies funktioniert,
ist relativ hoch.
</li>
<note>
Man geht davon aus, daß XML-Prozessoren nicht
alle möglichen Kodierungen verstehen sondern nur
eine begrenzte Menge davon.
</note>
</ul>
</slide>
<slide>
<title>Automatische Zeichensatzerkennung (2/2)</title>
<ul>
<li>
Die folgenden Zeilen zeigen einen Auszug aus der
XML-Grammatik, notiert in einer erweiterten
Backus-Naur-Form (EBNF)
</li>
</ul>
<listing
src="XML-Grammatik.txt"
line="1-11" />
<ul>
<li>
<code>A*</code>
: Null oder mehrere Vorkommen von A
</li>
<li>
<code>A?</code>
: A oder nichts (optional A)
</li>
<li>
<code>A|B</code>
: A oder B
</li>
<li>
<code>A+</code>
: Ein oder mehrere Vorkommen von A
</li>
</ul>
</slide>
<slide>
<title>Unicode</title>
<ul>
<li>
Unicode ist ein Industriestandard, um
verschiedene Alphabete und grafische Zeichen
darzustellen.
</li>
<li>
Drei verschiedene Codierungsformate: UTF-8,
UTF-16 und UTF-32
</li>
<li>
UTF-8: byteorientierte Version des
Unicode-Standards mit variabler Codierungslänge.
Die bekannten ASCII-Zeichen liegen werden mit
den ersten 8 Bit dargestellt und benötigen so
wenig Speicherplatz.
</li>
<li>
UTF-16: in 16 Bit codiert, ermöglicht dieser
Standard unter Zuhilfenahme sogenannter
"Surrogate" die Codierung von 1.114.111 Zeichen.
Variable Codierungslänge.
</li>
<li>
UTF-32: mit einer festen Breite von 32 Bit
erhöhrt UTF-32 den für ein Dokument benötigten
Speicherplatz, erleichtert jedoch die
Implementierung der Zeichencodierung und
-decodierung.
</li>
</ul>
</slide>
<slide>
<title>
Platzbedarf der verschiedenen Codierungsformate
</title>
<p>
Nachstehende Tabelle zeigt einen Überblick über den
Platzbedarf des Zeichens
<code>A</code>
in den verschiedenen Codierungsformaten, sowie die
Größe der Beispieldate in Byte
</p>
<table
border="1"
cellpadding="20">
<tr>
<th
align="left"
valign="middle">
Codierung
</th>
<th
align="left"
valign="middle">
Bitbreite
</th>
<th
align="left"
valign="middle">
Binärdarstellung
</th>
<th
align="left"
valign="middle">
Größe der Beispieldatei in Byte
</th>
<th
align="left"
valign="middle">
Bemerkung
</th>
</tr>
<tr>
<td>erweitertes ASCII (Latin-1), ISO-8859-1</td>
<td>8</td>
<td>
<code>0100 0001</code>
</td>
<td>266</td>
<td>
(
<code>encoding="ISO-8859-1"</code>
)
</td>
</tr>
<tr>
<td>UTF-8</td>
<td>>=8</td>
<td>
<code>0100 0001</code>
</td>
<td>266</td>
<td>
(
<code>encoding="UTF-8"</code>
) keine Byte Order Mark
</td>
</tr>
<tr>
<td>UTF-16</td>
<td>>=16</td>
<td>
<code>0100 0001 0000 0000</code>
</td>
<td>532</td>
<td>
(
<code>encoding="UTF-16"</code>
) keine Byte Order Mark
</td>
</tr>
<tr>
<td>UTF-32</td>
<td>32</td>
<td>
<code>
0100 0001 0000 0000 0000 0000 0000 0000
</code>
</td>
<td>1.064</td>
<td>
(
<code>encoding="UTF-32"</code>
) keine Byte Order Mark
</td>
</tr>
</table>
</slide>
<slide>
<title>Mimik der UTF-8 Codierung</title>
<p>
Die Nachfolgende Tabelle zeigt die Anwendung der
UTF-8 Kodierung
</p>
<table
border="1"
cellpadding="20">
<tr>
<th>Unicode-Bereich</th>
<th>Bitbelegung</th>
</tr>
<tr>
<td>
<code>U-00000000 - U-0000007F</code>
:
</td>
<td>
<code>0xxxxxxx</code>
</td>
</tr>
<tr>
<td>
<code>U-00000080 - U-000007FF</code>
:
</td>
<td>
<code>110xxxxx 10xxxxxx</code>
</td>
</tr>
<tr>
<td>
<code>U-00000800 - U-0000FFFF</code>
:
</td>
<td>
<code>1110xxxx 10xxxxxx 10xxxxxx</code>
</td>
</tr>
<tr>
<td>
<code>U-00010000 - U-001FFFFF</code>
:
</td>
<td>
<code>
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
</code>
</td>
</tr>
<tr>
<td>
<code>U-00200000 - U-03FFFFFF</code>
:
</td>
<td>
<code>
111110xx 10xxxxxx 10xxxxxx 10xxxxxx
10xxxxxx
</code>
</td>
</tr>
<tr>
<td>
<code>U-04000000 - U-7FFFFFFF</code>
:
</td>
<td>
<code>
1111110x 10xxxxxx 10xxxxxx 10xxxxxx
10xxxxxx 10xxxxxx
</code>
</td>
</tr>
</table>
</slide>
<slide>
<title>Wahl des Codierungsformats in der Praxis</title>
<ul>
<li>
Die Wahl des Codierungsformats hat Einfluß auf
die Dateigröße.
</li>
<li>
Umlaute werden in UTF-8 mit 16 Bit dargestellt.
</li>
<li>Für die Praxis: guten Kompromiß finden.</li>
<li>
Für Dokumente im deutschen Sprachraum hat sie
die Verwendung von
<code>ISO-8859-1</code>
(latin-1) eingebürgert. Problem: Dieser
Zeichensatz unterstützt nicht das Euro-Symbol.
Erst eine aktualisierte Version des
Zeichensatzes mit dem Namen
<code>ISO-8859-1</code>
hat das Eurozeichen mit an Bord.
</li>
<li>
Bei zumeist ASCII Zeichen und nur vereinzelten
Sonderzeichen: UTF-8 (flexibel!).
</li>
<li>
Bei überwiegend Nicht-ASCII-Zeichen (z.B.
russische, chinesische, arabische Dokumente)
besser UTF-16
</li>
</ul>
</slide>
<slide>
<title>Beispiel arabisches Dokument</title>
<p>
Auf dieser Seite sehen Sie ein arabisches Dokument,
das die unterschiedlichen Dateigrößen je nach
gewähltem Codierungsformat noch einmal
veranschaulichen soll.
</p>
<ul>
<li>UTF-8-Codierung: 1299 Byte</li>
<li>UTF-16-Codierung: 966 Byte</li>
</ul>
<img
style="margin : 4% ;"
src="arabicDocument.gif" />
</slide>
<slide>
<title>Element Information Item</title>
<ul>
<li>
Für jedes Element in einem XML-Dokument gibt es
ein Element Information Item
</li>
<li>
Ein Element aus dieser Menge entspricht der
<em>Document Element</em>
-Eigenschaft des
<code>Document Information Item</code>
, es entspricht dem Wurzelknoten des Dokuments.
</li>
<li>
Auf alle anderen
<code>Element Information Item</code>
s eines Dokuments kann zugegriffen werden, indem
rekursiv die
<em>Kindknoten</em>
besucht werden.
</li>
<ul>
<li>
geordnete Liste von
<em>Kindknoten</em>
(keine Attribute!)
</li>
<li>
<em>Namespace Name</em>
: die Identifikation des Namensraums, in dem
sich das Element befindet.
</li>
<li>
<em>Lokaler Name</em>
: entspricht dem (um Namensraumkürzel und
trennenden Doppelpunkt gekürzten)
Elementnamen
</li>
<li>
<em>Präfix</em>
: das Namensraumkürzel, das zusammen mit dem
Local Name den kompletten Elementnamen
bildet. Dient der Identifikation eines
Elements.
</li>
<li>
<em>Attribute</em>
: ungeordnete Menge von
<em>Attribute Information Item</em>
s. Für jedes Attribut eines Elements, ob
explizit spezifiziert oder von einer DTD
übernommen, existiert ein Attribute
Information Item. Namensraumdeklarationen
erscheinen hier nicht.
</li>
<li>
<em>Namespace Attribute</em>
: ungeordnete Menge von
<code>Attribute Information Item</code>
s, eines für jede Namensraumdeklaration
dieses Elements.
</li>
<li>
<em>In-Scope Namespaces</em>
: ungeordnete Menge von
<code>Namespace Information Items</code>
für jeden Namensraum, der für das aktuelle
Element gültig ist.
</li>
<li>
<em>Base URI</em>
: die Basis URI des Elements.
</li>
<li>
<em>Parent</em>
: Dasjenige
<code>Document Information Item</code>
oder
<code>Element Information Item</code>
, in dessen
<em>Kindknoten</em>
das aktuelle Element enthalten ist.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Aufbau eines Elementnamens</title>
<p>
Die Listings zeigen Elemente aus unseren
Beispieldokumenten.
</p>
<listing
src="erstes-XML-dokument.xml"
line="5-6" />
<listing
src="erstes-XML-dokument-html-beispiel.xml"
line="8-14" />
<ul>
<li>
Grenzen eines Elements:
<em>Startmarke</em>
und
<em>Endmarke</em>
(engl.
<em>Tag</em>
). Mit den Tagnamen werden die Typen eines
Dokuments definiert.
</li>
<li>
Sonderfall leeres Element: Startmarke ist
gleichzeitig Endmarke. Ein leeres Element
besitzt folglich keine Kindknoten.
</li>
</ul>
<listing
src="erstes-XML-dokument.xml"
line="4" />
</slide>
<slide>
<title>
Information eines Element Information Items am
Beispiel
</title>
<listing src="erstes-XML-dokument.xml" />
<ul>
<li>
Das Element Information Item des Elements
<code>Studiengang</code>
beinhaltet folgende Informationen:
</li>
<ul>
<li>
Liste von Kindknoten: Drei Character
Information Items. Sie formen die
Zeichenkette
<code>IAM</code>
.
</li>
<li>Namensraum-Name: leer</li>
<li>Lokaler Name: Studiengang</li>
<li>Präfix: keines</li>
<li>
Ein Attribute Information Item für das
Attribut
<code>semester</code>
.
</li>
<li>
Kein Namensraum-Attribut, da keine
Namensraumdeklaration für das Element
vorhanden (auch nicht für ein Elternelement,
von dem es diese erben könnte).
</li>
<li>In-Scope Namespaces: leere Menge.</li>
<li>
Basis-URI:
<code>
http://www.barbara-zengler.de/vorlesung/erstes-XML-dokument.xml
</code>
</li>
<li>
Parent: Das Element Information Item
(gleichzeitig Document Information Item) des
Elements
<code>Vorlesung</code>
.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Aufbau eines Elementnamens</title>
<p>Grammatik des Start-Tags:</p>
<listing
src="XML-Grammatik.txt"
line="14-15" />
<p>Grammatik des Ende-Tags:</p>
<listing
src="XML-Grammatik.txt"
line="16" />
</slide>
<slide>
<title>Aufbau eines Elementnamens</title>
<p>Grammatik der Elementnamen:</p>
<listing
src="XML-Grammatik.txt"
line="19-24" />
<ul>
<li>
Aufbau der Elementnamen ähnlich wie Regeln aus
den Programmiersprachen.
</li>
<li>
Beginn mit einem Buchstaben, Doppelpunkt oder
Unterstrich.
</li>
<li>
Danach folgen beliebige für Namen zugelassene
Zeichen.
</li>
<li>
Leerzeichen und
<em>white spaces</em>
(z.B. Zeilenumbruch) sind in Namen nicht
zugelassen!
</li>
<li>
Auch öffnende und schließende Winkelklammern
sind nicht erlaubt.
</li>
<li>
Ein Doppelpunkt ist zwar erlaubt, sollte aber
nicht verwendet werden, weil er bei der
Verwendung von Namensräumen das Namenskürzel vom
Elementnamen trennt.
</li>
</ul>
</slide>
<slide>
<title>
Kleiner Vorgeschmack: Element mit Namensraum
</title>
<p>
Zur Verdeutlichung der Sonderstellung des
Doppelpunkts ist hier ein Beispiel für ein Element
mit deklarierten Namensraum aufgeführt:
</p>
<listing
src="Element-mit-Namensraum.xml"
line="1-6" />
<ul>
<li>
Im Start-Tag des Elements
<code>aParent</code>
wird der Namensraum
<code>example.com</code>
definiert und dem Kürzel
<code>myNS</code>
zugewiesen.
</li>
<li>
In Elternelementen deklarierte Bindungen von
Namensräume an Kürzel stehen den Kindelementen
automatisch zur Verfügung.
</li>
<li>
Das Element Information Item
<code>anElement</code>
ergibt sich hiermit aus:
</li>
<ul>
<li>
<code>local name: aElement</code>
</li>
<li>
<code>namespace URI: example.com</code>
</li>
<li>
<code>prefix: myNS</code>
</li>
</ul>
<li>
Nähere Ausführungen zu Namensräumen in der
nächsten Vorlesung.
</li>
</ul>
</slide>
<slide>
<title>Tag vs. Element</title>
<p>
Oftmals werden die Begriffe
<em>Tag</em>
und
<em>Element</em>
synonym verwendet. Dies ist jedoch nicht korrekt!
</p>
<p>
Ein
<em>Tag</em>
drückt lediglich den Namen eines Elements aus und
liefert damit Information, die die Natur des
Elements beschreibt. Dies kann durch beliebige
erlaubte Zeichenketten geschehen, meistens trifft
man jedoch sogenannte
<em>sprechende Tags</em>
an.
<br />
Ein Tag hat im Gegensatz zu einem Element keine
Eltern- oder Kindknoten, etc. Es ist nur ein
Bezeichner.
</p>
</slide>
<slide>
<title>Semistrukturierte Information</title>
<listing
src="erstes-XML-dokument.xml"
line="1-11" />
<ul>
<li>
Verschiedenartige Strukturierungsmöglichkeiten
in einem XML-Dokument
</li>
<li>
Starke Verwendung von Elementen und Attributen
führt zu stark strukturierter Darstellung von
Daten
</li>
<li>
<q>eingestreuter Freitext</q>
ist möglich:
<q>Semistrukturierung</q>
</li>
<li>
Im Beispiel: rein zeichenkettenartiger Inhalt in
den Elementen
<code>Hochschule</code>
und
<code>Titel</code>
</li>
<li>
<code>Vorlesung</code>
mischt strukturierten Inhalt (Kindelemente) und
unstrukturierte Information (Text
<code>Montag, 15:40h - 18:50h</code>
)
</li>
<li>
In der XML-Sprache wird dies als
<em>mixed Content</em>
bezeichnert Charakteristisch für viele
XML-Dokumente.
</li>
</ul>
</slide>
<slide>
<title>Attribute</title>
<ul>
<li>
In unserem Beispiel ist auch ein Attribut
enthalten (
<code>semester="3"</code>
)
</li>
<li>
Attribute werden als Namen-Wert-Paare im
Start-Tag deklariert
</li>
<li>
In einem Attribut dürfen keine Symbole wie z.B.
die öffnende Winkelklammer verwendet werden, die
falsch interpretiert werden könnten.
</li>
<li>
Ein Attribut besitzt im Gegensatz zu einem
Element keine weitere Unterstrukturierung. Der
gesamte Attributinhalt wird als sogenannter
<em>Normalisierter Wert</em>
dargestellt.
</li>
<li>
Die Menge der Attribute für ein Element ist
nicht geordnet
</li>
<li>
Ein bestimmtes Attribut darf in einem Element
nur genau ein mal vorkommen.
</li>
</ul>
</slide>
<slide>
<title>Attribute Information Item</title>
<ul>
<li>
Für jedes Attribut eines Elements gibt es ein
<code>Attribute Information Item</code>
mit folgenden Eigenschaften:
</li>
<ul>
<li>
<em>Namespace Name</em>
: der Namensraum des Attributs, falls
definiert.
</li>
<li>
<em>Lokaler Name</em>
: entspricht dem (um evtl. Namensraumkürzel
und trennenden Doppelpunkt gekürzten)
Attributnamen
</li>
<li>
<em>Präfix</em>
: Das Namensraumkürzel des Namensraums, in
dem sich das Attribut befindet.
</li>
<li>
<em>Normalisierter Wert</em>
: Normalisierter Attributinhalt. Die
Normalisierung von Attributwerten ist in
<a
href="http://www.w3.org/TR/REC-xml/#AVNormalize">
Abschnitt 3.3.3 der XML-Spezifikation
</a>
beschrieben. Beispielsweise werden dabei
alle Zeilenumbrüche entfernt und
Entitätsreferenzen werden aufgelöst.
</li>
<li>
<em>Specified</em>
: zeigt an, ob das Attribut tatsächlich im
Start-Tag des Elementes spezifiziert wurde,
oder ob es durch eine DTD vorgegeben ist.
</li>
<li>
<em>Attributtyp</em>
: Typ des Attributs, wie in der DTD
festgelegt. Zugelassene Werte sind
<code>ID</code>
,
<code>IDREF</code>
,
<code>IDREFS</code>
,
<code>ENTITY</code>
,
<code>ENTITIES</code>
,
<code>NMTOKEN</code>
,
<code>NMTOKENS</code>
,
<code>NOTATION</code>
,
<code>CDATA</code>
, und
<code>ENUMERATION</code>
</li>
<li>
<em>Referenzen</em>
: Handelt es sich bei dem Attribut um ein
Referenzattribut (d.h. es ist vom Typ
<code>IDREF(S)</code>
,
<code>ENTITY</code>
,
<code>ENTITIES</code>
oder
<code>NOTATION</code>
), so enthält diese Eigenschaft eine
Verweisliste auf alle Auftreten des
Attributwertes
</li>
<li>
<em>Eigentümerelement</em>
: Ein Verweis auf das Element, zu dem das
Attribut gehört.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Element oder Attribut?</title>
<ul>
<li>
Vergleicht man die Eigenschaften von Elementen
und Attributen, so erkennt man, daß sich nicht
weiter strukturierte Information aus als
Attribute darstellen ließe.
</li>
<li>
Wie soll man nun sein XML-Dokument entwerfen,
wie das Vokabular strukturieren?
</li>
<li>
Die XML-Spezifikation gibt uns hierauf keine
Antwort.
</li>
<li>
Attribute sind nicht weiter strukturiert, daher
bietet sich ihr Einsatz nur in Sonderfällen an.
</li>
<li>
Beispiel: Beschreibende Information zum Element,
Meta-Information.
</li>
<li>
Elemente werden eingesetzt, wenn Information
weiter strukturiert werden muß.
</li>
<li>
Werden DTDs verwendet, sind Attribute die
einzige Möglichkeit, Daten zu typisieren. Mit
der Verwendung von XML-Schema, das Typisierung
auch für Elementinhalt erlaubt, schwindet dieser
Vorteil.
</li>
</ul>
</slide>
<slide>
<title>Character Information Item</title>
<ul>
<li>
Zeichenketten-Daten, die Inhalt eines Elementes
sind.
</li>
<li>
Jedes einzelne dieser Zeichen wird als
<code>Character Information Item</code>
mit folgenden Eigenschaften dargestellt:
</li>
<ul>
<li>
<em>Character Code</em>
: Der ISO-10646 Zeichencode des jeweiligen
Zeichens.
</li>
<li>
<em>Element Content Whitespace</em>
: Ein Boole'scher Wert. Er zeigt an, ob das
aktuelle Zeichen ein
<q>white space</q>
Zeichen darstellt, das laut DTD als
Elementinhalt
<q>erhalten</q>
werden soll. Whitespace-Zeichen werden oft
verwendet, um ein XML-Dokument visuell
besser zu strukturieren. Wenn die DTD keine
derartige Deklaration beinhaltet, oder keine
DTD zum Dokument existiert, so bestitzt
diese Eigenschaft keinen Wert.
</li>
<li>
<em>Parent</em>
: Verweis auf das Element, in dem das
Zeichen enthalten ist.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Character Information Item</title>
<p>
Im Folgenden ist zum besseren Verständnis nochmals
unser Beispieldokument in der Zusammenschau mit
seinem Information Set aufgeführt.
</p>
<listing
src="erstes-XML-dokument.xml"
line="1-11" />
<img src="Infoset-erstes-Beispiel.png" />
</slide>
<slide>
<title>Zeichenersetzungsmuster</title>
<p>
Eine Reihe von Zeichen dürfen nicht als Text in
einem XML-Dokument vorkommen, weil sie als
Metasymbole der XML selbst dienen. Für diese Zeichen
gibt es vordefinierte sogenannte
<em>Fluchtsymbole</em>
(escape characters), die stattdessen verwendet
werden können (
<a
href="http://www.w3.org/TR/2006/REC-xml11-20060816/index.html#sec-predefined-ent">
Nachlesen in XML-Spezifikation
</a>
). XML-Prozessoren berücksichtigen diese Symbole und
geben sie in der korrekten Darstellung an die
Applikation weiter.
</p>
<table
border="1"
cellpadding="20">
<tr>
<th>Entitätsreferenz</th>
<th>Ausgedrücktes Zeichen</th>
</tr>
<tr>
<td>
<code>&amp;</code>
</td>
<td>
<code>&</code>
</td>
</tr>
<tr>
<td>
<code>&lt;</code>
</td>
<td>
<code><</code>
</td>
</tr>
<tr>
<td>
<code>&gt;</code>
</td>
<td>
<code>></code>
</td>
</tr>
<tr>
<td>
<code>&apos;</code>
</td>
<td>
<code>'</code>
</td>
</tr>
<tr>
<td>
<code>&quot;</code>
</td>
<td>
<code>"</code>
</td>
</tr>
</table>
</slide>
</part>
<part>
<title>
Strukturelle Grundkonzepte: Die Extensible Markup
Language (XML) und das XML Information Set (2)
</title>
<slide>
<title>Comment Information Item</title>
<ul>
<li>
Syntax für Kommentare wie in SGML (und damit
auch wie in HTML)
</li>
<li>
Kommentare sind an folgenden Stellen in einem
XML-Dokument erlaubt:
</li>
<ul>
<li>Nach dem Prolog</li>
<li>
An jeder beliebigen Stelle des XML-Dokuments
außerhalb von Markup.
</li>
<li>Folglich:</li>
<ul>
<li>
Keine Kommentare in Tags (innerhalb der
spitzen Klammern)!
</li>
<li>
Keine Schachtelung von Kommentaren (weil
Kommentare selbst Markup darstellen)!
</li>
</ul>
<li>
Aus Kompatibilitätsgründen zur SGML darf
innerhalb von Kommentaren kein doppelter
Bindestrich vorkommen (
<code>--</code>
)
</li>
<li>
Ansonsten dürfen in Kommentaren auch
Markup-Symbole wie etwa
<code><</code>
oder
<code>'</code>
vorkommen.
</li>
<li>
Der Inhalt von Kommentaren wird nicht
verarbeitet, daher wird auch kein
verarbeitender Zugriff von Prozessoren und
APIs unterstützt.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Comment Information Item</title>
<p>Grammatik für XML-Kommentare</p>
<listing
src="XML-Grammatik.txt"
line="27" />
<p>Beispiel</p>
<listing
src="XML-Dokument-mit-Kommentar.xml"
line="1-12" />
</slide>
<slide>
<title>Comment Information Item</title>
<p>
Eigenschaften des
<em>Comment Information Item</em>
</p>
<ul>
<li>
<em>Content</em>
: Der gesamte Inhalt des Kommentars als
uninterpretierte Zeichenkette
</li>
<li>
<em>Parent</em>
: Referenz auf den Elternknoten (
<em>Document Information Item</em>
oder
<em>Element Information Item</em>
</li>
</ul>
</slide>
<slide>
<title>Document Type Declaration</title>
<ul>
<li>
Wenn für ein Dokument eine Grammatik in Form
einer DTD existiert, wird dies in einer
sogenannten
<em>DOCTYPE</em>
-Deklaration angezeigt.
</li>
<li>
Die
<em>DOCTYPE</em>
-Deklaration befindet sich am Anfang des
Dokuments vor dem ersten Element. (
<a
href="http://www.w3.org/TR/2006/REC-xml11-20060816/#sec-prolog-dtd">
In XML-Spezifikation nachschlagen)
</a>
</li>
<li>
Mit Hilfe dieser Deklaration wird angezeigt, an
welchem Ort die DTD abgelegt ist.
</li>
<li>
Alternativ kann eine DTD auch in die
Doctype-Deklaration eingebettet werden.
</li>
</ul>
</slide>
<slide>
<title>Document Type Declaration - Grammatik</title>
<p>Grammatik für DTDs</p>
<listing
src="XML-Grammatik.txt"
line="42-47" />
</slide>
<slide>
<title>Document Type Declaration - Beispiel</title>
<p>Beispiel</p>
<listing
src="XML-Dokument-mit-DTD.xml"
line="1-4" />
<ul>
<li>
Warum ist dieses Dokument fehlerhaft? (Auflösung
mit Taste
<code>n</code>
)
</li>
<note>
Die Möglichkeit, für ein Dokument zwei
Grammatiken angeben zu können, ist im
allgemeinen nicht sinnvoll.
</note>
<note>
Für jedes XML-Dokument darf es daher maximal
eine Dokumenttyp-Definition geben, der das
Dokument genügen muß.
</note>
<note>
In obigem Beispiel sind zwei DTDs angegeben.
</note>
</ul>
</slide>
<slide>
<title>
Document Type Declaration Information Item
</title>
<p>
Das DTD Information Item enthält all die
Information, die in einem XML-Dokument über die DTD
verfügbar ist:
</p>
<ul>
<li>
<em>System Identifier</em>
: Verweis auf eine externe DTD, sofern
vorhanden.
</li>
<li>
<em>Public Identifier</em>
:Verweis auf eine externe DTD, die durch einen
public identifier identifiziert wird.
</li>
<li>
<em>Kindknoten</em>
: geordnete Menge von
<em>Processing Instruction Information Item</em>
s aus der DTD (in der Reihenfolge ihres
Erscheinens)
</li>
<li>
<em>Elternknoten (Parent)</em>
: Das
<em>Document Information Item</em>
</li>
</ul>
</slide>
<slide>
<title>Namespace Declaration Information Item</title>
<p>
Für jeden Namensraum, der in einem XML-Dokument
definiert wird, existiert ein
<em>Namespace Declaration Information Item</em>
mit folgenden Eigenschaften:
</p>
<ul>
<li>
<em>Präfix</em>
: das Präfix, an das der Namensraum gebunden
wird.
</li>
<li>
<em>Namespace Name</em>
: Der System Identifier der Entität (im Beispiel
<code>xyz.gif</code>
).
</li>
</ul>
</slide>
<slide>
<title>Namespace Declaration - Beispiel</title>
<p>
Im folgenden XML-Dokument sehen Sie ein
Beispieldokument mit Namensräumen.
</p>
<listing
src="XML-Dokument-mit-Namensräumen.xml"
line="1-9" />
<ul>
<li>
Im Start-Tag von
<code>elementB</code>
wird der sogenannte
<em>Vorgabenamensraum</em>
mit dem Namensraum
<code>http://www.fh-augsburg.de</code>
überschrieben.
<code>elementB</code>
befindet sich damit automatisch in diesem
Namensraum.
</li>
<li>
Im Start-Tag von
<code>elementC</code>
wird der Namensraum
<code>http://www.example.com</code>
dem Kürzel
<code>abc</code>
zugewiesen. Das Element wird diesem Namensraum
jedoch nicht zugeordnet.
</li>
<li>
Dessen Kindelement
<code>elementD</code>
<q>kennt</q>
die Namensraumdeklarationen seines Elternteils.
Es wird dem Namensraum
<code>http://www.example.com</code>
zugewiesen, indem das Präfix dem Elementnamen
(getrennt durch
<code>:</code>
) vorangestellt wird.
</li>
</ul>
</slide>
<slide>
<title>Namespace Declaration - Beispiel</title>
<p>
Nachfolgend sehen Sie erneut unser Beispiel mit
einer Auflistung der Namensräume für jedes Element.
</p>
<listing
src="XML-Dokument-mit-Namensräumen.xml"
line="1-9" />
<table
border="1"
cellpadding="10">
<tr>
<th>Elementname</th>
<th>Namensraum</th>
</tr>
<tr>
<td>
<code>wurzelelement</code>
</td>
<td>(leerer Namensraum)</td>
</tr>
<tr>
<td>
<code>elementA</code>
</td>
<td>(leerer Namensraum)</td>
</tr>
<tr>
<td>
<code>elementB</code>
</td>
<td>
<code>http://www.fh-augsburg.de</code>
</td>
</tr>
<tr>
<td>
<code>elementC</code>
</td>
<td>(leerer Namensraum)</td>
</tr>
<tr>
<td>
<code>elementD</code>
</td>
<td>
<code>http://www.example.com</code>
</td>
</tr>
</table>
</slide>
<slide>
<title>Processing Instruction</title>
<ul>
<li>
Mit
<em>Processing Instructions (PIs)</em>
kann man Applikationen Hinweise und Anweisungen
zur Verarbeitung eines XML-Dokuments geben.
</li>
<li>
PIs gehören nicht zu den zeichenartigen Daten
eines XML-Dokuments. Sie werden aber vom
Prozessor an die Anwendung übergeben.
</li>
<li>
Der erste Bezeichner in einer Processing
Instruction dient dazu, die verarbeitende
Applikation zu identifizieren. Die Zeichenkette
<code>XML</code>
ist in sämtlichen Variationen hiervon
ausgeschlossen.
</li>
<li>
PIs können an beliebigen Stellen eines Dokuments
auftreten: Vor dem Wurzelelement sowie innerhalb
des Dokuments.
</li>
<li>
Wie bei Kommentaren ist es nicht erlaubt, PIs in
Elementbezeichnern und Attributen anzugeben.
</li>
</ul>
</slide>
<slide>
<title>Processing Instruction</title>
<ul>
<li>
PIs passen eigentlich nicht zur Idee einer
beschreibenden Auszeichnungssprache für
Dokumente, da sie keine beschreibende
Information über den Inhalt des Dokuments
darstellen.
</li>
<li>
Aus Kompatibilitätsgründen zur SGML wurden sie
dennoch beibehalten.
</li>
<li>
Auch der XML-Prolog ist im Grunde genommen eine
PI.
</li>
<li>
Empfehlung: Verwenden Sie
<em>keine</em>
PIs. Auch wenn diese manchmal eine verführerisch
einfache Möglichkeit zur Lösung eines Problems
darstellen, lösen Sie Ihr Problem lieber sauber!
</li>
</ul>
</slide>
<slide>
<title>
Processing Instruction - Grammatik und Beispiel
</title>
<p>Grammatik für Processing Instructions</p>
<listing
src="XML-Grammatik.txt"
line="30-31" />
<p>Beispiel</p>
<listing
src="XML-Dokument-mit-PI.xml"
line="1-7" />
<note>
Strenggenommen könnte man die Zeichenfolge
<code>XML</code>
als Präfix für einen Bezeichner verwenden, da dies
nicht verboten wird. Dies ist jedoch nicht zu
empfehlen.
</note>
</slide>
<slide>
<title>Processing Instruction Information Item</title>
<p>
Infoset-Eigenschaften eines Processing Instruction
Information Item
</p>
<ul>
<li>
<em>Target</em>
: Der Name der Zielapplikation als Zeichenkette.
</li>
<li>
<em>Inhalt</em>
: Eine Zeichenkette mit dem Inhalt der PI,
jedoch ohne den Namen der Zielapplikation und
darauffolgendem WhiteSpace.
</li>
<li>
<em>Basis URI</em>
: Die Basis URI der PI.
</li>
<li>
<em>Notation</em>
: Wenn der Name der Zielapplikation in Form
einer Notation vorliegt, eine Referenz auf das
entsprechende
<em>Notation Information Item</em>
.
</li>
<li>
<em>Parent</em>
: Referenz auf das Elternelement der PI,
entweder ein
<em>Element Information Item</em>
oder ein
<em>Document Information Item</em>
(für PIs außerhalb des Wurzelelementes).
</li>
</ul>
</slide>
<slide>
<title>Notation Information Item</title>
<ul>
<li>
Deklarationen von Notations sind strenggenommen
Bestandteile von DTDs, nicht von XML-Dokumenten.
</li>
<li>
Sie werden aber im Infoset berücksichtigt und
sind stark mit Processing Instruction
Information Items verknüpft.
</li>
<li>
Mit Notations kann man Dateninhalten externe
Quellen zuordnen. Man erhoffte sich hierdurch
das, was durch ein XML-Dokument ausgedrückt
werden kann, zu erweitern.
</li>
<li>
Notations werden jedoch von XML-Parsern nicht
berücksichtigt! Sollen diese ausgewertet werden,
so muß dies in der darüberliegenden Applikation
erfolgen!
</li>
<li>
Notation-Deklarationen sind in DTD-Syntax und
<em>kein XML</em>
!
</li>
</ul>
</slide>
<slide>
<title>Notation</title>
<ul>
<li>
Notations werden etwa für sog.
<em>unparsed Entities</em>
angewendet. Hier weden einfach Zeichenketten
einem Namen zugeordnet.
</li>
<li>
Die Zeichenketten dienen der Identifikation des
Systems, das die Information verarbeitet.
</li>
<li>
Für standardisierte Information sind sogenannte
<em>Public Identifier</em>
verfügbar.
</li>
<li>
<em>System Identifier</em>
verweisen auf eine bekannte URI oder ein
installiertes Anwendungsprogramm.
</li>
</ul>
</slide>
<slide>
<title>Notation - Grammatik</title>
<p>Grammatik für Notations</p>
<listing
src="XML-Grammatik.txt"
line="34-39" />
</slide>
<slide>
<title>Notation - Beispiel</title>
<p>Beispiel</p>
<listing
src="XML-Dokument-mit-Notation.xml"
line="1-13" />
<ul>
<li>
Die genaue Bedeutung der DTD Konstrukte werden
im entsprechenden Teil der Vorlesung noch
behandelt.
</li>
<li>
Drei Notationen:
<code>isoDate</code>
,
<code>gif</code>
und
<code>hex</code>
.
</li>
<li>
Die
<code>hex</code>
-Notation wird im Dokument verwendet.
</li>
<li>
Man könnte hiermit auf die Idee kommen,
Strukturen wie Datentypen nachbilden zu wollen.
Aber Achtung: Diese Strukturen müssen dann in
der Programmierung der Applikation
berücksichtigt werden.
</li>
<li>
Mithilfe der System-Referenzen alleine wird
nicht klar, ob auf ein Dokument, ein System oder
eine ausführbare Anwendung verwiesen wird.
</li>
<li>
Der Public Identifier
<code>gif</code>
stellt hier nur eine weltweit eindeutige
Benennung dar.
</li>
<li>
Soll auf einen Ort im System verwiesen werden,
der die dargestellte Information verarbeitet,
kann zusätzlich ein
<em>System Identifier</em>
angegeben werden.
</li>
</ul>
</slide>
<slide>
<title>Notation Information Item</title>
<p>
Infoset-Eigenschaften eines Notation Information
Item
</p>
<ul>
<li>
<em>Name</em>
: Name der Notation
</li>
<li>
<em>System Identifier</em>
: Der System Identifier der Notation wie er in
der Deklaration angegeben wird, ohne
Fluchtsymbole in der URI.
</li>
<li>
<em>Public Identifier</em>
:Der Public Identifier der Notation, hier wird
der Inhalt der URI normalisiert
(Whitespace-Zeichen werden in Leerzeichen
umgewandelt, Leerzeichen zu Beginn und Ende der
Zeichenkette werden entfernt)
</li>
<li>
<em>Declaration Base URI</em>
: Die Base URI, zu der der System Identifier
relativ aufgelöst werden soll (z.B. Die Base URI
der Ressource, in der die Notation deklariert
wurde).
</li>
</ul>
</slide>
<slide>
<title>Unexpanded Entity Reference</title>
<ul>
<li>
Mechanismus, der für die fünf in der XML
vordefinierten Textersetzungsmuster (
<code>&amp;</code>
,
<code>&lt;</code>
,
<code>&gt;</code>
,
<code>&apos;</code>
,
<code>&quot;</code>
) verwendet wurde
</li>
<li>
Mit diesem Mechanismus können eigene
Ersetzungsmuster (
<em>Entities</em>
) definiert werden.
</li>
<li>
Definition von Textersetzungsmustern ist nur in
der DTD möglich. Ihre Syntax ist nicht XML!
</li>
<li>
Die Verwendung der Entitäten ist innerhalb von
Elementen als sog.
<em>Element Content</em>
gestattet. In Element- und Attributnamen können
Entitäten demnach nicht verwendet werden.
</li>
</ul>
</slide>
<slide>
<title>Unexpanded Entity Reference - Grammatik</title>
<p>Grammatik für Unexpanded Entity References</p>
<listing
src="XML-Grammatik.txt"
line="50-54" />
<ul>
<li>Zwei Klassen von Entitäten</li>
<ul>
<li>
Interne Entitäten: ihr Wert ist direkt neben
dem Schlüsselwort Entity angegeben
</li>
<li>
Externe Entitäten: sie werden durch eine URI
oder einen öffentlichen Bezeichner
identifiziert
</li>
</ul>
</ul>
</slide>
<slide>
<title>Unexpanded Entity Reference - Beispiel</title>
<p>Beispiel</p>
<listing
src="XML-Dokument-mit-Entities.xml"
line="1-12" />
<ul>
<li>
Verwendung von Entitäten mit Kaufmanns-Und (
<code>&</code>
) und abschließendem Strichpunkt (
<code>;</code>
)
</li>
<li>
<code>entA</code>
ist eine interne Entität und wird durch die
Zeichen
<code>xyz</code>
ersetzt
</li>
<li>
<code>entB</code>
und
<code>entC</code>
sind Referenzen auf externe Ressourcen.
</li>
<li>
<code>entC</code>
definiert darüberhinaus, daß es eine unter dem
Namen
<code>-//FHA//Symbol//DE</code>
öffentlich bekannte Quelle (
<code>file://symbols</code>
) referenziert.
</li>
</ul>
</slide>
<slide>
<title>
Unexpanded Entity Reference Information Item
</title>
<p>
Solange die Entitätsreferenzen noch nicht durch den
Prozessor ersetzt (=expandiert) sind, liegen sie im
Information Set als
<code>
Unexpanded Entity Reference Information Item
</code>
vor. Es hat folgende Eigenschaften:
</p>
<ul>
<li>
<em>Name</em>
: der Name der referenzierten Entität.
</li>
<li>
<em>System Identifier</em>
: Der System Identifier der Entität.
</li>
<li>
<em>Public Identifier</em>
: Der normalisierte Public Identifier der
Entität.
</li>
<li>
<em>Declaration Base URI</em>
: Die Base URI, zu der der System Identifier
relativ aufgelöst werden soll (z.B. Die Base URI
der Ressource, in der die Entität deklariert
wurde).
</li>
<li>
<em>Elternknoten (Parent)</em>
: Das
<em>Element Information Item</em>
, in dessen Inhalt die Entitätsreferenz
verwendet wurde.
</li>
</ul>
</slide>
<slide>
<title>Unparsed Entity Reference</title>
<ul>
<li>
Entität, die explizit durch den XML-Prozessor
nicht zu analysieren/prüfen ist.
</li>
<li>
Informationenliegen üblicherweise nicht im
XML-Format vor, sondern z.B. als Binärdaten. So
können Bilder, Videos, o.ä. referenziert werden.
</li>
</ul>
</slide>
<slide>
<title>Unparsed Entity Reference - Grammatik</title>
<p>
Die Grammatik für ungeprüfte Entitätsreferenzen ist
Teil der Grammatik für Unexpanded Entity References
(hier erneut aufgeführt).
</p>
<listing
src="XML-Grammatik.txt"
line="50-54" />
<ul>
<li>
Produktion 76 definiert die nicht zu prüfende
Entität
</li>
</ul>
</slide>
<slide>
<title>Unparsed Entity Reference - Beispiel</title>
<p>Beispiel</p>
<listing
src="XML-Dokument-mit-UnparsedEntity.xml"
line="1-11" />
<ul>
<li>
In Zeile 4 wird die öffentlich bekannte Notation
<code>gif</code>
definiert.
</li>
<li>
Die Entität
<code>entA</code>
verwendet diese Notation und deklariert sie als
Referenz auf den nicht zu prüfenden Inhalt (
<code>NDATA</code>
für Non-Parsed-Data) der Ressource
<code>xyz.gif</code>
</li>
<li>
Innerhalb des Elements
<code>someContent</code>
wird die Entitätsreferenz
<code>entA</code>
verwendet. An dieser Stelle wird demnach die
Grafikdatei in das XML-Dokument aufgenommen.
</li>
</ul>
</slide>
<slide>
<title>
Unparsed Entity Reference Information Item
</title>
<p>
Für jede nicht geprüfte Entität eines XML-Dokuments
gibt es ein
<em>Unparsed Entity Reference Information Item</em>
. Es hat folgende Eigenschaften:
</p>
<ul>
<li>
<em>Name</em>
: der Name der Entität.
</li>
<li>
<em>System Identifier</em>
: Der System Identifier der Entität (im Beispiel
<code>xyz.gif</code>
).
</li>
<li>
<em>Public Identifier</em>
: Der normalisierte öffentliche Identifier der
Entität.
</li>
<li>
<em>Declaration Base URI</em>
: Die Base URI, zu der der System Identifier
relativ aufgelöst werden soll (z.B. Die Base URI
der Ressource, in der die Entität deklariert
wurde).
</li>
<li>
<em>Notation Name</em>
: Der Name der Notation, mit der die Entität
verknüpft ist (im Beispiel
<code>gif</code>
).
</li>
<li>
<em>Notation</em>
: Das
<em>Notation Information Item</em>
der Notation, die durch den
<em>Notation Name</em>
benannt ist.
</li>
</ul>
</slide>
<slide>
<title>Infoset - Übersicht</title>
<img
style="margin : 4%"
src="infoset.gif" />
<note>
Informationseinheiten als Knoten, Beziehungen als
(gerichtete) Kanten dargestellt.
</note>
<note>
Ausgangspunkt ist das in der Mitte dargestellte
<em>Document</em>
.
</note>
<note>
Lediglich Elemente verfügen über weitere Kindknoten
und spannen so den Baum einen XML-Dokuments auf.
</note>
<note>
Alle übrigen Primitive sind überwiegend Blattknoten.
</note>
</slide>
<slide>
<title>Wohlgeformtheit</title>
<p>
Ein XML-Dokument, das den Prinzipien zur
Strukturierung aus dem Information Set genügt, ist
ein wohlgeformtes Dokument. Insbesondere genügt es
folgenden 10 Regeln:
</p>
<ul>
<li>
Es enthält den Prolog inkl. der XML-Deklaration.
</li>
<li>
Das XML-Dokument nutzt eine DTD, oder enthält
die Deklaration standalone="yes".
</li>
<li>Es gibt genau ein Wurzelelement.</li>
<note>
Ein Dokument ohne Wurzelelement ist nicht
wohlgeformt!
</note>
<li>
Zu jedem Start-Tag existiert genau ein Ende-Tag.
Im Fall von leeren Elementen können beide
zusammenfallen.
</li>
<li>
Die Elemente sind sauber ineinander
geschachtelt.
</li>
<li>
Ein Attributenamen darf nur einmal im selben
Start-Tag oder Empty-Element-Tag vorkommen.
</li>
<li>
Alle Attributwerte sind in einfachen oder
doppelten Anführungszeichen.
</li>
<li>
Attributwerte dürfen die Zeichen
<code><</code>
und
<code>&</code>
nicht enhalten.
</li>
<li>
Keine Kommentare oder Processing Instructions
innerhalb von Tags.
</li>
<li>
Kommentare beginnen und enden mit genau zwei
Bindestrichen.
</li>
</ul>
</slide>
<slide>
<title>Wohlgeformtheit - Beispiel</title>
<p>
Das folgende Beispiel zeigt ein nicht wohlgeformtes
XML-Dokument, das mehreren Anforderungen nicht
genügt.
</p>
<listing
src="NotWellFormed.xml"
line="1-12" />
<ul>
<li>
Attributwert in Zeile 3 nicht in Hochkommata
eingeschlossen.
</li>
<li>
Öffnende Winkelklammer als Elementinhalt in
Zeile 4. Hier hätte das Fluchtsymbol
<code>&lt;</code>
verwendet werden müssen.
</li>
<li>
Kein schließendes Tag zu
<code>elementB</code>
vorhanden.
</li>
<li>
In
<code>elementC</code>
kommt der Attributname
<code>att1</code>
zweimal vor.
</li>
<li>
Im öffnenden Tag von
<code>elementD</code>
steht eine dort nicht zugelassene Processing
Instruction.
</li>
<li>
<code>elementC</code>
und
<code>elementD</code>
sind nicht sauber geschachtelt.
</li>
<li>
Der Kommentar in Zeile 11 hat fehlerhafte
Begrenzer (korrekt wären genau zwei
Bindestriche).
</li>
</ul>
</slide>
</part>
<slide>
<title>Weiterführende Links</title>
<ul>
<li>
<a href="http://www.w3.org/TR/xml-infoset/">
XML Information Set
</a>
</li>
<li>
<a href="http://www.unicode.org/">Unicode</a>
</li>
<li>
<a href="http://www.unipad.org/">
SC Unipad, ein Unicode Texteditor zum freien
Download (Zeichenanzahl in der freien Version
beschränkt.)
</a>
</li>
<li>
<a
href="http://www.xml.com/pub/a/2001/01/31/qanda.html">
Artikel über Entitäten auf XML.COM
</a>
</li>
</ul>
</slide>
</presentation>
<presentation id="uebungsaufgabenWohlgeformtheit">
<title short="uebungsaufgabenWohlgeformtheit">
Übungsaufgaben zum Thema XML-Dokumente / Wohlgeformtheit
</title>
<date>2008-10-13</date>
<toc id="resources" />
<toc id="abstract">
Übungsaufgaben zum Thema XML-Dokumente / Wohlgeformtheit.
</toc>
<part>
<title>Übungsaufgaben zur Wohlgeformtheit</title>
<slide>
<title>Ein erstes eigenes XML-Dokument erstellen</title>
<ul>
<li>
Erstellen Sie ein erstes einfaches XML-Dokument,
das den Regeln der Wohlgeformtheit genügt.
</li>
<li>
Umfang: 6-7 Elemente, ebenso ein paar Attribute.
</li>
<li>
Zeigen Sie die verschiedenen
Strukturierungsmöglichkeiten (Hierarchien,
Elemente, Attribute) in Ihrem Dokument auf.
</li>
<li>
Überprüfen Sie die Wohlgeformtheit Ihres
Dokuments mit einem geeigneten Werkzeug. (Wie
weist Ihr Tool Sie darauf hin, daß das
vorliegende Dokument NICHT wohlgeformt ist?
Woran merken Sie das?)
</li>
</ul>
</slide>
<slide>
<title>
Umwandeln eines nicht wohlgeformten Dokuments in ein
wohlgeformtes Dokument
</title>
<ul>
<li>
Das untenstehende XML-Dokument ist nicht
wohlgeformt.
</li>
<ol>
<li>
Finden Sie die darin enthaltenen Fehler.
</li>
<li>
Wandeln Sie es in dann ein wohlgeformtes
XML-Dokument um.
</li>
</ol>
<li>
<a href="uebung1_lat.xml">
Download des Beispiels
</a>
</li>
<listing src="uebung1_lat.xml"></listing>
</ul>
</slide>
<slide>
<title>Erstellen eines ersten XHTML Dokuments</title>
<ul>
<li>
Erstellen Sie ein erstes eigenes XHTML Dokument.
</li>
<ol>
<li>
Erstellen Sie ein erstes einfaches XHTML
Dokument.
</li>
<li>
Inhalt der Seite soll das Gedicht 'Die
Brück' am Tay' aus der letzten
Übung sein.
</li>
<li>
Überlegen Sie, mit welchen Elementen der
XHTML sie das Gedicht darstellen können.
</li>
<li>
Welche Information aus dem Quelldokument
läßt sich nicht 1:1 nach XHTML abbilden?
Warum?
</li>
<li>
Überprüfen Sie Ihre XHTML Seite mit dem
<a href="http://validator.w3.org/">
W3C Markup Validaton Service
</a>
des W3C.
</li>
</ol>
<li>Hilfestellung zur XHTML</li>
<ul>
<li>
<a href="http://www.w3.org/MarkUp/">
Webseite des XHTML Working Group des W3C
</a>
</li>
<li>
<a
href="http://www.w3.org/MarkUp/#xhtml1">
Zu XHTML 1.0
</a>
</li>
<li>
Hilfe zur HTML finden Sie auf den
<a href="http://de.selfhtml.org/">
SELFHTML
</a>
Webseiten.
</li>
</ul>
<li>
<a href="uebung1_lat.xml">
Download des Beispiels
</a>
</li>
</ul>
</slide>
</part>
</presentation>
<!-- Ende Übungsaufgaben zum Thema XML-Dokumente / Wohlgeformtheit -->
<!-- Namensräume -->
<presentation id="namensraeume">
<title short="namensräume">Namensräume</title>
<date>2008-10-20</date>
<toc id="resources" />
<toc id="abstract">
Nach einer Einführung der Namensräume als Erweiterung zur
XML und einem Exkurs über IRIs, URIs, URLs und URCs erfahren
Sie, wie Namensräume syntaktisch deklariert werden können.
Sie sehen an Beispielen, wie Namensräume schlecht angewendet
werden und erfahren, wie Sie es besser machen können. Sie
erhalten Kenntnis über die Vorrang-Regelungen bei
Namensräumen und erhalten abschließend einen einfachen
Regelsatz zur Bestimmung von zu Elementen und Attributen
zugeordneten Namensräumen.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract" />
</p>
</slide>
<part>
<title>XML-Namensräume</title>
<slide>
<title>XML-Namensräume</title>
<p class="definition">
Weil XML in sehr vielen verschiedenen Bereichen
verwendet werden kann, ist es sehr erfolgreich.
Unter anderem auch, weil es so einfach ist, eine
Grammatik (wie beispielsweise eine DTD) für neue
Anwendungsfelder zu erstellen und damit für das
spezielle Einsatzszenario ein
<q>maßgeschneidertes</q>
XML Datenmodell zu erstellen. Dies bedeutet, daß
Namen in einem XML-Dokument immer im Zusammenhang
mit einem bestimmten Schema verstanden/interpretiert
werden müssen. Solange ein Dokument nur Namen aus
einem Bereich verwendet, ist das ziemlich einfach.
Heute aber kombinieren Dokumente Namen aus
verschiedenen Anwendungsfeldern. XML-Namensräume
bieten einem hier die Möglichkeit, die Namen in
XML-Dokumenten mit einem Namensraum (=virtueller
Bereich) zu verknüfen und sie so voneinander
unterscheidbar und eindeutig identifizierbar zu
halten.
</p>
</slide>
<slide>
<title>XML-Namensräume</title>
<img
style="width : 80% ;margin : 10%;"
src="languageFamily.gif" />
</slide>
<slide>
<title>XML-Namensräume</title>
<ul>
<li>Wichtige Erweiterung der XML</li>
<li>
Eigene
<a href="http://www.w3.org/TR/xml-names11">
Empfehlung des W3C
</a>
</li>
<li>Enge Beziehung zum XML Kernstandard</li>
<li>Große praktische Bedeutung</li>
<li>
Im XML-Kernstandard explizit berücksichtigt
(Hinweis, den Doppelpunkt besser nicht in
XML-Namen zu verwenden, es sei denn, für
Namensraumangaben.)
</li>
<note>Warum? Um Menschen nicht zu verwirren.</note>
</ul>
</slide>
<slide>
<title>Warum Namensräume?</title>
<ul>
<li>
Es werden immer mehr XML-Sprachen entwickelt,
dies führt zwangsläufig dazu, daß für ähnliche
Probleme auch Mehrfachentwicklungen stattfinden.
</li>
<li>
Technisch äußert sich dies dadurch, daß gleiche
Bezeichner (Namen) in verschiedenen XML-Sprachen
verwendet werden.
</li>
<li>
Jede Sprache bildet demnach einen
Anwendungskontext, in dem die jeweils
verwendeten Bezeichner eindeutig sind.
</li>
<li>
Da nun so viele unterschiedliche Sprachen für
unterschiedliche Problemstellungen zur Verfügung
stehen, ist es durchaus sinnvoll, bereits
bestehende Sprachen (oder Teile davon) zur
Lösung eigener Probleme zu verwenden (das Rad
muß nicht jedesmal neu erfunden, sondern nur an
die eigenen Bedürfnisse angepaßt und ggf.
erweitert, ergänzt oder modifiziert werden).
</li>
<li>
Hierbei kann unter Umständen eine
kontextabängige eindeutige Kennzeichnung von
Elementen nötig werden, um Namenskollisionen zu
vermeiden.
</li>
</ul>
</slide>
<slide>
<title>Zwei XML-Dokumente ähnlichen Inhalts</title>
<table border="0">
<tr>
<td>
<listing src="Rechnung1.xml" />
</td>
<td>
<listing src="Rechnung2.xml" />
</td>
</tr>
</table>
</slide>
<slide>
<title>Infoset der beiden Rechnungsdokumente</title>
<note>
Knoten, die den selben Inhalt repräsentieren, sind
mit identischen Farben markiert.
</note>
<note>
Zeichen (Character Information Item) sind nicht
dargestellt, da sie für diese Betrachtung nicht von
Interesse sind.
</note>
<note>
EInige Elemente und Attribute in beiden Dokumenten
verwendet, mit gleichem Inhalt.
</note>
<note>
Identische Teilbäume bedeuten strukturelle
Übereinstimmung (z.B. Name, Ort, PLZ)
</note>
<note>
Unterschiedliche Teilbäume (z.B. Rechnung, Kunde)
zeigen Unterschied in der Struktur auf
</note>
<table
border="0"
cellpadding="10">
<tr>
<td>
<img
src="Infoset-Rechnung-1.png"
style="margin : 10% ;" />
</td>
<td>
<img
src="Infoset-Rechnung-2.png"
style="margin : 10% ;" />
</td>
</tr>
</table>
</slide>
<slide>
<title>Warum Namensräume?</title>
<ul>
<li>
Keine Probleme, solange die beiden Dokumente in
unterschiedlichen Anwendungswelten verwendet
werden
</li>
<li>
Aber es gibt Anwendungsfälle, in denen dies
bedenklich wird
</li>
<ul>
<li>
Mischen von Dokumenten: oft möchte man
Daten, die in XML vorliegen, in anderen
Dokumenten verwenden. Dabei entsteht eine
neue Dokumentstruktur.
</li>
<li>
Zusammenfassen und Veröffentlichen von
Strukturen in Schemabibliotheken oder
Datenbanken. Dokumente bleiben hier
eigenständig und werden nicht vermischt.
Allerdings stellt sich die Frage, welches
Vokabular für eine bestimmte
Anwendungsdomäne (Produktstrukturen,
Rechnungsverwaltung, Stücklisten, etc.) das
richtige ist. Dialekte konkurrieren und
verzögern eine Standardisierung.
</li>
<li>
Ausdrücklicher Wunsch, fremde Sprachelemente
in die eigene einzubetten: Lösung des
eigenen Problems wird nicht durch eine
bestimmte Sprache abgedeckt, allerdings kann
eine Kombination von Elementen mehrerer
anderer Sprachen hilfreich sein.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Warum Namensräume?</title>
<ul>
<li>
XHTML ist hier ein interessantes und
augenfälliges Beispiel.
</li>
<li>
XHTML verwendet Elemente aus verschiedenen
Sprachen, um Web-Inhalte darzustellen:
</li>
<ul>
<li>
Text (
<a
href="file:///C:/downloads/w3.org/www.w3.org/TR/xhtml1/index.html">
XHTML
</a>
)
</li>
<li>
mathematische Symbole und Formeln (
<a
href="http://www.w3.org/TR/MathML2/index.html">
MathML
</a>
)
</li>
<li>
sowie Vektorgrafiken (
<a
href="http://www.w3.org/TR/SVG11/index.html">
SVG
</a>
)
</li>
</ul>
<li>
Die Verwendung existierender Sprachen verringert
die Fehlerqualität und erhöht die Qualität der
neuen, entstehenden Sprache.
</li>
</ul>
</slide>
<slide>
<title>Warum Namensräume?</title>
<ul>
<li>
Wiederverwendung bestehender (fremder)
XML-Strukturen in eigenen Dokumenten.
</li>
<li>Wunsch nach breiteren Standards.</li>
<li>Verringerung des Designaufwandes.</li>
<li>
Nutzung bereits gesammelter Designerfahrung.
</li>
<li>
Zusammenführung verschiedener XML-codierter
Inhalte (heterogeneous content syndication).
</li>
</ul>
</slide>
<slide>
<title>Definition Namensraum</title>
<p class="definition">
XML-Namensräume stellen eine XML-basierte Syntax zur
Verfügung, um Element- und Attributnamen eines
Vokabulars eindeutig zu identifizieren und so
Bedeutungsüberschneidungen durch gleichbenannte
Elemente- oder Attribute in zu unterscheidenden
Vokabularen auszuschließen. XML-Namensräume bilden
damit die notwendige Voraussetzung zur freien
dezentralen Entwicklung eigener Vokabulare ohne die
Möglichkeit einer späteren Syndikatisierung zu
verlieren.
</p>
</slide>
<slide>
<title>Konzept der Namensräume</title>
<ul>
<li>
Die W3C-Empfehlung
<a
href="http://www.w3.org/TR/xml-names11/index.html">
<em>
Namespaces in XML 1.1 (Second Edition)
</em>
</a>
wurde gleichzeitig mit der Empfehlung
<a
href="http://www.w3.org/TR/xml11/index.html">
XML 1.1
</a>
veröffentlicht.
</li>
<li>
Idee: Element- und Attributnamen werden derart
erweitert, daß eindeutige Bezeichner entstehen.
</li>
<li>Lösungsmöglichkeiten:</li>
<ul>
<li>
"freier Wildwuchs": Zulassen unkoordinierter
Erweiterungen, die jeder Benutzer selbst
definieren kann. Problem: Gefahr der
Mehrfachnutzung.
</li>
<li>
Koordination: Zulassen von Erweiterungen,
diese werden jedoch an einer zentralen
Stelle erfaßt. Die Bezeichner werden an
einer Registierungsstelle registriert, die
die Eindeutigkeit sicherstellt sowie
Mehfachnutzungen unterbindet. Problem:
Großer Verwaltungsaufwand (vergleichbar
Domain Name System).
</li>
</ul>
</ul>
</slide>
<slide>
<title>
Eindeutige Identifikation durch IRIs und URIs
</title>
<ul>
<li>
Das W3C wollte mit den Namensräumen einen
einfachen Mechanismus zur Identifikation
ermöglichen.
</li>
<li>
Der Mechanismus sollte dezentral sein (leicht zu
administrieren), aber dennoch Eindeutigkeit
garantieren.
</li>
<li>
Im Web werden Ressourcen eindeutig durch URIs
identifiziert. Sie sind zentral und dezentral
gleichzeitig. Es besteht ein zentrales Register,
aber die Handhabung ist dennoch flexibel.
</li>
<li>
Ein(e) URL ist eine Untermenge eine(r)
<a
href="http://www.rfc-editor.org/rfc/rfc3986.txt">
URI
</a>
.
</li>
<li>
Namensräume für XML 1.0 verwenden URIs,
Namensräume für XML 1.1 verwenden
<a
href="http://www.rfc-editor.org/rfc/rfc3987.txt">
Internationalized Resource Identifiers
(IRIs)
</a>
.
</li>
</ul>
</slide>
<slide>
<title>Was steckt hinter URIs?</title>
<ul>
<li>
URIs beinhalten oft Information, ob und wie auf
eine Ressource zugegriffen werden kann
</li>
<ul>
<li>
z.B. mit
<code>
http://www.barbara-zengler.de/vorlesung/
</code>
</li>
<li>
aber auch mit
<code>urn:ietf:rfc:2648</code>
(
<a
href="http://www.ietf.org/rfc/rfc2648.txt?number=2648">
RFC 2648
</a>
)
</li>
<li>
oder mit
<code>
tag:vorlesung@barbara-zengler.de,2007:example
</code>
(
<a
href="http://www.ietf.org/rfc/rfc4151.txt?number=4151">
RFC 4151
</a>
)
</li>
</ul>
<li>
Oft geben URIs Repräsentationen von Ressourcen
zurück
</li>
<ul>
<li>
Die Ressource selbst wird niemals
zurückgegeben (wie sollte man eine Vorlesung
zurückgeben?)
</li>
<li>
Oft sind Repräsentationen sehr wertvoll
(z.B. PDF-Dateien, Videos, Bilder, ...)
</li>
<li>
Die Ressource existiert aber auch ohne eine
Repräsentation!
</li>
</ul>
<li>
URIs sind also deutlich mehr als nur Adressen
von HTML-Seiten.
</li>
</ul>
</slide>
<slide>
<title>Aufräumen mit falschen Vorstellungen</title>
<ul>
<li>Instinktive Annahmen von Web-Benutzern</li>
<ol>
<li>
URIs identifizieren etwas, das man mit einem
Browser abholen kann.
</li>
<li>
URIs identifizieren etwas, das ein Browser
anzeigen kann.
</li>
<li>
Wenn man es nicht abholen und anzeigen kann,
wofür soll es dann gut sein?
</li>
</ol>
<li>
Das sind aber Annahmen, die nicht immer stimmen.
</li>
<ol>
<li>
URIs identifizieren Ressourcen, die oft,
aber nicht immer über das Web zugreifbar
sind.
</li>
<li>
URIs identifizieren Ressourcen, die oft,
aber nicht immer eine für das Web
zugängliche Repräsentation haben.
</li>
<li>
URIs miteinander zu teilen, heißt, eine
Identität miteinander zu teilen. Das kann
bedeuten, daß man eine Bedeutung (Semantik)
teilt, die mit dieser Identität verknüpft
ist.
</li>
</ol>
</ul>
</slide>
<slide>
<title>Namensraumidentifikation</title>
<p class="definition">
Jeder XML-Namensraum wird durch eine gültige IRI
oder URI identifziert. Diese dient ausschließlich
der Benennung, daher muß sie nicht auf eine gültige
Ressource verweisen.
</p>
</slide>
<slide>
<title>IRIs</title>
<ul>
<li>
IRIs sind als Ergänzung zu URIs zu verstehen
</li>
<li>
URIS werden durch eine Untermenge des US-ASCII
Zeichensatzes gebildet
</li>
<li>
IRIs erweitern diese Syntax und erlauben die
Verwendung von Unicode-Zeichen in Identifiern.
</li>
<li>
Dabei besteht ein Algorithmus zur Abbildung von
IRIs in URIs und umgekehrt.
</li>
<li>
IRIs sind jedoch nur dort zu verwenden, wo sie
explizit genannt werden. Sie können nicht
überall anstelle von URIs verwendet werden (z.B.
HTTP).
</li>
</ul>
</slide>
<slide>
<title>Syntax von IRIs und URIs</title>
<listing
src="XML-Grammatik.txt"
line="58-64" />
</slide>
<slide>
<title>Beispiele für gültige URIs</title>
<p>
Nachfolgend sehen Sie eine Vielzahl gültiger URIs
versammelt:
</p>
<ul>
<li>
<code>http://www.fh-augsburg.de/</code>
</li>
<li>
<code>http://meinrechner.fh-augsburg.de/</code>
</li>
<li>
<code>mailto:vorlesung@barbara-zengler.de</code>
</li>
<li>
<code>ftp://ftp.shareware.com/</code>
</li>
<li>
<code>
file:///C:/bsz/web/vorlesung/intro.html#(16)
</code>
</li>
<li>
<code>#(16)</code>
</li>
<li>
<code>
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
</code>
</li>
<li>
<code>urn:oid:1.3.6.1.2.1.27</code>
</li>
<li>
<code>org.omg/standards/UML</code>
</li>
</ul>
</slide>
<slide>
<title>IRIs, URIs, URLs, URNs (1)</title>
<ul>
<li>
Uniform Resource Identification (URI) ist ein
abstrakter Oberbegriff eineindeutig
identifizierbarer Web-Ressourcen. Sie sind
</li>
<ul>
<li>eindeutig über Zeit und Raum</li>
<li>für Menschen leicht zu merken</li>
<li>
mit keinen Registrierungskosten verbunden
</li>
<li>
unabhängig von der tatsächlichen
Lokalisation der so identifizierten
Ressource
</li>
</ul>
<li>
Die Menge aller URIs wird gebildet durch die
drei disjunkten Bezeichnerschemata URL, URN und
URC.
</li>
<li>IRIs sind eine Obermenge von URIs.</li>
</ul>
</slide>
<slide>
<title>IRIs, URIs, URLs, URNs (2)</title>
<img
src="uriurlurn.gif"
style="margin : 4%" />
</slide>
<slide>
<title>URL</title>
<ul>
<li>
<em>Uniform Resource Location (URL)</em>
: benennt den physischen Aufenthaltsort einer
Ressource, z.B. den Ablageort einer HTML-Seite
</li>
<li>Beispiele:</li>
<ul>
<li>
<code>
http://www.barbara-zengler.de/vorlesung/toc.html
</code>
</li>
<li>
<code>http://www.fh-augsburg.de/</code>
</li>
<li>
<code>
mailto:vorlesung@barbara-zengler.de
</code>
</li>
<li>
<code>
ftp://example.org/aDirectory/aFile
</code>
</li>
<li>
<code>news:comp.infosystems.www</code>
</li>
<li>
<code>tel:+1-816-555-1212</code>
</li>
<li>
<code>
ldap://ldap.example.org/c=GB?objectClass?one
</code>
</li>
<li>
<code>urn:oasis:SAML:1.0</code>
</li>
</ul>
</ul>
</slide>
<slide>
<title>URN</title>
<ul>
<li>
<em>Uniform Resource Name (URN)</em>
: ein eineindeutiger Name einer beliebigen
Resource. Für die URN existiert kein
Auflösungsmechanismus, durch den die physische
Lokation ermittelt werden könnte. URNs dienen
daher ausschließlich der eindeutigen Benennung!
</li>
<li>Syntax:</li>
<ul>
<li>
Beginn mit der definierten Zeichenkette
<code>urn</code>
</li>
<li>
Danach folgt eine Zeichenkette, mit der die
Ressource weiter klassifiziert wird. Der
URI-Raum wird hiermit weiter partitioniert.
Diese namespace ID genannten Zeichenketten
unterliegen einem globalen
Registrierungszwang, um ihre Eindeutigkeit
zu gewährleisten. Diese
Unterstrukturierungen sind in der Abbildung
als ns1 bis ns3 benannt.
</li>
</ul>
<li>Beispiele:</li>
<ul>
<li>
<code>
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
</code>
</li>
<li>
<code>urn:oid:1.3.6.1.2.1.27</code>
</li>
</ul>
</ul>
</slide>
<slide>
<title>URC</title>
<ul>
<li>
URCs verbinden die reine Benennung mit dem
physischen Aufenthaltsort.
</li>
<li>
Eine URC verweist in eine Metadatenstruktur, die
die physischen Ressourcen-Aufenthaltsorte
katalogisiert. Dieser URI-Typ ist jedoch
gegenwärtig kaum verbreitet.
</li>
</ul>
</slide>
<slide>
<title>Namensräume verwenden</title>
<ul>
<li>
Einfachste Idee: Namensraum komplett einfach vor
den Element- oder Attributnamen schreiben und
vielleicht durch einen Doppelpunkt zu trennen.
</li>
<li>
Als Ergebnis hätte man eindeutige Element- und
Attributnamen.
</li>
</ul>
<listing
src="Rechnung1-mit-gewollten-Namensraeumen.xml" />
</slide>
<slide>
<title>Namensräume verwenden</title>
<ul>
<li>
Problem dabei: Das Zeichen
<code>/</code>
(Slash) ist in Bezeichnern nicht erlaubt:
</li>
<ul>
<li>
Unicode des Zeichens
<code>/</code>
:
<code>U+002F</code>
(=
<code>#x2F</code>
)
</li>
<li>Erlaubte Zeichen in Bezeichnern:</li>
</ul>
</ul>
<listing
src="XML-Grammatik.txt"
line="19-21" />
</slide>
<slide>
<title>Namensräume verwenden - Bindung (1/2)</title>
<ul>
<li>Ausweg: zweistufiges Verfahren.</li>
<ul>
<li>
URIs werden einem Präfix zugeordnet (sie
werden an das Präfix
<q>gebunden</q>
).
</li>
<li>
Präfixe werden dann Element- und
Attributnamen vorangestellt. Sie werden
damit in den Namensraum übernommen.
</li>
</ul>
<li>
Deklaration von Namensräumen (in
<a
href="http://www.w3.org/TR/2006/REC-xml-names11-20060816/#ns-decl">
Namespaces in XML 1.1 (Second Edition)
</a>
nachschlagen)
</li>
</ul>
<listing
src="XML-Grammatik.txt"
line="67-72" />
</slide>
<slide>
<title>Namensräume verwenden - Bindung (2/2)</title>
<ul>
<li>
Bindung einer URI an Präfix geschieht durch das
reservierte Attribut
<code>xmlns</code>
.
</li>
<li>
Nach der Bindung der URI an das Präfix kann
dieses jedem Element oder Attribut vorangestellt
werden.
</li>
<li>
Es entsteht ein
<em>qualifizierter Name</em>
:
</li>
</ul>
<p class="definition">
Ein
<em>qualifizierter Name</em>
ist ein Name, der der Interpretation von
Namensräumen unterliegt.
</p>
</slide>
<slide>
<title>Qualifizerte Namen</title>
<ul>
<li>
Setzt sich zusammen aus Präfix und lokalem
Namen.
</li>
<li>
Der Doppelpunkt darf kein Bestandteil des
lokalen Namens mehr sein.
</li>
<li>
Hiermit wird die Bildung der Namen aus der
XML-Spezifikation eingeschränkt - dort ist der
Doppelpunkt prinzipiell erlaubt, wenngleich auch
seine Verwendung nicht zu empfehlen ist.
</li>
</ul>
<listing
src="XML-Grammatik.txt"
line="75-80" />
</slide>
<slide>
<title>Verarbeitung durch XML-Prozessoren</title>
<ul>
<li>
Ein XML-Prozessor ersetzt jedes Auftreten eines
deklarierten Präfixes während der Verarbeitung
eines DOkuments durch die gebundene URI.
</li>
<li>
Man nennt Prozessoren, die die
Namensraum-spezifikation unterstützen
<em>namespace aware</em>
.
</li>
<li>
Prozessoren, die Namensräume nicht unterstützen,
betrachten den qualifizierten Namen einfach als
Bezeichner.
</li>
<li>
Auch die Deklaration des Namensraumes wird von
diesen Prozessoren als gewöhnliches Attribut
betrachtet.
</li>
</ul>
</slide>
<slide>
<title>Clark-Notation</title>
<ul>
<li>
James Clark hat eine
<a href="http://www.jclark.com/xml/xmlns.htm">
Notation
</a>
erdacht, mit deren Hilfe er Namensräume zu
erklären versucht.
</li>
<li>
Diese Notation findet sich oft in Mailinglisten,
etc.
</li>
<li>
Die Syntax hat die Form
<code>{namespaceName}elementName</code>
</li>
<li>
Beispiel:
<code>
<{http://www.example.com/sales}Rechnung>
</code>
</li>
<li>
Diese Schreibweise ist geläufig, aber
<em>nicht spezifikationskonform</em>
.
</li>
<li>
Strukturen dieses Stils sind
<em>keine gültigen XML-Dokumente</em>
!
</li>
</ul>
</slide>
<slide>
<title>Beispiel: Rechnung mit Namensräumen</title>
<ul>
<li>
Bindung der URI
<code>http://www.xyz.com/sales</code>
an das Präfix
<code>myNS1</code>
</li>
<li>
Bindung steht im definierenden Element (local
name: Rechnung) und allen untergeordneten
Elementen zur Verfügung.
</li>
</ul>
<listing
src="namespace11.xml"
line="1-15" />
</slide>
<slide>
<title>Stil von Namensraumdeklarationen</title>
<ul>
<li>
In der Praxis begegnen einem oft wilde
Deklarationen von Namensräumen.
</li>
<li>
Namensräume können
<a
href="http://lists.xml.org/archives/xml-dev/200204/msg00170.html">
neurotisch, psychotisch, borderline oder
normal
</a>
verwendet werden
</li>
<ul>
<li>
Neurotisch: das gleiche Präfix wird in einem
Dokument verschiedenen Namensräumen
zugeordnet.
</li>
<li>
Borderline: der gleiche Namensraum wird in
einem Dokument an verschiedene Präfixe
gebunden.
</li>
<li>
Psychotisch: der gleiche Namensraum wird im
gleichen Bereich eines Dokuments an
verschiedene Präfixe gebunden.
</li>
<li>
Normal: alle Namensräume werden im
Wurzelelement deklariert und sind nicht
psychotisch.
</li>
</ul>
<li>
Die Verarbeitung dieser ungesunden Verwendungen
erschwert das Verarbeiten von Namensräumen.
</li>
<li>
Man sollte XML so verwenden, daß es für Menschen
<q>lesbar</q>
bleibt.
</li>
</ul>
</slide>
<slide>
<title>
Beispiele schlechter Namensraumverwendungen
</title>
<listing
src="neurotic.xml"
line="1-9" />
<listing
src="borderline.xml"
line="1-9" />
<listing
src="psychotic.xml"
line="1-9" />
</slide>
<slide>
<title>
Beispiel normale Namensraumverwendung (XHTML)
</title>
<listing src="namespace12.xml" />
</slide>
<slide>
<title>Namensraumpräfixe</title>
<ul>
<li>
Namensraumpräfixe können durch den Anwender frei
vergeben werden
</li>
<li>
Einziger Zweck: abkürzende Schreibweise. Sie
sind für die Auflösung eines Namensraums
unerheblich.
</li>
<li>
Zwei Elemente oder Attribute sind gleich, wenn
ihr lokaler Name und ihr Namensraumidentifier
übereinstimmen.
</li>
</ul>
</slide>
<slide>
<title>Beispiel Namensraumauflösung</title>
<ul>
<li>
Die Elemente der hier gezeigten (psychotischen)
Beispiele sind alle im Namensraum
<code>http://www.example.com</code>
</li>
</ul>
<listing src="prefix1.xml" />
<listing src="prefix2.xml" />
</slide>
<slide>
<title>Überschreiben des Vorgabenamensraums</title>
<ul>
<li>
Es ist platzraubend, überflüssig und
unpraktikabel, für jedes Element innerhalb eines
Namensraumes diesen explizit anzugeben
</li>
<li>
Einfache Gültigkeitsregel aus den
Programmiersprachen: ein geöffneter Block
beinhaltet alle Elemente bis zum Blockendesymbol
und faßt sie zu einem Gültigkeitsbereich
zusammen-
</li>
<li>
Dieses Prinzip wird auch für XML-Dokumente
angewendet: das
<code>xmlns</code>
-Attribut ohne trennenden Doppelpunkt und Präfix
definiert einen
<em>Vorgabenamensraum.</em>
</li>
<li>
Da mehrere Attribute gleichen Namens für ein
Element nicht erlaubt sind, wird verhindert, daß
der Vorgabenamensraum nicht mehrfach
überschrieben wird.
</li>
</ul>
</slide>
<slide>
<title>Beispiel Rechnung</title>
<table border="0">
<tr>
<td>
<listing src="namespace11.xml" />
</td>
<td>
<listing src="namespace13.xml" />
</td>
</tr>
</table>
</slide>
<slide>
<title>Beispiel XHTML</title>
<img
style="margin : 0% ; width : 4% ; position: fixed; right:25px; top: 25px; float:right"
src="screenshot-amaya.gif" />
<table border="0">
<tr>
<td>
<listing src="namespace12.xml" />
</td>
<td>
<listing src="namespace14.xml" />
</td>
</tr>
</table>
</slide>
<slide>
<title>Beispiel XHTML - grafische Darstellung</title>
<img
style="margin : 4% ;"
src="namespaces.gif" />
</slide>
<slide>
<title>Präfix XOR Vorgabenamensraum</title>
<ul>
<li>
Ein Element kann entweder durch ein Präfix oder
durch Überschreiben des Vorgabenamensraumes
einem Namensraum zugeordnet werden.
</li>
<li>
Beides gleichzeitig ist widersprüchlich und
damit illegal (z.B.
<code><xyz:abc xmlns="..." ..></code>
)
</li>
</ul>
</slide>
<slide>
<title>Namensräume im realen Einsatz</title>
<p>
Das Beispiel zeigt die Verwendung zweier Vokabulare
(SVG und MathML), die beide ein mit set benanntes
Element definieren. Die qualifizierten Namen beider
Elemente unterscheiden sich, da sie dem Elementnamen
die Namensraum-URI voranstellen.
</p>
<listing src="namespace15.xml" />
</slide>
<slide>
<title>Präzedenz von Namensräumen</title>
<ul>
<li>
Eine Namensraumzuordnung mittels Präfix hat
Vorrang gegenüber einem evtl. überschriebenen
Vorgabenamensraum.
</li>
<li>
Beispiel: Der überschriebene Namensraum wird auf
die Kinder vererbt.
</li>
<li>
In welchen Namensräumen befinden sich die
Elemente
<code>ElementA</code>
,
<code>ElementB</code>
und
<code>ElementC</code>
? (Auflösung mit Taste
<code>n</code>
)
</li>
<note>
<li>
<code>ElementA</code>
: Namensraum
<code>urn:namspaces:Namespace1</code>
</li>
<li>
<code>ElementB</code>
: Namensraum
<code>urn:namspaces:Namespace1</code>
</li>
<li>
<code>ElementC</code>
: Namensraum
<code>urn:namespace:Namespace2</code>
</li>
</note>
</ul>
<listing src="namespace16.xml" />
</slide>
<slide>
<title>Aufheben von Namensraumzuweisungen</title>
<ul>
<li>
Eine Namensraumdefinition kann aufgehoben
werden, indem der Vorgabenamensraum mit der
leeren Zeichenkette überschrieben wird. (z.B.
<code><ElementX xmlns=""/></code>
)
</li>
<li>
Die Zuordnung von Präfixen zu Namensräumen kann
ab XML 1.1 rückgängig gemacht werden (in
<a
href="http://www.w3.org/TR/2006/REC-xml-names11-20060816/#scoping">
Namensraum-Spezifikation nachlesen
</a>
)
</li>
<li>Beispiel:</li>
</ul>
<listing src="namespace-undeclared.xml" />
</slide>
<slide>
<title>Namensräume für Attribute</title>
<ul>
<li>
Eine Namensraumdeklaration auf Elementebene wird
nicht auf Attribute übertragen.
</li>
<li>
Dies ist verwunderlich, speziell wenn man sich
die Baumstruktur eines XML-Dokuments vor Augen
führt (ein Attribut ist ebenso ein Kindknoten
eines Elements wie ein evtl. Kindelement)
</li>
<li>
Es wird damit argumentiert, daß Attribute eine
besondere Rolle zur Informationsdarstellung
spielen: Attribute sollten unabhängig vom
aktuell umgebenden Element sein und daher nur
zur Darstellung von Daten herangezogen werden,
die keinen direkten Bezug zum sie umgebenden
Element haben (Nicht Elementinhalt, sondern
Information über das Element).
</li>
<li>
Attribute müssen somit immer explizit mit einem
Namensraumpräfix ausgezeichnet werden, um sie
einem Namensraum zuzuordnen.
</li>
</ul>
</slide>
<slide>
<title>Beispiel: Attribute mit Namensräumen</title>
<listing src="Namensraeume-fuer-Attribute.xml" />
<ul>
<li>
Weder
<code>att1</code>
von
<code>ElementB</code>
noch von
<code>ElementD</code>
befinden sich in einem Namensraum.
</li>
<li>
Das Attribut
<code>att2</code>
mit dem Wert
<code>xyz</code>
dagegen ist dem Namensraum
<code>http://www.example.com/ns2</code>
zugeordnet.
</li>
<li>
Der Namensraum als Bestandteil des
identifizierenden Namens von Elementen und
Attributen macht es möglicht, daß
<code>att2</code>
<q>mehrfach auftreten</q>
kann. Mit dem Namensraum ist gewährleistet, daß
es eindeutig identifiziert werden kann.
</li>
</ul>
</slide>
<slide>
<title>Namensraumvererbung</title>
<p class="definition">
Namensräume, die durch Überschreiben des
Vorgabenamensraumes zugewiesen werden wirken sich
ausschließlich auf Elemente und deren direkte oder
transitive Kindelemente aus, sofern diese den
Namensraum nicht wieder verändern.
<br />
Namensräume, die durch explizite Präfixangabe
zugewiesen werden, wirken sich ausschließlich auf
dasjenige Element aus vor dessen Name das Präfix
plaziert ist.
<br />
Namensräume für Attribute werden ausnahmslos durch
explizite Präfixangabe festgelegt und gelten
ausschließlich für das Attribut selbst.
</p>
</slide>
<slide>
<title>Auswertungsregeln für Namensräume</title>
<p>
Ein Element befindet sich in demjenigen
Namensraum...
</p>
<ol>
<li>
... an den das vorangestellte Präfix gebunden
ist.
<br />
Verfügt das Element über kein Namensraumpräfix,
so befindet es sich in demjenigen Namensraum ...
</li>
<li>
... der auf diesem Element durch Überschreibung
des Vorgabenamensraumes definiert wurde.
<br />
Findet für dieses Element keine Überschreibung
des Vorgabenamensraumes statt, so befindet es
sich in demjenigen Namensraum ...
</li>
<li>
... der für das Elternelement gilt, sofern er
dort Vorgabenamensraum ist.
<br />
Man beachte: Das
<q>gilt</q>
im vorangehenden Satz umschließt sich nicht nur
die Überschreibung des Vorgabenamensraumes im
direkten Elternelement, sondern auch eine dort
geltende Namensraumüberschreibung die in dessen
Elternelement oder dessen Elternelement ...
stattfand.
<br />
Findet in keinem der Elternelemente eine
Überschreibung des Vorgabenamensraumes statt, so
befindet sich das Element in demjenigen
Namensraum ...
</li>
<li>
... der leer ist (d.h. im leeren Namensraum).
</li>
</ol>
<p>
Ein Attribut befindet sich in demjenigem Namensraum,
der durch explizite Präfixangabe festelegt wurde.
</p>
</slide>
<slide>
<title>Zusammenfassung Namensräume</title>
<ul>
<li>
Jede beliebige URI kann an eigendefinierte
Präfixe gebunden werden.
</li>
<li>
Jedes Element übernimmt den überschriebenen
Vorgabenamensraum seines Elternelements, sofern
es keinen eigenen definiert.
</li>
<li>
Elemente oder Attribute ohne Namensraumzuordnung
(die auch keine von ihrem hierarchisch
höherstehenden Element übernehmen) befinden sich
im Standardnamensraum (=leerer Namensraum).
</li>
<li>
Attribute ohne Namensraumpräfix befinden sich im
leeren Namensraum.
</li>
</ul>
</slide>
</part>
</presentation>
<!-- Ende Namensräume -->
<presentation id="uebungsaufgabenNamensraeume">
<title short="uebungsaufgabenNamensraeume">
Übungsaufgaben zum Thema Namensräume
</title>
<date>2008-10-20</date>
<toc id="resources" />
<toc id="abstract">
Übungsaufgaben zum Thema XML-Dokumente / Wohlgeformtheit.
</toc>
<part>
<title>Übungsaufgaben zu Namensräumen</title>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 1
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 1
</title>
<p>
Nachfolgend finden Sie verschiedene
Multiple-Choice Aufgaben zu Namensräumen. Es
können je Aufgabe auch mehrere Antworten korrekt
sein.
</p>
<p>
Finden Sie die richtige(n) Antwort(en)! Nehmen
Sie bei Bedarf das Vorlesungsskript zu Hilfe.
</p>
<!-- <p>
Einblenden der Lösungen (sie befinden sich
jeweils am Ende der Seite) durch Drücken der
Taste
<code>n</code>
!
</p> -->
<ul>
<li>Verwendung</li>
<ul>
<li>
A) XML-Namensräume sind die
hierarchische Sammlung von
XML-Elementen.
</li>
<li>
B) XML-Namensräume gruppieren
XML-Elemente und -Attribute.
</li>
<li>
C) XML-Namensräume sind durch einen
Hyperlink eindeutig adressierbar.
</li>
<li>
D) XML-Namensräume werden durch eine URI
identifiziert.
</li>
<li>
E) XML-Namensräume werden durch eine URI
benannt.
</li>
</ul>
<!-- <note>
<li>
Lösung: Die Alternativen B und D sind
korrekt!
</li>
</note> -->
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 2
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 2
</title>
<ul>
<li>Definition</li>
<ul>
<li>
A) Namensräume müssen für jedes
XML-Vokabular definiert werden.
</li>
<li>
B) Namensräume können ausschließlich
durch Standardisierungsgremien definiert
werden.
</li>
<li>
C) Namensräume können wahlfrei durch den
Ersteller eines XML-Vokabulars definiert
werden.
</li>
<li>
D) Namensräume müssen beim World Wide
Web Consortium registriert werden.
<br />
Es weist ihnen dann eine eineindeutige
URL zu.
</li>
<li>
E) Namensräume können durch eine URL
identifiziert werden.
</li>
</ul>
<!-- <note>
<li>
Lösung: Die Alternativen C und E sind
korrekt!
</li>
</note> -->
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 3
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 3
</title>
<ul>
<li>Syntax</li>
<ul>
<li>
A) Die Deklaration der
Namensraumattribute muß in der
Dokumentgrammatik erfolgen.
<br />
Dort sind sie als optionale Attribute
definiert.
</li>
<li>
B) Namensräume müssen zwingend als
Wurzelelement (
<em>document element</em>
) des XML-Dokuments definiert werden.
</li>
<li>
C) Namensräume können ausschließlich für
Elemente definiert werden.
</li>
<li>
D) Die Redefinition bereits gebundener
Namensraumpräfixe ist zulässig.
</li>
<li>
E) Wird für ein Element kein Namensraum
definiert, so ist sein Verhalten im
Namensraumkontext undefiniert.
</li>
</ul>
<!-- <note>
<li>
Lösung: Die Alternative D ist korrekt!
</li>
</note> -->
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 4
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 4
</title>
<ul>
<li>
Namensraumauflösung -- Explizite Definition
</li>
<ul>
<li>Gegeben sei folgendes XML-Dokument.</li>
<listing
src="uebung-namensraeume-aufg4.xml">
</listing>
<li>
Zur besseren Übersichtlichkeit sind den
Namensräumen folgende Nummern
zugewiesen:
</li>
<ol>
<li>
<em>(leerer Namensraum)</em>
</li>
<li>
<code>http://www.example.com</code>
</li>
<li>
<code>
http://www.example.com/bar
</code>
</li>
<li>
<code>
http://www.example.com/foo
</code>
</li>
<li>
<code>
http://www.fh-augsburg.de
</code>
</li>
<li>
<code>
http://www.barbara-zengler.de
</code>
</li>
<li>
<code>http://www.beispiel.de</code>
</li>
<li>
<code>http://www.w3.org</code>
</li>
</ol>
<li>
Folgende Tabelle zeigt unterhalb der
Buchstaben A-E fünf alternative
Namensraumzuordnungen für alle Elemente,
unter Verwendung der soeben definierten
Nummern.
<br />
Finden Sie die richtige!
</li>
<table
width="80%"
border="1">
<thead>
<tr>
<th>
Element- oder Attributename
</th>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
<th>E</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>root</code>
</td>
<td>7</td>
<td>7</td>
<td>1</td>
<td>5</td>
<td>7</td>
</tr>
<tr>
<td>
<code>elemA</code>
</td>
<td>7</td>
<td>1</td>
<td>7</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemB</code>
</td>
<td>5</td>
<td>5</td>
<td>5</td>
<td>1</td>
<td>5</td>
</tr>
<tr>
<td>
<code>elemC</code>
</td>
<td>5</td>
<td>1</td>
<td>7</td>
<td>8</td>
<td>1</td>
</tr>
<tr>
<td>
<code>attA</code>
</td>
<td>7</td>
<td>7</td>
<td>1</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>
<code>elemD</code>
</td>
<td>7</td>
<td>1</td>
<td>7</td>
<td>5</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemE</code>
</td>
<td>7</td>
<td>1</td>
<td>6</td>
<td>8</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemF</code>
</td>
<td>5</td>
<td>2</td>
<td>5</td>
<td>5</td>
<td>4</td>
</tr>
<tr>
<td>
<code>attB</code>
</td>
<td>5</td>
<td>3</td>
<td>6</td>
<td>7</td>
<td>3</td>
</tr>
<tr>
<td>
<code>elemG</code>
</td>
<td>5</td>
<td>2</td>
<td>5</td>
<td>1</td>
<td>8</td>
</tr>
</tbody>
</table>
</ul>
<!-- <note>
<li>
Lösung: Die Alternative E ist korrekt!
</li>
</note> -->
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 5
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 5
</title>
<ul>
<li>
Namensraumauflösung -- Implizite Definition
</li>
<ul>
<li>Gegeben sei folgendes XML-Dokument.</li>
<listing
src="uebung-namensraeume-aufg5.xml">
</listing>
<li>
Zur besseren Übersichtlichkeit sind den
Namensräumen folgende Nummern
zugewiesen:
</li>
<ol>
<li>
<em>(leerer Namensraum)</em>
</li>
<li>
<code>urn:example.com:bar</code>
</li>
<li>
<code>urn:example.com:foo</code>
</li>
<li>
<code>
urn:xmlns:fh-augsburg.de:vorlesung:XML
</code>
</li>
<li>
<code>urn:xmlns:beispiel.de</code>
</li>
</ol>
<li>
Folgende Tabelle zeigt unterhalb der
Buchstaben A-E fünf alternative
Namensraumzuordnungen für alle Elemente,
unter Verwendung der soeben definierten
Nummern.
<br />
Finden Sie die richtige!
</li>
<table
width="80%"
border="1">
<thead>
<tr>
<th>
Element- oder Attributename
</th>
<th>A</th>
<th>B</th>
<th>C</th>
<th>D</th>
<th>E</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>theDocument</code>
</td>
<td>1</td>
<td>1</td>
<td>4</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>
<code>elemA</code>
</td>
<td>1</td>
<td>4</td>
<td>4</td>
<td>1</td>
<td>5</td>
</tr>
<tr>
<td>
<code>elemB</code>
</td>
<td>4</td>
<td>4</td>
<td>5</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>
<code>att1</code>
</td>
<td>5</td>
<td>1</td>
<td>1</td>
<td>3</td>
<td>5</td>
</tr>
<tr>
<td>
<code>elemC</code>
</td>
<td>4</td>
<td>1</td>
<td>4</td>
<td>5</td>
<td>1</td>
</tr>
<tr>
<td>
<code>att2</code>
</td>
<td>5</td>
<td>1</td>
<td>4</td>
<td>5</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemD</code>
</td>
<td>5</td>
<td>1</td>
<td>4</td>
<td>5</td>
<td>3</td>
</tr>
<tr>
<td>
<code>elemE</code>
</td>
<td>3</td>
<td>3</td>
<td>1</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>
<code>elemF</code>
</td>
<td>1</td>
<td>4</td>
<td>1</td>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>
<code>elemG</code>
</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>4</td>
<td>1</td>
</tr>
<tr>
<td>
<code>elemH</code>
</td>
<td>2</td>
<td>1</td>
<td>3</td>
<td>1</td>
<td>1</td>
</tr>
</tbody>
</table>
</ul>
<!-- <note>
<li>
Lösung: Die Alternative B ist korrekt!
</li>
</note> -->
</ul>
</slide>
</part>
<part>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 6
</title>
<slide>
<title>
Übungsaufgaben zu Namensräumen - Aufgabe 6
</title>
<ul>
<li>Namensraumbildung</li>
<ul>
<li>Gegeben seien folgende Aussagen.</li>
<ul>
<li>
Das Element Information Item
<code>elemA</code>
befindet sich im Namensraum
<code>
http://www.fh-augsburg.de
</code>
</li>
<li>
Das Element Information Item
<code>elemB</code>
befindet sich im Namensraum
<code>
http://www.barbara-zengler.de/vorlesung/
</code>
</li>
<li>
Die Attribute Information Items
<code>href</code>
,
<code>actuate</code>
und
<code>show</code>
befinden sich im Namensraum
<code>
http://www.w3.org/1999/xlink
</code>
</li>
<li>
Die Element Information Items
<code>elemC</code>
und
<code>elemD</code>
befinden sich im Namensraum
<code>http://www.beispiel.de</code>
</li>
<li>
Das Element Information Item
<code>elemE</code>
befindet sich im Namensraum
<code>http://www.example.com</code>
</li>
</ul>
<li>
Frage: Welche der folgenden Dokumente
erfüllen diese Aussagen?
</li>
<li>Dokument A</li>
<listing src="dokumentA.xml"></listing>
<li>Dokument B</li>
<listing src="dokumentB.xml"></listing>
<li>Dokument C</li>
<listing src="dokumentC.xml"></listing>
<li>Dokument D</li>
<listing src="dokumentD.xml"></listing>
<li>Dokument E</li>
<listing src="dokumentE.xml"></listing>
</ul>
<!-- <note>
<li>
Lösung: Die Dokumente A, C und E sind
korrekt!
</li>
</note> -->
</ul>
</slide>
</part>
</part>
</presentation>
<!-- Ende Übungsaufgaben zu Namensräumen -->
<!-- DTD -->
<presentation id="dtd">
<title short="DTD">Document Type Definition (DTD)</title>
<date>2008-10-27</date>
<toc id="resources"></toc>
<toc id="abstract">
Die XML-Spezifikation definiert ein Format für strukturierte
Daten (XML-Dokumente) und eine grammatikbasierte Sprache, um
Regelsätze für diese Dokumente zu definieren (DTD). In
SGML-basierten Systemen waren DTDs oft sehr komplexe und
mächtige Konstrukte, mit denen die Verarbeitung von
SGML-Dokumenten stark gesteuert wurde. XML vereinfacht die
DTDs sehr stark, und ihre Verwendung hat sich noch mehr
vereinfacht: DTDs werden oft überhaupt nicht verwendet oder
von Tools aus Beispieldokumenten generiert (das gilt auch
für andere Schemata). DTDs haben heute gegenüber den
XML-Schemasprachen stark an Bedeutung verloren. Schemata an
sich sollten Sie jedoch für nicht triviale XML-Anwendungen
sehr ernst nehmen. Sie bilden die Repräsentation des
Datenmodells der Applikation (das oft viel zu wenig
spezifiziert wird).
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract" />
</p>
</slide>
<part>
<title>DTD Basics</title>
<slide>
<title>Grundzüge der DTDs</title>
<ul>
<li>
Eine DTD ist ein Schema für eine Menge von
Dokumenten
</li>
<li>
Es stellt eine Grammatik für Dokumente bereit.
</li>
<ul>
<li>
Es kann ein Dokument zu einer DTD geben, es
kann aber auch Millionen Dokumente geben
(HTML)
</li>
<li>
In den meisten Fällen werden DTDs als
separate Ressource verwaltet, sie können
aber auch Bestandteil eines XML-Dokumentes
sein.
</li>
</ul>
<li>
Eigene Informationseinheiten, vom XML-Dokument
losgelöst.
</li>
<li>Vergleich mit der Objektorientierung:</li>
<ul>
<li>
DTDs kann man sich als
<em>Klasse</em>
vorstellen, die wie eine Schablone die
Struktur und die inhaltlichen Eigenschaften
einer Reihe von Ausprägungen festlegt.
</li>
<li>
In dieser Analogie kann man sich ein
XML-Dokument als ein
<em>Objekt</em>
einer bestimmten Klasse vorstellen.
</li>
</ul>
<li>
Möglichkeiten, den Inhalt eines XML-Dokuments
mit DTDs zu beschreiben, sind sehr begrenzt.
</li>
</ul>
</slide>
<slide>
<title>Gültigkeit</title>
<ul>
<li>
Die XML kennt zwei
<q>Zustände</q>
von Dokumenten:
<em>wohlgeformt</em>
und
<em>gültig</em>
.
</li>
<li>
<em>
<a
href="http://www.barbara-zengler.de/vorlesung/dokumente-und-daten.html#(63)">
Wohlgeformte
</a>
</em>
XML-Dokumente genügen dem grundlegenden
Regelsatz der XML-Spezifikation.
</li>
<ul>
<li>
Sie entsprechen den Regeln der XML-Grammatik
und können deshalb von einem XML-Prozessor
ausgelesen werden.
</li>
<li>
Sie genügen zusätzlichen Einschränkungen
(z.B. "Zu jedem Start-Tag existiert genau
eine Ende-Tag.")
</li>
<li>
Alles zusammengenommen bedeutet dies, daß
wohlgeformte XML-Dokumente in eine
Baumstruktur überführt werden können.
</li>
</ul>
<li>
<em>gültige</em>
(valid) Dokumente sind erfolgreich gegen ein
Schema (DTD oder XML-Schema) validiert worden.
</li>
<ul>
<li>
Bevor ein Dokument gültig sein kann, muß es
wohlgeformt sein.
</li>
<li>
Alle Elemente und Attribute müssen im Schema
definiert sein.
</li>
<li>
Elemente und Attribute müssen gemäß ihrer
Definition im Dokument verwendet worden
sein.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Gültigkeit und Wohlgeformtheit</title>
<img
src="valid-documents.png"
style="width : 80% ; margin : 4% ; " />
</slide>
<slide>
<title>Definition Gültigkeit</title>
<p class="definition">
Ein XML-Dokument heißt
<em>gültig</em>
(valid), wenn es über eine Dokument-Typ-Definition
verfügt und konform zu dieser aufgebaut ist.
<br />
(
<a
href="http://www.w3.org/TR/2006/REC-xml11-20060816/index.html#dt-valid">
In XML-Spezifikation nachschlagen
</a>
)
</p>
</slide>
<slide>
<title>Klassen von XML-Prozessoren</title>
<ul>
<li>
Entsprechend gibt es zwei Klassen von
XML-Prozessoren
</li>
<ul>
<li>Nicht-validierende XML-Prozessoren</li>
<li>Validierende XML-Prozessoren</li>
</ul>
<li>
Die Wohlgeformtheit eines Dokuments wird durch
beide Arten von Prozessoren geprüft.
</li>
<li>
Validierende Prozessoren hingegen testen
zusätzlich die Konformität eines XML-Dokuments
zu seiner DTD. (
<a
href="http://www.w3.org/TR/2006/REC-xml11-20060816/index.html#proc-types">
In XML-Spezifikation nachlesen
</a>
)
</li>
<li>
Am Markt verfügbare XML-Editiertools beinhalten
üblicherweise validierende XML-Prozessoren (auch
gegenüber anderen Schemasprachen) oder bieten
diese gegen Aufpreis an.
</li>
<ul>
<li>
<a href="http://www.altova.com/">
Altova XML Spy
</a>
</li>
<li>
<a
href="http://www.eclipse.org/webtools/">
Eclipse XML Editors and Tools
</a>
</li>
<li>
<a
href="http://xml-copy-editor.sourceforge.net/">
XML Copy Editor
</a>
</li>
</ul>
<li>
Zudem sind eigenständige Parser-Module
verfügbar, die die Validierung von
XML-Dokumenten beherrschen.
</li>
</ul>
</slide>
<slide>
<title>DTDs in Dokumente einbinden</title>
<ul>
<li>
DTDs werden mit Hilfe der sogenannten
<em>DOCTYPE</em>
-Deklaration aus XML-Dokumenten referenziert.
</li>
<li>
Sie liegen üblicherweise in einer separaten
Datei vor, deren Ablageort im Prolog einer
XML-Datei angegeben wird.
</li>
<li>
DTDs können aber auch (ganz oder teilweise) in
XML-Dokumente eingebettet sein.
</li>
<li>
DTD-Anteile, die in eine Dokument eingebettet
sind, werden als
<em>internal Subset</em>
bezeichnet. Externe Anteile nennt man
<em>external Subset</em>
.
</li>
<li>
Das external Subset wird mit Hilfe von
<em>System</em>
oder
<em>Public Identifiern</em>
angegeben.
</li>
<li>
Die DTD-Syntax erinnert leicht an XML-Syntax
(ist aber keine!) und hat dabei insbesondere
Ähnlichkeit mit den Kommentaren in XML.
</li>
</ul>
</slide>
<slide>
<title>Grammatik und Beispiel</title>
<note>
Öffnende Winkelklammer, Ausrufezeichen, dann SYSTEM-
oder PUBLIC-Deklaration
</note>
<note>
System Identifier sind URIs, Public Identifier haben
oft eine bestimmte Notation
</note>
<p>Grammatik von Dokumenttyp-Deklarationen</p>
<listing
src="XML-Grammatik.txt"
line="83-87" />
<p>
Beispiel für ein XML-Dokument, dessen nicht
öffentliche DTD als externe Ressource vorliegt:
</p>
<listing src="externe-dtd-deklaration.xml" />
<p>Beispiel für ein XML-Dokument mit interner DTD:</p>
<listing src="interne-dtd-deklaration.xml" />
</slide>
<slide>
<title>DTDs definieren...</title>
<ul>
<li>
Strukturen verschiedener Elemente aus dem XML
Information Set:
</li>
<ul>
<li>Elemente</li>
<li>Attribute</li>
<li>Entitäten</li>
<li>Notationen</li>
<li>Processing Instructions</li>
</ul>
</ul>
</slide>
<slide>
<title>Definition von Elementen</title>
<ul>
<li>
Elemente sind offensichtliche Möglichkeit,
XML-Dokumente zu strukturieren.
</li>
<li>
Jedes XML-Dokument hat mindestens ein
Wurzelelement. In einer DTD wird allerdings
nicht festgelegt, welches Element Wurzelelement
eines Dokuments ist.
</li>
<li>
In der DTD werden die
<em>Namen</em>
und
<em>Inhaltsmodelle</em>
von
<em>Elementtypen</em>
angegeben.
</li>
<li>Grammatik:</li>
</ul>
<listing
src="XML-Grammatik.txt"
line="90-93" />
<ul>
<li>Mögliche Inhaltsmodelle:</li>
<ul>
<li>
<em>Empty</em>
: Das Element hat keinen Inhalt (auch keinen
Text!), es handelt sich um ein sogenanntes
<em>leeres Element</em>
.
</li>
<li>
<em>Any</em>
: Alle in der DTD definierten Elementtypen
sind als Inhalt zugelassen, in beliebiger
Reihenfolge. Auch Freitext (
<code>#PCDATA</code>
für
<em>parsed character data</em>
, also Text ohne Auszeichnungssymbole) ist
erlaubt!
</li>
<li>
<em>Mixed</em>
: Im
<em>gemischten Inhaltsmodell</em>
ist Freitext (ohne Auszeichnungssymbole)
erlaubt sowie explizit benannte Elementtypen
aus der DTD.
</li>
<li>
<em>Children</em>
: Hier können Kindelemente namentlich
benannt werden, die dann in der Reihenfolge
ihrer Benennung als Kindelemente zugelassen
sind. Die Kindelemente können darüber hinaus
in Klammern gruppiert werden.
<br />
Die Häufigkeit ihres Auftretens kann durch
folgende Operatoren gesteuert werden:
</li>
<ul>
<li>
<code>?</code>
: optional (0 oder 1)
</li>
<li>
<code>+</code>
: mindestens einmal (1 bis unendlich)
</li>
<li>
<code>*</code>
: beliebig oft (0 bis unendlich)
</li>
</ul>
</ul>
</ul>
</slide>
<slide>
<title>Definition von Elementen - Beispiel</title>
<listing
src="erste-dtd.dtd"
line="1-4" />
<ul>
<li>
Definition des Elements
<code>Person</code>
.
</li>
<li>
Eine Person hat mindestens einen
<code>Vorname</code>
n, genau einen
<code>Nachname</code>
n und eventuell einen
<code>Geburtsname</code>
n.
</li>
<li>
Die drei Elemente
<code>Vorname</code>
,
<code>Nachname</code>
und
<code>Geburtsname</code>
haben Freitext als Inhaltsmodell.
</li>
<li>
Die Reihenfolge, in der die drei Kindelemente
innerhalb
<code>Person</code>
im Dokument erscheinen können, wird durch die
obige Definition festgelegt.
</li>
</ul>
</slide>
<slide>
<title>Definition Gemischtes Inhaltsmodell</title>
<p class="definition">
Kann ein Element sowohl über Zeichenketten-artigen
als auch Element-wertigen Inhalt verfügen, so wird
sein Inhaltsmodell als
<em>
gemisches Inhaltsmodell (mixed content model)
</em>
bezeichnet.
<br />
Innerhalb eines solchen Elements dürfen
Unicodezeichen und die zugelassenen Elemente in
beliebiger Kombination auftreten.
</p>
</slide>
<slide>
<title>Gemischtes Inhaltsmodell</title>
<ul>
<li>
Das
<em>gemischte Inhaltsmodell</em>
erlaubt sowohl explizit benannte Elemente als
auch beliebigen Freitext (ohne Markup-Symbole)
als Inhalt von Elementen.
</li>
</ul>
<listing
src="XML-Grammatik.txt"
line="92-93" />
<ul>
<li>
Wird mit einem Trick in der Grammatik möglich!
</li>
<ul>
<li>
exklusives Nebeneinander von markupfreiem
beliebigen Text (
<code>#PCDATA</code>
) und benannten Elementen (
<code>Name</code>
) durch Verknüpfung mit exklusivem Oder (
<code>|</code>
)
</li>
<li>
Danach aber wird erlaubt, diese gesamte
Auswahlmöglichkeit durch den Stern beliebig
oft zu wiederholen.
</li>
<li>
#PCDATA muß in der Definition des
Inhaltsmodells an erster Stelle stehen.
</li>
</ul>
<li>
Damit ist eine beliebige Kombination aus
Freitext und Markup als Inhaltsmodell möglich.
</li>
<li>
Die Typen der Kindelemente können demnach
angegeben werden, aber nicht ihre Reihenfolge
oder ihre Auftretenshäufigkeit.
</li>
<li>
Whitespace ist immer als Elementinhalt erlaubt.
</li>
</ul>
</slide>
<slide>
<title>Gemischtes Inhaltsmodell - Beispiel</title>
<listing src="mixed-content.dtd" />
<ul>
<li>
Im Beispiel ist für das Element
<code>p</code>
das gemischte Inhaltsmodell definiert.
</li>
<li>
Erlaubt sind die Kindelemente
<code>a</code>
,
<code>ul</code>
,
<code>b</code>
,
<code>i</code>
und
<code>em</code>
in beliebiger Reihenfolge.
</li>
<li>
Darüber hinaus können an beliebigen Stellen
innerhalb
<code>p</code>
beliebige Zeichenketten stehen.
</li>
</ul>
</slide>
<slide>
<title>Elementdefinition - Beispiel</title>
<p>
Das Beispiel zeigt verschiedene Definitionen von
Elementen.
</p>
<listing src="projektverwaltung1.dtd" />
<ul>
<li>
<code>ProjektVerwaltung</code>
: enthält mindestens ein Element
<code>Person</code>
sowie mindestens ein Element
<code>Projekt</code>
</li>
<li>
<code>Person</code>
: enthält mindestens ein Element
<code>Vorname</code>
und genau ein Element
<code>Nachname</code>
. Überdies kann optional das Element
<code>Qualifikationsprofil</code>
darin enthalten sein.
</li>
<li>
<code>Qualifikationsprofil</code>
: enthält das gemischte Inhaltsmodell: Freitext,
in dem an beliebigen Stellen die Elemente
<code>Qualifikation</code>
oder
<code>Leistungsstufe</code>
vorkommen können.
</li>
<li>
<code>Qualifikation</code>
,
<code>Leistungsstufe</code>
,
<code>Vorname</code>
und
<code>Nachname</code>
: enthalten jeweils markupfreien Text.
</li>
<li>
<code>Projekt</code>
: leeres Element. Im XML-Dokument darf es keine
Kindelemente enthalten.
</li>
</ul>
</slide>
<slide>
<title>Elementdefinition - Beispieldokument</title>
<p>
Hier sehen Sie ein gegenüber dieser DTD gültiges
XML-Dokument.
</p>
<listing src="projektverwaltung1.xml" />
<p>Insbesondere:</p>
<ul>
<li>
Mehrfaches Auftreten von
<code>Vorname</code>
.
</li>
<li>
Gemischtes Inhaltsmodell innerhalb von
<code>Qualifikationsprofil.</code>
</li>
<li>
Mehrfaches Auftreten des Elements
<code>Qualifikation</code>
.
</li>
</ul>
</slide>
<slide>
<title>Parameter Entities</title>
<ul>
<li>
Parameter Entities bieten die Möglichkeit,
Definitionen zu "verschachteln" und so die DTD
leichter lesbar zu machen.
</li>
<li>
Gruppierungen können erstellt und
wiederverwendet werden.
</li>
</ul>
<listing
src="parameter-entities.dtd"
line="1-18" />
<ul>
<li>
Ersetzt man die Entität %a.content; für a, so
ergibt sich folgendes Bild:
</li>
</ul>
<listing
src="parameter-entities.dtd"
line="21" />
<ul>
<li>
Ersetzt man weitere Entitäten (beispielhaft für
<code>%special;</code>
und
<code>%fontstyle;</code>
durchgeführt) so erscheint die Definition von
<code>a</code>
als:
</li>
</ul>
<listing
src="parameter-entities.dtd"
line="22" />
</slide>
<slide>
<title>
Parameter Entities am Beispiel der XHTML 1
Transitional DTD
</title>
<ul>
<li>
In den DTDs für HTML und XHTML, z.B. der
<a
href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML1 Strict DTD
</a>
, finden Parameter Entities starke Verwendung.
</li>
</ul>
<listing src="xhtml1-strict.dtd" />
</slide>
<slide>
<title>Elementdefinition - Einschränkungen</title>
<ul>
<li>
DTD erlaubt lediglich die Spezifikation von
Kindelementen und Freitext sowie deren
Kombination (gemischter Inhalt).
</li>
<li>
Das bedeutet: keine Angabe von Datentypen für
den Inhalt von Elementen möglich!
</li>
<li>
Starke Einschränkung für Dokumente, die zum
Datenaustausch dienen sollen!
</li>
</ul>
</slide>
<slide>
<title>Definition von Attributen</title>
<ul>
<li>
Syntax zur Definition der Attribute ist ähnlich
zu SGML.
</li>
<li>
Attribute werden als sogenannte
<em>Attributlisten</em>
angegeben.
</li>
<li>Sie stehen immer in Beziehung zum Element.</li>
<li>Grammatik:</li>
</ul>
<listing
src="XML-Grammatik.txt"
line="96-104" />
<ul>
<li>
Anschließend an den Elementnamen werden die für
dieses Element zugelassenen Attribute definiert.
</li>
<li>
Einfachster Fall: der (eindeutige) Attributname,
ein Datentyp (gemäß der Produktionen 55 und 56)
und die Angabe, ob es sich um ein optionales (
<code>#IMPLIED</code>
) oder zwingend anzugebendes (
<code>#REQUIRED</code>
) Attribut handelt..
</li>
<li>
Darüber hinaus können Attribute als mit
Vorgabewerten belegt (
<code>AttValue</code>
) und zusätzlich als konstant (#FIXED)
deklariert werden. Ihre vorgegebenen Werte
werden, wenn sie im XML-Dokument nicht angegeben
sind, durch einen validierenden XML-Parser an
die verarbeitende Applikation weitergegeben.
Darüberhinaus prüft der Parser für Konstanten,
ob der angegebene Attributwert mit der Vorgabe
übereinstimmt.
</li>
<li>
Datentypen, die für Attribute zur Verfügung
stehen:
</li>
<ul>
<li>
<code>CDATA</code>
(
<em>Character Data</em>
): Zeichenketten-artiger Inhalt
</li>
<li>
<code>ID</code>
,
<code>IDREF</code>
,
<code>IDREFS</code>
: Einfacher Mechanismus zur Referenzierung.
Ein validierender Prozessor kann prüfen, ob
die angegebenen Referenzen gültig sind. Alle
Werte von Attributen des Typs
<code>ID</code>
müssen eindeutige Bezeichner sein
(andernfalls wird durch einen XML-Prozessor
ein Fehler gemeldet). Durch
<code>IDREF</code>
wird durch einen eindeutigen Verweis auf ein
Element referenziert, wohingegen mit
<code>IDREFS</code>
gleich eine ganze Liste von Verweisen
angegeben werden kann. Die Verweisziele
müssen existieren, andernfalls wird durch
einen XML-Prozessor ein Fehler gemeldet.
</li>
<li>
Schwächen des
<code>ID/IDREFS</code>
-Mechanismus:
</li>
<ul>
<li>
Die IDs befinden sich in einem
virtuellen Bereich (ähnlich zu den
XML-Namensräumen). Dieser Bereich kann
nicht partitioniert werden. Folge:
Namenskonflikte!
</li>
<li>
Die Verweisziele können nicht
eingeschränkt werden (es kann auf jede
ID referenziert werden, egal ob dies
sinnvoll ist, oder nicht.).
</li>
<li>
Der Mechanismus arbeitet nicht
dokumentübergreifend.
</li>
</ul>
<li>
<em>Aufzählungstypen</em>
: Einfache Variante von anwenderdefinierten
Datentypen. Sie werden durch Benennung der
Alternativen gebildet. Syntaktisch werden
sie durch Oder-Verknüpfungen voneinander
abgetrennt und in runden Klammern dem
Attributnamen nachgestellt.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Attributdefinition - Beispiel</title>
<p>
Die bisherigen Elementdeklarationen werden in diesem
Beispiel um Attributdefinitionen erweitert.
</p>
<listing src="projektverwaltung.dtd" />
<ul>
<li>
<code>ProjektVerwaltung</code>
: enthält ein Attribut namens
<code>version</code>
. Der Datentyp des Attributs ist
zeichenketten-artig (
<code>CDATA</code>
). Darüber hinaus ist der Wert des Attributs auf
den Wert
<code>1.0</code>
festgelegt, dieser Wert ist auch vorgegeben..
</li>
<li>
<code>Person</code>
: Für das Element werden drei Attribute
definiert:
</li>
<ul>
<li>
<code>PersID</code>
: zwingend anzugebendes Attribut vom Typ ID
</li>
<li>
<code>Gehaltsgruppe</code>
: anwenderdefinierter Aufzählungstyp, wobei
<code>1a</code>
als Vorgabewert angegeben ist.
</li>
<li>
<code>mitarbeitInProjekt</code>
: eine zwingend anzugebende Liste von
Verweisen.
</li>
</ul>
<li>
<code>Projekt</code>
: Ein Element dieses Typs kann mit fünf
Attributen ausgestattet werden:
</li>
<ul>
<li>
<code>ID</code>
: ein zwingend anzugebendes Attribut vom Typ
<code>ID</code>
.
</li>
<li>
<code>date</code>
: ein Attribut des Typs
<code>CDATA</code>
ohne Vorgabewert (
<code>#IMPLIED</code>
).
</li>
<li>
<code>budget</code>
: ein Attribut des Typs
<code>CDATA</code>
mit dem Vorgabewert
<code>10000</code>
.
</li>
<li>
<code>Projektleiter</code>
: Eine zwingend anzugebende Referenz auf ein
mit einer ID eindeutig gekennzeichnetes
Element.
</li>
<li>
<code>Mitarbeiter</code>
: Eine zwingend anzugebende Verweisliste auf
mehrere mit IDs gekennzeichnete Elemente
(Achtung Schwäche: Verweis prinzipiell auch
auf Projekte möglich!).
</li>
</ul>
</ul>
</slide>
<slide>
<title>Definition von Entitäten und Notationen</title>
<ul>
<li>
Es ist möglich, in einer Dokumenttypdefinition
eigene Textersetzungsmuster (sog.
<em>Entitäten</em>
) zu definieren. Dieses Sprachmerkmal ist nicht
Bestandteil des XML-Schemamechanismus. Daher ist
es hier nur der Vollständigkeit halber
aufgeführt.
</li>
<li>
Aus oben genanntem Grund sollten Sie Entitäten
besser nicht in neu zu definierenden
XML-Grammatiken verwenden, da sich die Grammatik
ansonsten nicht von einer DTD in eine
Schemasprache umwandeln läßt.
</li>
<li>
Die Sytax für derartige Referenzierungen
(einführendes
<code>&</code>
und abschließendes
<code>;</code>
) ist bereits aus dem Abschnitt
<em>
<a
href="http://www.barbara-zengler.de/vorlesung/wohlgeformtheit.html#(57)">
Unexpanded Entity Reference
</a>
</em>
aus dem Kapitel
<a
href="http://www.barbara-zengler.de/vorlesung/wohlgeformtheit.html">
XML-Dokumente und Wohlgeformtheit
</a>
bekannt.
</li>
</ul>
</slide>
<slide>
<title>
Definition von Entitäten und Notationen - Beispiel
</title>
<ul>
<li>
Das dort eingeführte Beispiel hier erneut zur
Wiederholung:
</li>
</ul>
<listing
src="XML-Dokument-mit-Entities.xml"
line="1-12" />
<ul>
<li>
Verwendung von Entitäten mit Kaufmanns-Und (
<code>&</code>
) und abschließendem Strichpunkt (
<code>;</code>
)
</li>
<li>
<code>entA</code>
ist eine interne Entität und wird durch die
Zeichen
<code>xyz</code>
ersetzt
</li>
<li>
<code>entB</code>
und
<code>entC</code>
sind Referenzen auf externe Ressourcen.
</li>
<li>
<code>entC</code>
definiert darüberhinaus, daß es eine unter dem
Namen
<code>-//FHA//Symbol//DE</code>
öffentlich bekannte Quelle (
<code>file://symbols</code>
) referenziert.
</li>
</ul>
<ul>
<li>
Notationen für Ersetzungsmuster, die keine
XML-kodierten Inhalte beinhalten (sondern etwa
Binärdaten), wurden bereits in Abschnitt
<a
href="file:///C:/bsz/webtest/VorlesungWS2008-09/vorlesung/wohlgeformtheit.html#(63)">
Unparsed Entity Reference
</a>
im Kapitel
<a
href="http://www.barbara-zengler.de/vorlesung/wohlgeformtheit.html">
XML-Dokumente und Wohlgeformtheit
</a>
behandelt:
</li>
</ul>
<listing src="XML-Dokument-mit-UnparsedEntity.xml" />
</slide>
<slide>
<title>
Definition von Entitäten und Notationen - Beispiel
vordefinierte Entitäten
</title>
<ul>
<li>
Das folgende Beispiel zeigt die Definition der
in HTML und XML bekannten vordefinierten
Entitäten.
</li>
</ul>
<listing src="predefined-entities.dtd" />
</slide>
</part>
</presentation>
<!-- Ende DTDs -->
<presentation id="uebungsaufgabenDTDs">
<title short="uebungsaufgabenDTDs">
Übungsaufgaben zum Thema DTDs
</title>
<date>2008-10-27</date>
<toc id="resources" />
<toc id="abstract">
Übungsaufgaben zum Thema Dokumenttypdefinitionen (DTDs).
</toc>
<part>
<title>Übungsaufgaben zu DTDs</title>
<slide>
<title>
Korrektur einer syntaktisch fehlerhaften DTD
</title>
<ul>
<li>
Die folgende DTD ist syntaktisch falsch.
Korrigieren Sie die Fehler.
</li>
<listing src="wrong.dtd"></listing>
<!-- <note>
<li>Lösung:</li>
<listing src="right.dtd"></listing>
</note>-->
</ul>
</slide>
<slide>
<title>Ermittlung einer DTD</title>
<ul>
<li>
Erstellen Sie zu folgendem Dokument eine
möglichst restriktive Document Type Definition.
<br />
Ihre Dokumenttypdefinition soll für
<code>att</code>
keine anderen Werte als
<code>x</code>
und
<code>y</code>
zulassen.
</li>
<listing src="uebungsaufgabe-dtd-erstellung.xml"></listing>
</ul>
</slide>
<slide>
<title>DTD-Konformität</title>
<ul>
<li>
Ist das angegebene Dokument konform zur
dargestellten DTD?
<br />
Welche Änderungen müssen am Dokument vollzogen
werden, um die Konformität herzustellen, ohne
Information zu verlieren?
</li>
<listing
src="uebungsaufgabe-dtd-konformitaet.xml">
</listing>
</ul>
</slide>
</part>
</presentation>
<!-- Ende Übungsaufgaben DTD -->
<presentation id="uebungenDTDs">
<title short="uebungenDTDs">Übungen zum Thema DTDs</title>
<date>2008-10-27</date>
<toc id="resources" />
<toc id="abstract">
Übungen aus der Vorlesung zum Thema Dokumenttypdefinitionen
(DTDs).
</toc>
<part>
<title>
Übungen aus der Vorlesung zum Thema
Dokumenttypdefinitionen (DTDs).
</title>
<slide>
<title>Erstellen eines Beispieldokuments</title>
<p>
Gegeben sei folgende DTD. Erstellen Sie ein
Beispieldokument dazu.
</p>
<p>
Eine mögliche Lösung zu dieser Aufgabe finden Sie
auf der nächsten Seite.
</p>
<listing src="uebung-dtd-1.xml" />
</slide>
<slide>
<title>
Erstellen eines Beispieldokuments - Lösung
</title>
<p>
Nachfolgendes Listing zeigt ein mögliches
Instanzdokument für die gegebene DTD.
</p>
<listing src="uebung-dtd-1-loesung.xml" />
</slide>
<slide>
<title>Erstellen einer DTD</title>
<p>
Gegeben sei folgendes XML-Dokument. Erstellen Sie
eine DTD dazu.
</p>
<p>
Eine mögliche Lösung zu dieser Aufgabe finden Sie
auf der nächsten Seite.
</p>
<listing src="uebung-dtd-2.xml" />
</slide>
<slide>
<title>Erstellen einer DTD - Lösung</title>
<p>
Nachfolgendes Listing zeigt eine mögliche DTD für
das angegebene XML-Dokument.
</p>
<listing src="uebung-dtd-2-loesung.xml" />
</slide>
</part>
</presentation>
<!-- Schema -->
<presentation id="schemasprachen">
<title short="schemasprachen">
XML Schemasprachen am Beispiel XML Schema
</title>
<date>2008-11-03</date>
<toc id="resources">
<a href="http://www.w3.org/XML/Schema">
<em>XML Schema</em>
des W3C
</a>
</toc>
<toc id="abstract">
Neben den Document Type Definitions ist in jüngerer Zeit ein
alternativer Ansatz in den Blickpunkt des Interesses
gerückt: die XML-Schemasprachen.
<em>
<a href="http://www.w3.org/XML/Schema">XML Schema</a>
</em>
(im Jahre 2001 als Empfehlung des W3C veröffentlicht) ist
dabei die heutzutage am meisten verwendete Schemasprache für
XML. Sie wurde ersonnen, um die Einschränkungen der DTDs,
die in ihrer Dokumentenorientierung wurzeln, zu umgehen und
insbesondere die Möglichkeit zur Datentypisierung zu
realisieren.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract" />
</p>
</slide>
<part>
<title>XML Schemasprachen - eine Einführung</title>
<slide>
<title>Der Begriff Schema</title>
<ul>
<li>
Der Begriff
<em>Schema</em>
kommt aus dem Umfeld der Datenbanken.
</li>
<li>
Man bezeichnet damit Informations- oder
Datenmodelle, die als Konstruktionsvorlage oder
Dokumentation für einen Datenbankentwurf dienen.
</li>
<li>
Ein Schema kann dabei beispielsweise in einer
graphischen Datenmodellierungssprache (z.B. ERM
oder E3R) vorliegen oder kann die
Tabellenstruktur einer relationalen Datenbank
bezeichnen.
</li>
</ul>
</slide>
<slide>
<title>Warum ein Schema?</title>
<ul>
<li>
Zum Zeitpunkt, als SGML und damit die DTD
erfunden wurde, waren diese hauptsächlich dafür
vorgesehen, Dokumente in Papierform zu
digitalisieren.
</li>
<li>
Es war damals noch nicht vorherzusehen, daß 30
Jahre später eine Weiterentwicklung der Sprache
hauptsächlich zur Strukturierung von Daten
eingesetzt werden würde.
</li>
<li>
Heute werden XML-Sprachen verwendet, um
beliebige datenorientierte Inhalte darzustellen.
Für diesen Zweck ist der DTD-Mechanismus
offenkundig nicht sehr gut geeignet.
</li>
<li>
Schemata definieren Bedingungen (sog.
<em>constraints</em>
) für XML-Dokumente. Das Definieren solcher
Bedingungen mit Schemata ist besser, als diese
dann später bei der Programmierung der
Applikationen noch prüfen zu müssen. Die
Datenvalidierung wird von der Applikationslogik
getrennt (
<em>
<a
href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD447.html">
Separation of Concerns
</a>
</em>
,
<a href="http://www.cs.utexas.edu/users/EWD/">
Edsger W. Dijkstra
</a>
).
</li>
</ul>
</slide>
<slide>
<title>
Unzulänglichkeiten und Beschränkungen von DTDs
</title>
<p>
Für datenintensive Strukturen unterliegt der
DTD-Mechanismus folgenden Einschränkungen:
</p>
<ul>
<li>
<em>Unzureichende Datentypunterstützung</em>
:
<br />
Für Elemente kennen DTDs nur die 4
<a
href="http://www.barbara-zengler.de/vorlesung/dtd.html#(11)">
im letzten Kapitel vorgestellten
Inhaltsmodelle
</a>
das leere Element (
<code>EMPTY</code>
),
<code>ANY</code>
, das
<em>gemischte Inhaltsmodell</em>
sowie
<em>namentlich benannte Kindelemente</em>
.
<br />
Für Attribute gibt es neben der
benutzerdefinierten Aufzählung noch die 8
weiteren Typen
<code>CDATA</code>
,
<code>ID</code>
,
<code>IDREF</code>
,
<code>IDREFS</code>
,
<code>ENTITY</code>
,
<code>ENTITIES</code>
,
<code>NMTOKEN</code>
,
<code>NMTOKENS</code>
(vgl.
<a
href="http://www.barbara-zengler.de/vorlesung/dtd.html#(21)">
Diskussion im letzten Kapitel
</a>
). Strenggenommen handelt es sich aber bei all
diesen Datentypen um Zeichenketten, die
lediglich keine Markup-Symbole enthalten dürfen
(
<a
href="http://www.w3.org/TR/2006/REC-xml11-20060816/#sec-attribute-types">
In XML-Spezifikation nachlesen
</a>
).
</li>
<li>
<em>
Unzureichende Strukturierungsunterstützung
</em>
: Die Operatoren
<code>+</code>
,
<code>?</code>
und
<code>*</code>
ermöglichen die Steuerung der Anzahl von
Kindelementen. Allerdings ist dies sehr
fehlerbehaftet und nur sehr schwer lesbar.
</li>
<li>
<em>
Keine Unterstützung von Wiederverwendbarkeit
</em>
: Definierte Elemente können wiederverwendet
werden, dies gilt jedoch nicht für Attribute.
Sie sind immer an das Element gebunden, für das
sie definiert sind.
</li>
<li>
<em>Starres Typsystem</em>
: Es ist nicht möglich, die vorgegebenen Typen
an eigene Bedürfnisse anzupassen (z.B. durch
Erweiterung oder Einschränkung).
</li>
<li>
<em>Keine Unterstützung von Namensräumen</em>
: Namensräume können in der DTD nicht angegeben
werden.
</li>
<li>
<em>
Nur rudimentärer Referenzierungsmechanismus
</em>
: Die Möglichkeit zur Referenzierung mit dem
<code>ID/IDREF</code>
-Mechanismus ist Einschränkungen unterworfen.
Verknüpfen sind nur innerhalb eines Dokumentes
möglich und es gibt keine Unterstützung dafür,
Elemente sowohl hinsichtlich der Identifizierung
durch IDs als auch in ihrer Eigenschaft als
Verweisziel zu differenzieren (vgl. das
<a
href="http://www.barbara-zengler.de/vorlesung/dtd.html#(22)">
Beispiel der Projektverwaltung im vorigen
Kapitel
</a>
).
</li>
<li>
<em>DTD-Syntax ist nicht XML</em>
: Die Syntax der DTD entspricht nicht der
XML-Syntax. Tools müssen dies zusätzlich
implementieren.
</li>
</ul>
</slide>
<slide>
<title>Schemasprachen</title>
<ul>
<li>
Als (bessere) Alternative zu DTDs wurden
verschiedene (populäre und weniger populäre)
Schemasprachen ersonnen, die zueinander in
Konkurrenz standen und stehen (vgl.
<a
href="http://xml.coverpages.org/schemas.html">
Robin Covers Übersicht über die
verschiedenen Schemasprachen
</a>
).
</li>
<li>
Teilweise haben verschiedene dieser
Schemasprachen als Grundlage für die Entwicklung
umfassenderer / populärerer Schemasprachten
gedient.
</li>
<li>
Beispielsweise ist aus den Schemasprachen
<code>
<a href="http://www.w3.org/TR/NOTE-ddml">
Document Definition Markup Language
(DDML)
</a>
</code>
,
<code>
<a
href="http://www.w3.org/TR/1998/NOTE-XML-data">
XML Data
</a>
</code>
,
<code>
<a href="http://www.w3.org/TR/dt4dtd">
Datatypes for DTDs (DT4DTD)
</a>
</code>
und
<code>
<a href="http://www.w3.org/TR/NOTE-SOX/">
Schema for Object-Oriented XML (SOX)
</a>
</code>
die Schemasprache des W3C,
<em>
<a href="http://www.w3.org/XML/Schema">
XML Schema
</a>
</em>
, entstanden.
</li>
<li>
Als weitere Schemasprache, die in direkter
Konkurrenz zu XML Schema steht, ist
<em>
<a
href="http://www.oasis-open.org/committees/download.php/1149/RELAX%20NG%20Specification">
Relax NG
</a>
</em>
, spezifiziert im Gremium
<a href="http://www.oasis-open.org/">OASIS</a>
, zu sehen. Für RelaxNG gibt es zwei Notationen:
eine XML-basierte Notation sowie eine sog.
<em>Kompakte Syntax</em>
.
</li>
<li>
Die Sprache
<em>
<a href="http://www.schematron.com/">
Schematron
</a>
</em>
verfolgt einen anderen Ansatz. Sie arbeitet
nicht grammatikbasiert, sondern ermöglicht
basierend auf
<em>XPath</em>
und
<em>XSLT Expressions</em>
die Erstellung von Regeln, denen jeweils
bestimmte Teile eines Dokuments folgen müssen
(=kontextsensitiv). Dabei zielt Schematron
darauf ab, daß ein Mensch das Ergebnis der
Überprüfung (eine textbasierte Nachricht) liest
und auswertet. Schematron ist kein Ersatz für
eine Grammatik, kann aber durchaus eine
sinnvolle Ergänzung darstellen.
</li>
</ul>
</slide>
</part>
<part>
<title>XML Schema</title>
<part>
<title>Einführendes</title>
<slide>
<title>XML Schema</title>
<ul>
<li>
Der W3C Standard
<em>
<a
href="http://www.w3.org/XML/Schema">
XML Schema
</a>
</em>
(oft durch
<code>XSD</code>
abgekürzt) ist von allen XML-Schemasprachen
der meist genutzte. Damit kommt ihm die
größte praktische Bedeutung zu.
</li>
<li>
XML-Schema bildet zusammen mit Der
XML-Spezifikation selbst und den
Namensräumen die Basis aller weiteren
W3C-XML-Sprachstandards.
</li>
<li>
XML-Schema-Dokumente sind XML-Dokumente.
</li>
<li>
DTDs werden aller Wahrscheinlichkeit nach
nicht komplett durch Schema ersetzt werden
(das würde der selbstauferlegten Forderung
der Kompatibilität mit SGML widersprechen).
</li>
<li>
Allerdings werden neu entwickelte
XML-Sprachen heutzutage nicht mehr in der
<q>old style</q>
DTD-Grammatik definiert, sondern stattdessen
durch ein ausdrucksmächtigeres Schema.
</li>
</ul>
</slide>
<slide>
<title>XML Schema definiert...</title>
<ul>
<li>
... Strukturen folgender Elemente aus dem
XML Information Set:
</li>
<ul>
<li>Elemente</li>
<li>Attribute</li>
<li>Keine Entitäten, keine Notationen</li>
</ul>
</ul>
</slide>
<slide>
<title>XML Schema - Einführendes</title>
<ul>
<li>
Die Spezifikation selbst (bestehend aus den
beiden Teilen
<a
href="http://www.w3.org/TR/xmlschema-1/">
XML Schema Part 1: Structures
</a>
und
<a
href="http://www.w3.org/TR/xmlschema-2/">
XML Schema Part 2: Datatypes
</a>
) ist so schwer zu lesen, daß ein
eigenständiges, nicht normatives Dokument
generiert wurde, nämlich
<a
href="http://www.w3.org/TR/xmlschema-0/">
XML Schema Part 0: Primer
</a>
. In diesem Dokument wird XML Schema an
vielen Beispielen anschaulich illustriert.
</li>
<li>
XML Schema erlaubt es, Inhaltsmodelle für
Elemente, Attributstrukturen und
wiederverwendbare Strukturen zu definieren.
</li>
<li>
Der Standard bringt eine Reihe
vordefinierter Datentypen mit (z.B.
<code>string</code>
,
<code>integer</code>
,
<code>date</code>
). Zusätzlich dazu können aber auch eigene
Datentypen definiert werden.
</li>
<li>
XML Schema berücksichtigt Namensräume und
definiert einen eigenen Namensraum, in dem
sich alle Primitive zur Definition eines
eigenen Schemas befinden:
<code>
http://www.w3.org/2001/XMLSchema
</code>
(der Namensraum für die
<q>Sprache XML Schema</q>
). Dieser Namensraum wird sehr oft an das
Präfix
<code>xsd</code>
gebunden.
</li>
<li>
Der zweite durch XML Schema vordefinierte
Namensraum ist der
<em>Schema-Instance</em>
genannte Namensraum
<code>
http://www.w3.org/2001/XMLSchema-instance
</code>
. In diesem Namensraum, der oft an das
Präfix
<code>xsi</code>
gebunden wird, befinden sich Elemente und
Attribute aus XML-Schema, die in sogenannten
<em>Instanzdokumenten</em>
(dies ist ein anderer Name für
XML-Dokumente, die den Regeln des Schemas
genügen) verwendet werden können.
</li>
<li>
Zusätzlich dazu kann in einem Schema ein
sogenannter
<em>Target Namespace</em>
angegeben werden. Dieser bezeichnet den
Namensraum für die Elemente eines
XML-Dokuments, das mit diesem Schema
verknüpft ist (der Namensraum für die
<q>Sprache des XML-Dokuments</q>
). Dieser Namensraum ist nicht vorgegeben
und frei wählbar.
</li>
</ul>
</slide>
<slide>
<title>
Gültigkeit hinsichtlich eines Schemas,
Gültigkeit und Wohlgeformtheit
</title>
<img
src="schema-valid-documents.png"
style="width : 80% ; margin : 4% ; " />
</slide>
<slide>
<title>
Definition der Gültigkeit hinsichtlich eines
Schemas
</title>
<p class="definition">
Ein XML-Dokument heißt
<em>
gültig hinsichtlich eines Schemas (schema
valid)
</em>
, wenn es über ein Schema verfügt, und konform
zu diesem aufgebaut ist.
</p>
</slide>
</part>
<part>
<title>Bestandteile von XML-Schema</title>
<slide>
<title>
Verknüpfen eines Dokuments mit einem Schema
</title>
<ul>
<li>
Im Gegensatz zu einer DTD kann ein
XML-Schema-Dokument üblicherweise nicht als
<em>internal Subset</em>
in ein XML-Dokument eingebettet werden.
</li>
<li>
Stattdessen wird die Verbindung zu einem
Schema in einem XML-Dokument durch eines der
beiden Attribute
<code>schemaLocation</code>
bzw.
<code>noNamespaceSchemaLocation</code>
(für den Fall, daß ein Schema ohne Target
Namespace vorliegt) angegeben. Eines dieser
Attribute muß im Wurzelelement des Dokuments
angegeben werden.
</li>
</ul>
</slide>
<slide>
<title>
Verknüpfen eines Dokuments mit einem Schema -
Beispiel
</title>
<listing src="Schemareferenz.xml"></listing>
<ul>
<li>
Die Verknüpfung von Dokument und Schema
findet im Wurzelelement statt.
</li>
<li>
Der XML-Schema-Instanzen-Namensraum wird an
das Präfix
<code>xsi</code>
gebunden. Damit können Elemente und
Attribute aus Schema in das Dokument
eingebunden werden.
</li>
<li>
In der nächsten Zeile wird schon das erste
Element aus Schema verwendet:
<code>schemaLocation</code>
verknüpft durch Angabe der URI des Schemas
das Dokument mit dem Schema.
</li>
<li>
Weil entweder
<code>schemaLocation</code>
oder
<code>noNamespaceSchemaLocation</code>
im Wurzelelement eines Dokuments angegeben
werden müssen, ist die Angabe des
Schema-Instanzen-Namensraums für jedes
Dokument zwingend!
</li>
.
</ul>
</slide>
<slide>
<title>Schema für Schema - Metaschema!</title>
<ul>
<li>
Jedes XML-Schema-Dokument ist ein
XML-Dokument.
</li>
<li>
Jedes XML-Dokument kann durch ein Schema
beschrieben werden.
</li>
<li>
Folge: Jedes XML-Schema-Dokument kann selbst
wieder durch ein Schema (Schema für Schema)
beschrieben werden.
</li>
<li>
Damit kann jedes Schema auf Gültigkeit
hinsichtlich dieses Metaschemas überprüft
werden. Das war eine wichtige Forderung beim
Sprachentwurf von XML Schema. Für DTDs
besteht diese Möglichkeit nicht.
</li>
<li>
Dieselben Tools, die die Gültigkeit eines
Dokuments hinsichtlich eines Schemas prüfen,
können auch die Gültigkeit eines Schemas
hinsichtlich des Metaschemas prüfen.
</li>
<li>
Solch ein Metaschema ist wieder ein
XML-Dokument - auch hierfür könnte man nun
wieder ein Schema angeben...
</li>
<li>
Um zu vermeiden, daß hier eine unendliche
Kette von Schemavalidierungen entsteht, hat
man sich dazu entschlossen, das Schema für
Schema durch sich selbst zu beschreiben.
</li>
</ul>
</slide>
<slide>
<title>Schema für Schema - Metaschema!</title>
<img
style="margin : 4%; width : 90%; "
src="schemaValid.gif" />
</slide>
<slide>
<title>XML Schema - Typsystem</title>
<ul>
<li>
XML-Schema definiert insgesamt 44 sogenannte
<em>Primitivtypen</em>
. Darunter finden sich die aus der DTD
bekannten Element- und Attributtypen, sowie
eine Fülle Neuer.
</li>
<li>
Den Datentypen lassen sich folgende
Eigenschaften zuordnen:
</li>
<ul>
<li>
<em>Atomare</em>
versus
<em>aggregierte</em>
Typen:
</li>
<ul>
<li>
Unter einem
<em>atomaren Datentyp</em>
versteht man einen Datentyp, der die
kleinste Informationseinheit
darstellt. Die Information ist nicht
mehr weiter unterteilbar, d.h. nicht
mehr erkennbar weiter
unterstrukturiert (Beispiel
<code>string</code>
) oder der Zugriff auf die
Teilkomponenten ist nicht möglich
(Beispiel:
<code>date</code>
- kein Zugriff auf Jahr, Monat,
Tag).
</li>
<li>
<em>Aggregierte Datentypen</em>
sind Datentypen, die sich entweder
</li>
<ul>
<li>
aus Werten
<u>
eines oder mehrerer
verschiedenen
</u>
Datentypen zusammensetzen
(Vereinigungstypen)
</li>
<li>
oder aus mehreren Werten
<u>eines</u>
atomaren Datentyps
zusammensetzen (Listen), z.B.
drei Dezimalzahlen
<code>8 10.5 12</code>
.
</li>
</ul>
</ul>
<li>
<em>Primitive</em>
versus
<em>abgeleitete Typen</em>
:
</li>
<ul>
<li>
<em>Primitive Datentypen</em>
existieren unabhängig von anderen
Datentypen (z.B.
<code>float</code>
).
</li>
<li>
<em>Abgeleitete Datentypen</em>
benötigen andere Datentypen, von
deren Definition sie abhängig sind
(z.B.
<code></code>
)
</li>
</ul>
<li>
<em>Vorgegebene</em>
versus
<em>anwenderdefinierte Typen</em>
:
</li>
<ul>
<li>
<em>Vorgegebenen Datentypen</em>
sind all diejenigen die in
<a
href="http://www.w3.org/TR/xmlschema-2/">
XML Schema Part 2
</a>
definiert sind. Es wurden all
diejenigen Datentypen definiert, die
mit einer hohen Wahrscheinlichkeit
von einer großen Anzahl Benutzern
"neu erfunden" worden wären.
</li>
<li>
<em>Anwenderdefinierte Typen</em>
können vom Benutzer selbst
festgelegt werden.
</li>
</ul>
</ul>
</ul>
</slide>
<slide>
<title>XML Schema - Typsystem</title>
<img
src="type-hierarchy.gif"
style="margin : 4% ;">
</img>
</slide>
<slide>
<title>
XML Schema - Datentypen - Datum und Zeit
</title>
<table
border="1"
cellpadding="5">
<thead>
<tr>
<th>Typname</th>
<th>Beispiel</th>
<th>Bemerkung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>time</code>
</td>
<td>
<code>
13:20:00-05:00, 13:20:00.000
</code>
</td>
<td>
Uhrzeit, die täglich wiederkehrt,
ausgedrückt im Format gemäß ISO 8601
</td>
</tr>
<tr>
<td>
<code>date</code>
</td>
<td>
<code>2007-11-13</code>
</td>
<td>
Datumsformat: CCYY-MM-DD, gemäß ISO
8601
</td>
</tr>
<tr>
<td>
<code>gYear</code>
</td>
<td>
<code>1999, 2001, 2004, 2007</code>
</td>
<td>
Darstellung von Jahren des
gregorianischen Kalenders gemäß ISO
8601
</td>
</tr>
<tr>
<td>
<code>gYearMonth</code>
</td>
<td>
<code>2007-11</code>
</td>
<td>
Darstellung eines Monats eines
bestimmten Jahres des
gregorianischen Kalenders gemäß ISO
8601
</td>
</tr>
<tr>
<td>
<code>gDay</code>
</td>
<td>
<code>----05, ----31</code>
</td>
<td>
Darstellung eines wiederkehrenden
Tages eines Monats gemäß ISO 8601
</td>
</tr>
<tr>
<td>
<code>gMonthDay</code>
</td>
<td>
<code>--31-12, --01-01</code>
</td>
<td>
Darstellung eines wiederkehrenden
gregorianischen Datums, gebildet aus
Tag Monat und Monat im Format
<code>--MM-DD</code>
, gemäß ISO 8601
</td>
</tr>
<tr>
<td>
<code>gMonth</code>
</td>
<td>
<code>--03, --12</code>
</td>
<td>
Monatsformat:
<code>--MM--</code>
gemäß ISO 8601
</td>
</tr>
<tr>
<td>
<code>dateTime</code>
</td>
<td>
<code>
2007-11-13T08:09:46.000+01:00
</code>
</td>
<td>
Zeitpunkt, ausgedrückt durch Datum
und Uhrzeit; beide gemäß ISO 8601
codiert.
</td>
</tr>
<tr>
<td>
<code>duration</code>
</td>
<td>
<code>
P1Y2M3DT10H30M12.3S
<br />
Zeitraum von einem Jahr, zwei
Monaten, drei Tagen, zehn
Stunden, 30 Minuten und 12,3
Sekunden
</code>
</td>
<td>
Nach Größe (Signifikanz) geordnete
Koordinate im sechs-dimensionalen
Raum aus Jahr, Monat, Tag, Stunde,
Minute und Sekunde. Formatdefinition
laut ISO 8601
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
XML Schema - Datentypen - String und davon
Abgeleitete
</title>
<table
border="1"
cellpadding="5">
<thead>
<tr>
<th>Typname</th>
<th>Beispiel</th>
<th>Bemerkung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>string</code>
</td>
<td>
<code>
    Hello
&#xD;&#xA; World
</code>
<note>
(Carriage Return, Line Feed)
</note>
</td>
<td>
Jedes beliebige Unicode Symbol gemäß
<a
href="http://www.w3.org/TR/2006/REC-xml11-20060816/#charsets">
XML-Grammatikregel
(Syntaxproduktion) 2
</a>
.
</td>
</tr>
<tr>
<td>
<code>normalizedString</code>
</td>
<td>
<code>
&#20;Hello&#20;World
</code>
</td>
<td>
Jedes beliebige Unicode Symbol außer
Zeilenvorschub (
<code>#xA</code>
), Wagenrücklauf (
<code>#xD</code>
) und Tabulatoren (
<code>#x9</code>
).
<br />
<code>normalizedString</code>
ist eine einschränkende
Spezialisierung des Typs
<code>string</code>
.
</td>
</tr>
<tr>
<td>
<code>token</code>
</td>
<td>
<code>Hello World</code>
</td>
<td>
Jeder
<code>normalizedString</code>
, unter Weglassung führender,
abschließender und mehrfacher
Leerzeichen (
<code>#x20</code>
), sowie Zeilenvorschüben und
Tabulatoren.
<br />
<code>token</code>
ist eine einschränkende
Spezialisierung des Typs
<code>normalizedString</code>
.
</td>
</tr>
<tr>
<td>
<code>language</code>
</td>
<td>
<code>en-GB, en, de-de</code>
</td>
<td>
Sprachcodierung gemäß IETF RFC 1766
und XML Recommendation language
identification. Die
Identifikationsnamen werden durch
ISO 639 sowie ISO 3166 definiert.
<code>language</code>
ist eine einschränkende
Spezialisierung des Typs
<code>token</code>
.
</td>
</tr>
<tr>
<td>
<code>Name</code>
</td>
<td>
<code>
aName, _helloWorld,
:notAGoodIdea
</code>
</td>
<td>
Ein XML Name gemäß
<a
href="http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-Name">
Syntaxproduktion 5
</a>
.
<br />
<code>Name</code>
ist eine einschränkende
Spezialisierung des Typs
<code>token</code>
.
</td>
</tr>
<tr>
<td>
<code>QName</code>
</td>
<td>
<code>xsd:element, element</code>
</td>
<td>
Durch Namensraumpräfix
qualifizierter Name gemäß
<a
href="http://www.w3.org/TR/2006/REC-xml-names11-20060816/#NT-PrefixedName">
Produktion 8 der XML Namespace
Recommendation
</a>
.
</td>
</tr>
<tr>
<td>
<code>NCName</code>
</td>
<td>
<code>aName, _anotherName, X</code>
</td>
<td>
Name, der keinen Doppelpunkt enthält
(
<em>non colonized name</em>
), gemäß
<a
href="http://www.w3.org/TR/2006/REC-xml-names11-20060816/index.html#NT-NCName">
Produktion 4 der XML Namespace
Recommendation
</a>
</td>
</tr>
<tr>
<td>
<code>ID</code>
</td>
<td>
<code>test, XYZ</code>
</td>
<td>
XSD-Darstellung des DTD-Typen
<code>ID</code>
. Zugelassen sind alle Ausprägungen
der Namespaceproduktion 4 (NCName).
<code>ID</code>
ist eine einschränkende
Spezialisierung des Typs
<code>NCName</code>
.
</td>
</tr>
<tr>
<td>
<code>IDREF</code>
</td>
<td>
<code>test, XYZ</code>
</td>
<td>
XSD-Darstellung des DTD-Typen
<code>IDREF</code>
. Zugelassen sind alle Ausprägungen
der Namespaceproduktion 4 (NCName).
<code>IDREF</code>
ist eine einschränkende
Spezialisierung des Typs
<code>NCName</code>
.
</td>
</tr>
<tr>
<td>
<code>IDREFS</code>
</td>
<td>
<code>
test1 test2 test4, test3 test5
</code>
</td>
<td>
XSD-Darstellung des DTD-Typen
<code>IDREFS</code>
. Zugelassen sind Listen aus white
space separierten Ausprägungen der
Namespaceproduktion 4 (NCName).
<code>IDREFS</code>
ist eine nichtleere Aufzählung von
<code>IDREF</code>
-Ausprägungen.
</td>
</tr>
<tr>
<td>
<code>ENTITY</code>
</td>
<td>
<code></code>
</td>
<td>
XSD-Darstellung des DTD-Typen
<code>ENTITY</code>
. Zugelassen sind alle Satzformen,
die der Produktion NCName der
XML-Namensräume entsprechen und als
ungeparste Entität definiert sind.
<code>ENTITY</code>
ist eine einschränkende
Spezialisierung des Typs
<code>NCName</code>
.
</td>
</tr>
<tr>
<td>
<code>ENTITIES</code>
</td>
<td>
<code></code>
</td>
<td>
XSD-Darstellung des DTD-Typen
<code>ENTITIES</code>
. Zugelassen sind Listen aus white
space separierten Ausprägungen des
Typs
<code>ENTITY</code>
.
<code>ENTITIES</code>
ist eine nichtleere Aufzählung von
<code>ENTITY</code>
-Ausprägungen
</td>
</tr>
<tr>
<td>
<code>NMTOKEN</code>
</td>
<td>
<code>US, Deutschland</code>
</td>
<td>
XSD-Darstellung des DTD-Typen
<code>NMTOKEN</code>
. Ausprägungen dieses Typs müssen
konform zur Produktion 7 der
XML-Spezifikation sein.
<code>NMTOKEN</code>
ist eine einschränkende
Spezialisierung des Typs
<code>token</code>
.
</td>
</tr>
<tr>
<td>
<code>NMTOKENS</code>
</td>
<td>
<code>US UK Aus, Ger</code>
</td>
<td>
XSD-Darstellung des DTD-Typen
<code>NMTOKENS</code>
. Zugelassen sind Listen aus white
space separierten Ausprägungen des
Typs NMTOKEN. NMTOKENS ist eine
nichtleere Aufzählung von
NMTOKEN-Ausprägungen
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
XML Schema - Datentypen - decimal und davon
Abgeleitete
</title>
<table
border="1"
cellpadding="5">
<thead>
<tr>
<th>Typname</th>
<th>Beispiel</th>
<th>Bemerkung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>decimal</code>
</td>
<td>
<code>
-1.23, 12678967.543233,
+100000.00, 210
</code>
</td>
<td>
Wertebereich:
<code>
i*10
<sup>-n</sup>
</code>
, mit
<code>i</code>
,
<code>n</code>
aus
<code>integer, n>=0</code>
<br />
Ein Prozessor muß mindestens 18
Dezimalstellen unterstützen.
</td>
</tr>
<tr>
<td>
<code>integer</code>
</td>
<td>
<code>...-1, 0, 1, ...</code>
</td>
<td>
Wertebereich: entspricht der
mathematischen Menge der ganzen
Zahlen (Z)
<br />
<code>integer</code>
ist eine einschränkende
Spezialisierung des Typs
<code>decimal</code>
</td>
</tr>
<tr>
<td>
<code>nonPositiveInteger</code>
</td>
<td>
<code>... -2, -1, 0</code>
</td>
<td>
Wertebereich:
<code>{..., -2, -1, 0}</code>
die unendliche Menge der negativen
Zahlen, und die Null
<br />
<code>nonPositiveInteger</code>
ist eine einschränkende
Spezialisierung des Typs
<code>integer</code>
</td>
</tr>
<tr>
<td>
<code>negativeInteger</code>
</td>
<td>
<code>... -2, -1</code>
</td>
<td>
Wertebereich:
<code>{..., -2, -1}</code>
, die unendliche Menge der negativen
Zahlen
<br />
<code>negativeInteger</code>
ist eine einschränkende
Spezialisierung des Typs
<code>nonPositiveInteger</code>
</td>
</tr>
<tr>
<td>
<code>long</code>
</td>
<td>
<code>
-9223372036854775808, ... -1, 0,
1, ... 9223372036854775807
</code>
</td>
<td>
Wertebereich:
<code>
2
<sup>63</sup>
<= long <= 2
<sup>63</sup>
-1
</code>
<br />
<code>long</code>
ist eine einschränkende
Spezialisierung des Typs
<code>integer</code>
</td>
</tr>
<tr>
<td>
<code>int</code>
</td>
<td>
<code>
-2147483648, ... -1, 0, 1, ...
2147483647
</code>
</td>
<td>
Wertebereich:
<code>
-2
<sup>31</sup>
<= int <= 2
<sup>31</sup>
-1
</code>
<br />
<code>int</code>
ist eine einschränkende
Spezialisierung des Typs
<code>long</code>
</td>
</tr>
<tr>
<td>
<code>short</code>
</td>
<td>
<code>
-32768, ... -1, 0, 1, ... 32767
</code>
</td>
<td>
Wertebereich:
<code>
-2
<sup>15</sup>
<= short <= 2
<sup>15</sup>
-1
</code>
<br />
<code>short</code>
ist eine einschränkende
Spezialisierung des Typs
<code>int</code>
</td>
</tr>
<tr>
<td>
<code>byte</code>
</td>
<td>
<code>
-128, ...-1, 0, 1, ... 127
</code>
</td>
<td>
Wertebereich:
<code>
-2
<sup>7</sup>
<= byte <= 2
<sup>7</sup>
-1
</code>
<br />
<code>byte</code>
ist eine einschränkende
Spezialisierung des Typs
<code>short</code>
</td>
</tr>
<tr>
<td>
<code>nonNegativeInteger</code>
</td>
<td>
<code>0, 1, 2, ...</code>
</td>
<td>
Wertebereich:
<code>
0 <= nonNegativeInteger
</code>
<br />
<code>nonNegativeInteger</code>
ist eine einschränkende
Spezialisierung des Typs
<code>integer</code>
</td>
</tr>
<tr>
<td>
<code>positiveInteger</code>
</td>
<td>
<code>1, 2, ...</code>
</td>
<td>
Wertebereich: entspricht der
mathematischen Menge der natürlichen
Zahlen (N)
<br />
<code>positiveInteger</code>
ist eine einschränkende
Spezialisierung des Typs
<code>nonNegativeInteger</code>
</td>
</tr>
<tr>
<td>
<code>unsignedLong</code>
</td>
<td>
<code>
0, 1, ... 18446744073709551615
</code>
</td>
<td>
Wertebereich:
<code>
0 <= unsignedLong <= 2
<sup>64</sup>
-1
</code>
<br />
<code>unsignedLong</code>
ist eine einschränkende
Spezialisierung des Typs
<code>nonNegativeInteger</code>
</td>
</tr>
<tr>
<td>
<code>unsignedInt</code>
</td>
<td>
<code>0, 1, ...4294967295</code>
</td>
<td>
Wertebereich:
<code>
0 <= unsignedInt <= 2
<sup>32</sup>
-1
</code>
<br />
<code>unsignedInt</code>
ist eine einschränkende
Spezialisierung des Typs
<code>unsignedLong</code>
</td>
</tr>
<tr>
<td>
<code>unsignedShort</code>
</td>
<td>
<code>0, 1, ... 65535</code>
</td>
<td>
Wertebereich:
<code>
0 <= unsignedShort <= 2
<sup>16</sup>
-1
</code>
<br />
<code>unsignedShort</code>
ist eine einschränkende
Spezialisierung des Typs
<code>unsignedInt</code>
</td>
</tr>
<tr>
<td>
<code>unsignedByte</code>
</td>
<td>
<code>0, 1, ... 255</code>
</td>
<td>
Wertebereich:
<code>
0 <= unsignedByte <= 2
<sup>8</sup>
-1
</code>
<br />
<code>unsignedByte</code>
ist eine einschränkende
Spezialisierung des Typs
<code>unsignedShort</code>
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
XML Schema - Datentypen - weitere vordefinierte
Primitivtypen
</title>
<table
border="1"
cellpadding="5">
<thead>
<tr>
<th>Typname</th>
<th>Beispiel</th>
<th>Bemerkung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>boolean</code>
</td>
<td>
<code>true, false, 1, 0</code>
</td>
<td>
Unterstützung der klassischen
zweiwertigen Logik
</td>
</tr>
<tr>
<td>
<code>base64Binary</code>
</td>
<td>
<code>SGVsbG8gd29ybGQhCg==</code>
</td>
<td>
Base64-Darstellung eines beliebigen
Binär-interpretierten Inhaltes gemäß
IETF RFC 2045
</td>
</tr>
<tr>
<td>
<code>hexBinary</code>
</td>
<td>
<code>0FB7</code>
</td>
<td>
Hexadezimale Darstellung beliebiger
Binär-interpretierter Inhalte
</td>
</tr>
<tr>
<td>
<code>float</code>
</td>
<td>
<code>
-1E4, 1267.43233E12, 12.78e-2,
12, INF
</code>
</td>
<td>
32-Bit-Zahl mit einfacher
Genauigkeit gemäß IEEE 754-1985.
<br />
Wertebereich:
<code>
m * 2
<sup>e</sup>
</code>
, wobei
<code>m</code>
und
<code>e</code>
<code>integer</code>
-Elemente mit
<code>
m <= 224, und -149 <= e
< 104
</code>
sind.
</td>
</tr>
<tr>
<td>
<code>double</code>
</td>
<td>
<code>
-1E4, 1267.43233E12, 12.78e-2,
12, INF
</code>
</td>
<td>
64-Bit-Zahl mit doppelter
Genauigkeit gemäß IEEE 754-1985.
<br />
Wertebereich:
<code>
m * 2
<sup>e</sup>
</code>
, wobei
<code>m</code>
und
<code>e</code>
<code>integer</code>
-Elemente mit
<code>
m <= 253, und -1075 <= e
< 970
</code>
sind.
</td>
</tr>
<tr>
<td>
<code>anyURI</code>
</td>
<td>
<code>
http://www.barbara-zengler.de/
</code>
</td>
<td>
Jede gemäß IETF RFC 2396 bzw. IETF
RFC 2732 gültige URI
</td>
</tr>
<tr>
<td>
<code>QName</code>
</td>
<td>
<code>xsd:element, element</code>
</td>
<td>
Durch Namensraumpräfix
qualifizierter Name gemäß
<a
href="http://www.w3.org/TR/2006/REC-xml-names11-20060816/#NT-PrefixedName">
Produktion 8 der XML Namespace
Recommendation
</a>
.
</td>
</tr>
<tr>
<td>
<code>NOTATION</code>
</td>
<td>
<code></code>
</td>
<td>
XSD-Darstellung des DTD-Typen
<code>NOTATION</code>
. Zur Verwendung dieses Typs in
einem Schema muß eine Ableitung von
<code>NOTATION</code>
durch den Anwender definiert werden.
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
XML Schema am Beispiel - Wurzelelement
<code>schema</code>
</title>
<ul>
<li>
Den Wurzelknoten bildet das Element
<code>schema</code>
.
</li>
<li>
Direkt unterhalb dieses Elements werden in
einer flachen Struktur alle Definitionen
dieses Schemas angegeben.
</li>
<li>
Attribute des
<code>schema</code>
-Elements:
</li>
<ul>
<li>
(Optionale) Angabe des Namensraums für
das Zielvokabular:
<code>targetNamespace</code>
als URI.
</li>
<li>
<code>elementFormDefault</code>
: kann den Namensraumzwang für Elemente
des Instanzdokuments lockern.
<code>qualified</code>
gibt an, daß sich die Elemente des
Dokuments immer im Zielnamensraum
befinden müssen,
<code>unqualified</code>
hingegen erlaubt das Vorkommen von
Elementen auch außerhalb dieses
Namensraums. Vorgabewert:
<code>unqualified</code>
.
</li>
<li>
<code>attributeFormDefault</code>
: analog für Attribute.
</li>
</ul>
</ul>
<listing
src="projektverwaltung.xsd"
line="2">
</listing>
</slide>
<slide>
<title>XML Schema - Elementdefinitionen</title>
<ul>
<li>Direkt unterhalb des Wurzelelements</li>
<li>
Durch das XSD-Element
<code>element</code>
</li>
<li>
XML Schema bringt zahlreiche vordefinierte
Elementtypen mit, darüber hinaus erlaubt es
auch die Definition eigener Typen.
</li>
<li>
Es unterstützt auch die Inhaltsmodelle der
DTD: unstrukturierter Inhalt (Text), leeres
Inhaltsmodell, explizit benannte
Kindelemente, beliebige Kindelemente,
gemischtes Inhaltsmodell.
</li>
</ul>
<listing
src="schema.xsd"
line="3-5">
</listing>
<ul>
<li>
Entspricht -- abgesehen von der
Typdefinition -- bis hierher den
Möglichkeiten, die auch DTDs bieten.
</li>
</ul>
</slide>
<slide>
<title>XML Schema - Elementeigenschaften</title>
<p>
Des weiteren können folgende Eigenschaften für
Elemente mit Hilfe von Attributen angegeben
werden:
</p>
<ul>
<li>
<em>abstract</em>
: falls auf
<code>true</code>
gesetzt, darf ein solches Element nicht in
einem XML-Dokument auftreten. Es kann
ausschließlich zur Strukturierung des
Schemaentwurfs eingesetzt werden und als
Basis von Spezialisierungen dienen.
Vorgabewert ist
<code>false</code>
</li>
<li>
<em>block</em>
: erlaubt es, die Verwendung abgeleiteter
Typen zu kontrollieren. Zugelassene
Belegungen sind beliebige Kombinationen aus
<code>extension</code>
,
<code>restriction</code>
und
<code>substitution</code>
oder der Einzelwert
<code>#all</code>
.
<br />
Die hier angegebenen Typen dürfen im
Instanzdokument nicht als Ersatz des
Originaltyps auftreten.
<br />
Der Wert
<code>#all</code>
verbietet generell die Ersetzung eines
Elements durch andere.
</li>
<li>
<em>default</em>
: Vorgabebelegung des Inhalts durch eine
beliebige Zeichenkette, die konform zum
gewählten Typ ist. Dieser Wert wird durch
den XML-Prozessor an die Applikation
gemeldet, wenn kein Wert im Dokument
angegeben wird.
</li>
<li>
<em>fixed</em>
: erlaubt es, Elemente mit einem konstanten
Wert zu belegen.
<br />
<code>default</code>
und
<code>fixed</code>
schließen sich gegenseitig aus.
</li>
<li>
<em>final</em>
: verhindert die Ableitung von Typen. Die
zulässigen Belegungen sind mit denen für
<em>block</em>
identisch, nur daß durch dieses Attribut die
Vererbungsmechanismen bereits auf
Schemaebene verboten werden, während block
ihre Nutzung im Instanzdokument einschränkt.
</li>
<li>
form: legt fest, ob das Element im
Instanzdokument mit Namensraumpräfix
erscheint. Zulässige Belegungen:
<code>qualified</code>
(Namensraumpräfix muß angegeben werden) und
<em>unqualified</em>
.
</li>
<li>
<em>id</em>
: erlaubt die eineindeutige Kennzeichnung
eines Elements durch eine schemaweit
eindeutige Zeichenkette.
</li>
<li>
<em>minOccurs</em>
: Minimalkardinalität, d.h. Mindestzahl
zulässiger Vorkommen dieses Elements. Der
Attributinhalt ist ein Element aus
<code>nonNegativeInteger</code>
. Das Attribut ist optional, und wird bei
fehlender Angabe mit dem Vorgabewert
<code>1</code>
belegt.
</li>
<li>
<em>maxOccurs</em>
: Maximalkardinalität, d.h. Höchstzahl
zulässiger Vorkommen dieses Elements. Der
Attributinhalt ist entweder ein Element aus
<code>nonNegativeInteger</code>
oder die Zeichenkette
<code>unbounded</code>
zur Kennzeichnung beliebig vieler Auftreten.
Das Attribut ist optional, und wird bei
fehlender Angabe mit dem Vorgabewert
<code>1</code>
belegt.
</li>
<li>
<em>name</em>
: Unqualifizierter Name des Elements,
konform zur NCName-Produktion der
Namensraum-Spezifikation.
</li>
<li>
<em>nillable</em>
: Erlaubt Null-Werte im Instanzdokument, die
Semantik ist dabei an die in relationalen
Datenbanksystemen verwirklichte angelehnt.
Die Belegung ist entweder
<code>true</code>
oder
<code>false</code>
, was auch als Vorgabe bei Fehlen dieses
Attributs angenommen wird.
</li>
<li>
<em>ref</em>
: Referenz auf eine andere
Elementdeklaration zur Übernahme der dort
spezifizierten Definitionen.
</li>
<li>
<em>substitutionGroup</em>
: Name einer Gruppe von Elementen, die
anstatt des aktuellen Elements im
Instanzdokument auftreten dürfen.
</li>
<li>
<em>type</em>
: Ein durch Schema Part 2 vordefinierter
Typ, oder jeder beliebige
anwenderdefinierte.
</li>
</ul>
</slide>
<slide>
<title>
XML Schema am Beispiel - Elementdefinitionen
</title>
<p>
Nachfolgend finden Sie einige beispielhafte
Elementdeklarationen für nicht strukturierten (=
keine Kindelemente), aber typisierten,
Elementinhalt:
</p>
<listing
src="elementdeklarationen.xsd"
line="3-15">
</listing>
<ul>
<li>
<code>geburtsdatum</code>
definiert ein XML-Element des Typs
<code>date</code>
zur Darstellung eines Datums. Weitere
Festlegungen sind nicht getroffen, daher
wird das Element mit
<code>minOccurs</code>
und
<code>maxOccurs 1</code>
belegt. Damit ist es im Instanzdokument
zwingend anzugeben.
</li>
<li>
<code>pi</code>
entspricht mit seiner konstanten Belegung (
<code>fixed</code>
-Attribut) der gleichnamigen mathematischen
Konstante. Als Datentyp wurde
<code>double</code>
, eine Gleitkommazahl mit doppelter
Genauigkeit gewählt. Durch die Belegung von
<code>block</code>
mit
<code>#all</code>
wird verhindert, daß eine weitere
Spezialisierung des Elements durch Vererbung
oder Aggregation erfolgt.
</li>
<li>
Die Definition für
<code>vorname</code>
nutzt
<code>token</code>
als Datentyp. Hier werden automatisch
mehrfache, führende und abschließende
Leerzeichen sowie sonstige
Formatierungssymbole entfernt. Der Vorname
kann darüber hinaus beliebig häufig
auftreten --
<code>maxOccurs</code>
ist mit dem Wert
<code>unbounded</code>
belegt. Die minimale Auftrittshäufigkeit
wird mit
<code>1</code>
(
<code>minOccurs</code>
) festgelegt, dies entspricht der
Vorgabebelegung.
</li>
<li>
Für das Element
<code>artikelNummer</code>
ist als Typ
<code>NCName</code>
ausgewählt. Dies entspricht beliebigen
Zeichenketten, die keinen Doppelpunkt
enthalten. Darüberhinaus ist das Attribut
<code>form</code>
mit dem Wert
<code>qualified</code>
versehen. Dies führt dazu, daß das
Namensraumkürzel für dieses Element zwingend
im Instanzdokument anzugeben ist.
</li>
</ul>
</slide>
<slide>
<title>
Elementdefinition - freies Inhaltsmodell
</title>
<p>
Zur Umsetzung des freien Inhaltsmodells, das
beliebige Inhalte aus den definierten Elementen
und freien Texten zuläßt, wird ebenfalls auf das
Typsystem zurückgegriffen.
<br />
Wird das
<code>type</code>
Attribut nicht belegt, so wird gemäß Vorgabe der
Typ
<code>anyType</code>
angenommen. Elemente dieses Typs können
beliebige wohlgeformte Inhalte beherbergen.
<br />
Die beiden nachfolgenden Angaben sind daher
äquivalent:
</p>
<listing
src="elementdeklarationen.xsd"
line="15-18" />
</slide>
<slide>
<title>
Verwendung von Typen -
<code>complexType</code>
- leeres Inhaltsmodell
</title>
<p>
XSD hat verglichen mit der DTD einen strengeren
Typbegriff. Dies zeigt sich deutlich in der
Existenz des XSD-Elements
<code>complexType</code>
. Dieses Element erlaubt die Bildung von Typen
losgelöst von ihrere Verwendung. Syntaktisch
kann die
<code>complexType</code>
-Definition sowohl innerhalb einer
Elementdefinition, als auch separat erfolgen.
<br />
Den einfachsten Anwendungsfall bildet die
eingebettete leere
<code>complexType</code>
-Definition zur Darstellung des leeren
Inhaltsmodells.
<br />
Die Syntax hierfür lautet (der XSD-Namensraum
sei an das Präfix
<code>xsd</code>
gebunden):
</p>
<listing
src="elementdeklarationen.xsd"
line="19-22">
</listing>
<p>
In einem Instanzdokument werden für die obige
Festlegung ausschließlich die beiden
Darstellungsformen zum leeren Element (
<code><elementName/></code>
bzw.
<code>
<elementName></elementName>
</code>
) akzeptiert.
</p>
</slide>
<slide>
<title>
Verwendung von Typen -
<code>complexType</code>
- strukturierter Inhalt - Reihenfolgetypen
</title>
<ul>
<li>
In XML Schema wird explizit angegeben, in
welcher Reihenfolge Kindelemente auftreten
sollen. Hierfür gibt es folgende drei
Möglichkeiten, die miteinander kombiniert
werden können:
</li>
<ul>
<li>
<code>sequence</code>
: Sequentielles Auftreten der Elemente
in der angegebenen Reihenfolge.
</li>
<li>
<code>choice</code>
: Auswahl - entspricht einer
<code>ODER</code>
-Verknüpfung von einzelnen Elementen.
</li>
<li>
<code>all</code>
: Erlaubt die Angabe der Kindelemente in
beliebiger Reihenfolge.
</li>
</ul>
</ul>
</slide>
<slide>
<title>
Elementdefinition und Reihefolgetypen am
Beispiel Projektverwaltung
</title>
<listing src="projektverwaltung1.xsd"></listing>
<ul>
<li>
In diesem Schema sind alle
Elementdefinitionen für die
Projektverwaltung enthalten. In diesem
Beispiel werden 4 Dinge demonstriert:
</li>
<ul>
<li>
Innerhalb jedes
<code>element</code>
-Elements sind die entsprechenden
Kindelemente in
<code>sequence</code>
-Strukturen eingebettet. Sie müssen
genau in der Reihenfolge ihres
Auftretens im Schema auch im
Instanzdokument wiedergegeben werden.
</li>
<li>
Verwendung des leeren Inhaltsmodells für
<code>Projekt</code>
</li>
<li>
Verwendung des gemischten Inhaltsmodells
(siehe nächste Seite) für
<code>Qualifikationsprofil</code>
</li>
<li>
Referenzierung auf Elementdefinitionen
mit Hilfe des
<code>ref</code>
-Attributs.
</li>
</ul>
</ul>
</slide>
<slide>
<title>
Gemischtes Inhaltsmodell im Vergleich zur DTD
</title>
<listing
src="projektverwaltung1.xsd"
line="23-30">
</listing>
<listing
src="projektverwaltung1.dtd"
line="3-5">
</listing>
<ul>
<li>
Von besonderem Interesse ist die Definition
des Qualifikationsprofils mit gemischtem
Inhaltsmodell. Dies wird durch das
Boole'sche Attribut
<code>mixed</code>
ausgedrückt.
</li>
<li>
Wichtiger Unterschied zur DTD:
DTD-validierende Parser können gemischte
Inhalte nur rudimentär prüfen. Mit XSD
eröffnet sich die Möglichkeit zur
vollständigen inhaltlichen Validierung
gemischter Inhalte. Die DTD erlaubt es zwar,
(möglicherweise) auftretende Elemente
innerhalb unstrukturierter Textpassagen zu
spezifizieren, es ist aber nicht möglich,
die Häufigkeit oder Reihenfolge der Elemente
anzugeben (vgl. Beispiel-DTD zur
Projektverwaltung - dort wäre auch die
Hintereinanderreihung von Qualifikationen
ohne zugehörige Leistungsstufe zulässig).
Insgesamt kann durch DTD-basierte
Validierung das Auftreten von Elementen in
gemischten Inhaltsmodellen nicht geprüft
werden. Durch den Einsatz von XML-Schema
ergibt sich auch für gemischte
Inhaltsmodelle die Möglichkeit zur strikten
Validierung. Dies bedeutet konkret, daß
Anzahl und Auftretensreihenfolge der
angegebenen Kindelemente überprüft werden
können.
</li>
</ul>
</slide>
<slide>
<title>
Globale und lokale Elementdefinitionen
</title>
<ul>
<li>
<em>Globale Elementdefinitionen</em>
werden zunächst deklariert und in einem
zweiten Schritt durch Referenzierung als
Kindelemente verwendet (wie Person und
Projekt innerhalb Projektverwaltung, oder
Qualifikationsprofil innerhalb des Elements
Person).
</li>
<li>
Ihre Gegenstücke, die
<em>lokalen Elementdeklarationen</em>
befinden die sich hingegen vollständig im
Elternelement finden (wie Vorname, Nachname
und Qualifikation).
</li>
<li>
Durch Globale Elementdefinitionen können
vollständige Elemente an verschiedenen
Stellen im Schema referenziert und so
verwendet werden. Die Definition ist der
lokalen ebenbürtig und wird im
Instanzdokument identisch behandelt.
</li>
<li>
Mit dem Referenzierungsmechanismus für
Elemente kann eine einfache Form der
Wiederverwendung umgesetzt werden. Jedoch
werden Elemente hierbei zwingend in ihrer
vollständigen Definition, d.h. Name, Typ und
Inhaltsmodell, eingebunden. (Im Grunde
genommen ist diese Art der Wiederverwendung
für Elemente bereits mit den Mitteln der DTD
möglich. Allerdings, wie im eben
betrachteten Beispiel, auch dergestalt, daß
nur die vollständige Definition übernommen
werden kann.)
</li>
</ul>
</slide>
<slide>
<title>Benannte komplexe Typen</title>
<ul>
<li>
XML-Schema bietet zusätzlich die
Möglichkeit, strukturierte Typen, die
ausschließlich durch ihr Inhaltsmodell
definiert werden, festzulegen.
</li>
<li>
Die Benennung des Typs wird hierdurch
unabhängig von der Namensgebung der
typisierten Instanz.
</li>
<li>
Syntaktisch erfolgt die Typbildung durch die
Benennung des complexType-Elements durch ein
Attribut name.
</li>
<li>
Um die mehrfache Verwendung eines solchen
Typen zu ermöglichen, muß seine Definition
zwingend auf einer Baumstufe erfolgen, die
für alle nutzenden Elemente erreichbar ist.
Üblicherweise werden daher diese
Definitionen auf der ersten Stufe, direkt
unterhalb des Wurzelknotens, plaziert.
</li>
<li>
Zur Unterscheidung dieser benannten
komplexen Typen werden die bisher genutzten
-- namenlosen Typen -- als anonyme komplexe
Typen bezeichnet.
</li>
<li>
Das nachfolgende Beispiel zeigt die
Definition des benannten komplexen Typen
<code>PersonType</code>
. Dieser Typ wird zur Festlegung des
Inhaltsmodells des Elements
<code>Person</code>
verwendet.
</li>
</ul>
<listing src="projektverwaltung2.xsd"></listing>
</slide>
<slide>
<title>
Erweiterung, Einschränkung und Substitution
</title>
<ul>
<li>
In XML-Schema gibt es die Möglichkeit,
eigene Datentypen durch Erweiterung
(Extension), Einschränkung (Restriction) und
Substitution anderer Datentypen zu
definieren. In allen Fällen dient ein
bereits definierter Datentyp als Basis.
</li>
<li>
<em>Erweiterung (Extension)</em>
: Die im bestehenden Datentyp enthaltene
Information ist jedoch nicht ausreichend, es
werden zusätzliche Informationen benötigt.
Der bestehende Datentyp wird daher um diese
Information ergänzt (erweitert).
<br />
Beispiel: Es gibt einen bereits definierten
Datentyp eine
<code>Adresse</code>
, der aus Name, Straße und Ort besteht.
Adressen in D zeichnen sich zusätzlich noch
durch eine Postleitzahl aus. Der
ursprungliche Datentyp Adresse kann demnach
um die Postleitzahl erweitert werden.
</li>
<li>
<em>Einschränkung (Restriction)</em>
: Analog zur Definition von Datentypen durch
Erweiterung können auch durch
<em>Einschränkung</em>
eigene Datentypen abgeleitet werden. Der
abgeleitete Datentyp ist dem Originaltyp
sehr ähnlich, seine Deklarationen sind
jedoch eingeschränkt, die Werte des
abgeleiteten Typs entsprechen einer
Untermenge der Werte des ursprünglichen
Typs. Mit anderen Worten: Wenn eine
Anwendung Werte des Originaltyps verarbeiten
kann, kann sie auch Werte des abgeleiteten
Typs verarbeiten.
<br />
Beispiel: Setzen eines Vorgabewerts oder
Beschränkung in der Anzahl von erlaubten
Kindelementen (etwa von 0 - unendlich auf
1-5)
</li>
<li>
<em>Substitution</em>
: Mit Hilfe der
<em>Substitution</em>
kann ein Element durch ein anderes Element
ersetzt werden. Elemente werden hierzu
sogenannten
<em>Substitutionsgruppen</em>
zugeordnet. Die Elemente dieser Gruppe
können dann anstatt eines speziellen
benannten Elements, des
<em>Head Elements</em>
verwendet werden.
</li>
</ul>
</slide>
<slide>
<title>
Ableitung durch Einschränkung -- Beispiel
</title>
<listing src="ctinhrest.xsd"></listing>
<ul>
<li>
Im Beispiel sehen Sie zwei benannte komplexe
Typen
<code>childType</code>
und
<code>parentType</code>
.
</li>
<li>
<code>childType</code>
basiert auf
<code>parentType</code>
und erbt von diesem. Die Vererbung ist
ausgedrückt durch das
<code>base</code>
-Attribut im Element
<code>restriction</code>
, das auf den benannten Elterntypen
verweist.
</li>
<li>
Inhalte von
<code>restriction</code>
-Elementen werden genauso angegeben wie
Inhalte von komplexen Typen: Es werden
Elemente definiert, sowie die Art und Weise
ihres Auftretens (Reihenfolge, Häufigkeit).
</li>
<li>
<code>elementA</code>
in
<code>childType</code>
schränkt
<code>elementA</code>
in
<code>parentType</code>
ein: der Datentyp
<code>short</code>
(
<code>
-2
<sup>15</sup>
<= short <= 2
<sup>15</sup>
-1
</code>
) ist enger gefaßt als der Datentyp
<code>int</code>
(
<code>
-2
<sup>31</sup>
<= short <= 2
<sup>31</sup>
-1
</code>
).
</li>
<li>
Die beiden Elementdefinitionen
<code>usage1</code>
und
<code>usage2</code>
zeigen die Verwendung der
anwenderdefinierten Typen.
</li>
</ul>
</slide>
<slide>
<title>
Ableitung durch Einschränkung -- weitere Arten
der Einschränkung
</title>
<p>
Es gibt - über die soeben gezeigte Möglichkeit
der EInschränkung auf Typisierung hinaus --
weiter Möglichkeiten der Einschränkung, die Sie
in der folgenden Tabelle zusammengestellt sehen.
</p>
<table border="1">
<thead>
<tr>
<th>Basistyp</th>
<th>Restriktion</th>
<th>Bemerkung</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>default</td>
<td>
Zusätzliche Belegung eines Elements
mit einem Vorgabewert
</td>
</tr>
<tr>
<td></td>
<td>fixed</td>
<td>
Beschränkung eines zunächst frei
wählbaren Elements auf konstanten
Inhalt
</td>
</tr>
<tr>
<td></td>
<td>type</td>
<td>
Definition eines Typen für ein
zunächst untypisiertes Element.
(Auch hierbei handelt es sich um
eine einschränkende Redefinition, da
allen Elementen ohne Typdefinition
standardmäßig der Typ
<code>anyType</code>
zugeordnet wird.)
</td>
</tr>
<tr>
<td>
<code>
minOccurs=n
<sub>1</sub>
, maxOccurs=m
<sub>1</sub>
</code>
</td>
<td>
<code>
minOccurs=n
<sub>2</sub>
, maxOccurs=m
<sub>2</sub>
</code>
</td>
<td>
Restriktion der Auftrittshäufigkeit
auf eine geringere Anzahl.Daher
gilt:
<code>
n
<sub>1</sub>
<= n
<sub>2</sub>
</code>
und
<code>
m
<sub>1</sub>
><= m
<sub>2</sub>
</code>
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
Ableitung durch Erweiterung -- Beispiel
</title>
<listing src="ctinhext.xsd"></listing>
<ul>
<li>
Die Erweiterung definiert zusätzliche
Elemente zum Basistyp.
</li>
<li>
Im Beispiel sehen Sie erneut zwei benannte
komplexe Typen:
<code>parentElement</code>
und
<code>childElement</code>
genannt.
</li>
<li>
Während
<code>parentElement</code>
genau ein Element
<code>elementA</code>
beinhaltet, wird
<code>childElement</code>
dahingehend erweitert, daß es zusätzlich
dazu auch noch genau ein Element
<code>elementB</code>
beinhalten kann.
</li>
</ul>
</slide>
<slide>
<title>
Ableitung komplexer Typen von einfachen Typen
</title>
<ul>
<li>
<em>komplexe (Daten-)Typen</em>
: XML-artiger, strukturierter Inhalt
</li>
<li>
<em>einfache (Daten-)Typen</em>
: die 44 von XML Schema vordefinierten
Datentypen. Sie entsprechen nicht
XML-artigem (strukturiertem) Inhalt
</li>
<li>
XML Schema erlaubt es, komplexe Typen von
einfachen Typen abzuleiten.
</li>
<li>
Elemente, die einfache Datentypen
(simpleTypes) als Werte haben, können
zunächst keine Attribute haben.
</li>
<li>
Soll dies ermöglicht werden, muß eine
derartige Ableitung erfolgen.
</li>
</ul>
</slide>
<slide>
<title>
Ableitung von komplexen Typen durch einfache
Typen -- Beispiel
</title>
<p>
Dieses Schema definiert das Element Vorname als
einfachen Typ (string).
</p>
<table
width="100%"
border="0">
<tr>
<td>
<listing src="verySimpleContent.xsd"></listing>
</td>
<td>
<listing
src="sehrEinfacherInhalt.xml">
</listing>
</td>
</tr>
</table>
<p>
Hier hingegen wird der Datentyp
<code>string</code>
erweitert. Das Element enthält immer noch einen
einfachen Datentyp (
<code>simpleContent</code>
), darf aber nun ein Attribut (
<code>rufname</code>
) enthalten.
</p>
<table
width="100%"
border="0">
<tr>
<td>
<listing src="simpleContent.xsd"></listing>
</td>
<td>
<listing src="einfacherInhalt.xml"></listing>
</td>
</tr>
</table>
</slide>
<slide>
<title>
Festlegen eigener primitiver Datentypen --
<code>simpleType</code>
</title>
<ul>
<li>
XML Schema ermöglicht es, eigene (primitive)
Datentypen festzulegen oder eigene Typen von
bestehenden abzuleiten.
</li>
<li>
Dies erfolgt mit Hilfe des Elements
<code>simpleType</code>
.
</li>
<ul>
<li>
<em>Ableitung durch Einschränkung</em>
</li>
<li>
<em>Listen</em>
</li>
<li>
<em>Vereinigungstypen</em>
</li>
</ul>
<li>
Für Ableitung durch Einschränkung gilt: An
jeder Stelle, an der eine Ausprägung eines
Supertyps erwartet wird, darf auch eine
Ausprägung eines davon abgeleiteten Subtypen
auftreten.
<br />
(Beispiel: wird an einer Stelle des
Instanzdokumentes durch das Schema das
Auftreten einer Ausprägung von
<code>integer</code>
verlangt, so kann der Anwender auch
Ausprägungen der Subtypen
<code>int</code>
,
<code>short</code>
oder
<code>byte</code>
angeben, ohne die Gültigkeit des
XML-Dokuments zu beeinträchtigen.)
</li>
</ul>
</slide>
<slide>
<title>
Festlegen eigener primitiver Datentypen --
Listen
</title>
<ul>
<li>
Listen bestehen aus einer Aneinanderreihung
atomarer Datentypen.
</li>
<li>
Zusätzlich zu den drei in XML Schema
vordefinierten Listentypen
<code>NMTOKENS</code>
,
<code>IDREFS</code>
und
<code>ENTITIES</code>
besteht die Möglichkeit, eigene Listentypen
zu definieren, die sich aus atomaren
Datentypen zusammensetzen.
</li>
<li>
Das folgende Beispiel zeigt die Definition
eines Listentyps
<code>ListeDerWochentage</code>
:
</li>
</ul>
<listing
src="simpletype.xsd"
line="8-21">
</listing>
<ul>
<li>
Zunächst werden durch die aufzählende
Einschränkung bei
<code>dieWochentage</code>
die Werte des Typs auf eine Menge ganz
spezieller Werte begrenzt.
</li>
<li>
Der so definierte Datentyp wird dann als
Basis für den Listentyp verwendet.
</li>
</ul>
</slide>
<slide>
<title>
Festlegen eigener primitiver Datentypen --
Vereinigungstypen
</title>
<ul>
<li>
Vereinigungstypen setzen sich aus einer
Menge von Ausgangstypen zusammen.
</li>
<li>
Im Beispiel sehen Sie die Definition eines
Typen
<code>termin</code>
, der eine Vereinigung aus dem vorgegebenen
Primitivtypen
<code>date</code>
und einer Liste
<code>ListeDerWochentage</code>
darstellt.
</li>
</ul>
<listing
src="simpletype.xsd"
line="3-7">
</listing>
</slide>
<slide>
<title>
Festlegen eigener primitiver Datentypen --
Ableitung durch Einschränkung
</title>
<ul>
<li>
Im Beispiel ist ein weiteres Beispiel für
einen einschränkenden Datentyp dargestellt.
</li>
<li>
Der vorgegebene Typ
<code>integer</code>
wird derart limitiert, daß lediglich die
Werte zwischen
<code>10000</code>
und
<code>99999</code>
als gültige Wertbelegungen zulässig sind.
</li>
</ul>
<listing
src="simpletype.xsd"
line="22-27">
</listing>
</slide>
<slide>
<title>
Ableitung durch Einschränkung - Arten der
Einschränkung
</title>
<p>
XML Schema definiert 12 voneinander unabhängige
sogenannte
<em>Fassetten</em>
, die zur Begrenzung der erlaubten Werte vom
Primitivtypen eingesetzt werden können. Nicht
alle Fassetten können auf alle Typen angewendet
werden. Eine Übersicht zur Anwendbarkeit findet
sich in
<a
href="http://www.w3.org/TR/xmlschema-0/index.html#SimpleTypeFacets">
Anhang B von XML Schema Part 0: Primer
</a>
.
</p>
<ul>
<li>
<em>length</em>
: Gibt die Anzahl der zulässigen Einheiten
des Datentyps an (bei zeichenkettenartigen
Datentypen entspricht dies der Anzahl der
Zeichen) an. Bei Listen kann hiermit die
Anzahl der Elemente festgelegt werden.
<br />
<listing
src="simpletype.xsd"
line="28-32">
</listing>
</li>
<li>
<em>minLength</em>
: Definiert die minimale Länge von atomaren
Datentypen bzw. die minimale Anzahl von
Elementen einer Liste.
<br />
<listing
src="simpletype.xsd"
line="33-37">
</listing>
<listing
src="simpletype.xsd"
line="38-45" />
</li>
<li>
<em>maxLength</em>
: Definiert die maximale Länge von atomaren
Datentypen bzw. die maximale Anzahl von
Elementen einer Liste.
<br />
<listing
src="simpletype.xsd"
line="46-50">
</listing>
<listing
src="simpletype.xsd"
line="51-59" />
</li>
<li>
<em>pattern</em>
: Ein
<code>pattern</code>
legt dem Wertebereich eines atomaren
Datenyps definierte Bedingungen auf. Die
Werte werden auf Zeichen begrenzt, die einem
bestimmten Muster entsprechen. Der Wert des
Musters muß ein
<em>regulärer Ausdruck</em>
sein (siehe nächste Seite).
</li>
<li>
<em>enumeration</em>
: Mit einer
<em>Aufzählung</em>
wird der Wertebereich eines Datentyps auf
eine genau spezifizierte Menge eingeengt.
<br />
<listing
src="simpletype.xsd"
line="65-86" />
</li>
<li>
<em>whiteSpace</em>
: Der Wertebereich des betreffenden
Datentypen kann nach den drei Regeln, wie
sie auch für die Normalisierung von
(zeichenkettenartigen) Attributwerten
gelten, eingegrenzt werden:
<ul>
<li>
<em>preserve</em>
: keine Normalisierung, der Wert
bleibt unverändert.
</li>
<li>
<em>replace</em>
:Tabulatoren (
<code>#x9</code>
), Zeilenvorschub (
<code>#xA</code>
) und Wagenrücklauf (
<code>#xD</code>
) werden durch Leerzeichen (
<code>#x20</code>
) ersetzt.
</li>
<li>
<em>collapse</em>
: Es werden die Regeln von
<em>replace</em>
angewandt. Zusätzlich dazu werden
mehrfach direkt hintereinander
vorkommende Leerzeichen zu einem
einzelnen Leerzeichen zusammengefaßt
sowie führende und abschließende
Leerzeichen entfernt.
</li>
</ul>
</li>
<li>
<em>maxInclusive</em>
: Mit
<code>maxInclusive</code>
kann die obere (inklusive) Grenze für den
Wertebereich eines Datentyps angegeben
werden.
<listing
src="simpletype.xsd"
line="87-91" />
</li>
<li>
<em>maxExclusive</em>
: Analog
<code>maxInclusive</code>
, mit dem Unterschied, daß der angegebene
Wert nicht mehr zum Wertebereich zählt.
<br />
<listing
src="simpletype.xsd"
line="92-96">
</listing>
</li>
<li>
<em>minInclusive</em>
: Gibt die untere (inklusive) Grenze eines
Wertebereichs an.
<listing
src="simpletype.xsd"
line="97-101" />
</li>
<li>
<em>minExclusive</em>
: Analog
<code>minInclusive</code>
, mit dem Unterschied, daß der angegebene
Wert nicht mehr zum Wertebereich zählt.
<br />
<listing
src="simpletype.xsd"
line="102-106" />
</li>
<li>
<em>totalDigits</em>
: Gibt die Gesamtstellen einer Zahl an,
gebildet aus der Summe der Vorkomma- und der
Nachkommastellen.
<br />
<listing
src="simpletype.xsd"
line="107-111">
</listing>
</li>
<li>
<em>fractionDigits</em>
: Steuert die Anzahl der Nachkommastellen
eines Dezimalbruches.
<br />
<listing
src="simpletype.xsd"
line="112-119" />
</li>
</ul>
</slide>
<slide>
<title>Reguläre Ausdrücke</title>
<p class="definition">
Ein
<em>Regulärer Ausdruck</em>
ist eine Syntax, die eine Menge von
Zeichenketten beschreibt.
</p>
<ul>
<li>
Reguläre Ausdrücke haben ihre Wurzeln im
Betriebssystem UNIX, wo sie seit den 1960ern
in Editoren Einzug fanden.
</li>
<li>
Heute werden sie in vielen
Programmiersprachen verwendet (z.B. Java
seit JDK1.4, Perl, C++, C#, Python, PHP,
Ruby, ... )
</li>
<li>
Verwendung: Erkennen von Zeichenketten, die
bestimmten Mustern entsprechen.
</li>
<li>
In XML Schema: Vorgeben von Mustern für
Zeichenketten.
</li>
<li>
Syntax: Quantoren, Fluchtsymbole,
Zeichenklassen
</li>
</ul>
</slide>
<slide>
<title>Reguläre Ausdrücke - Quantoren</title>
<p>
Quantoren steuern die Auftrittshäufigkeit von
sog. atomaren Einheiten (Zeichen, Zeichenklasse,
Regulärer Ausdruck).
</p>
<table border="1">
<thead>
<tr>
<th>Quantifizierte atomare Einheit</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>S</code>
</td>
<td>
<q>Genau S</q>
: Alle Zeichenketten, die
<code>S</code>
genau entsprechen.
</td>
</tr>
<tr>
<td>
<code>S?</code>
</td>
<td>
<q>Optional</q>
: Die leere Zeichenkette oder alle
Zeichenketten, die
<code>S</code>
genau entsprechen.
</td>
</tr>
<tr>
<td>
<code>S*</code>
</td>
<td>
<q>Beliebig</q>
: Alle Reihungen von
<code>S</code>
; insbesondere auch auch die leere
Zeichenkette.
</td>
</tr>
<tr>
<td>
<code>S+</code>
</td>
<td>
<q>Mindestens einmal</q>
: Alle Reihungen von
<code>S</code>
, die
<code>S</code>
mindestens einmal enthalten.
</td>
</tr>
<tr>
<td>
<code>S{n,m}</code>
</td>
<td>
<q>
<code>n</code>
bis
<code>m</code>
mal
</q>
: Alle Zeichenketten, die aus
mindestens
<code>n</code>
, jedoch höchstens
<code>m</code>
Auftreten von
<code>S</code>
bestehen.
</td>
</tr>
<tr>
<td>
<code>S{n}</code>
</td>
<td>
<q>
Genau
<code>n</code>
mal
</q>
: Alle Zeichenketten, die aus genau
<code>n</code>
Auftreten von
<code>S</code>
bestehen.
</td>
</tr>
<tr>
<td>
<code>S{n,}</code>
</td>
<td>
<q>
Mindestens
<code>n</code>
mal
</q>
: Alle Zeichenketten, die aus
mindestens
<code>n</code>
Auftreten von
<code>S</code>
bestehen.
</td>
</tr>
<tr>
<td>
<code>S{0,m}</code>
</td>
<td>
<q>
Höchstens
<code>m</code>
mal
</q>
: Alle Zeichenketten, die aus
höchstens
<code>m</code>
Auftreten von
<code>S</code>
bestehen.
</td>
</tr>
<tr>
<td>
<code>S{0,0}</code>
</td>
<td>Die leere Zeichenkette</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
Reguläre Ausdrücke - Beispiele für Quantoren
</title>
<table border="1">
<thead>
<tr>
<th>Ausdruck</th>
<th>entsprechende Zeichenketten</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>a*x</code>
</td>
<td>
<code>x, ax, aax, aaax ....</code>
</td>
</tr>
<tr>
<td>
<code>a?x</code>
</td>
<td>
<code>ax, x</code>
</td>
</tr>
<tr>
<td>
<code>a+x</code>
</td>
<td>
<code>ax, aax, aaax ...</code>
</td>
</tr>
<tr>
<td>
<code>(a|b)+x</code>
</td>
<td>
<code>
ax, bx, aax, abx, bax, bbx,
aaax, aabx, abax, abbx, baax,
babx, bbax, bbbx, aaaax ....
</code>
</td>
</tr>
<tr>
<td>
<code>[abcde]x</code>
</td>
<td>
<code>ax, bx, cx, dx, ex</code>
</td>
</tr>
<tr>
<td>
<code>[a-e]x</code>
</td>
<td>
<code>ax, bx, cx, dx, ex</code>
</td>
</tr>
<tr>
<td>
<code>[-ae]x</code>
</td>
<td>
<code>-x, ax, ex</code>
</td>
</tr>
<tr>
<td>
<code>[ae-]x</code>
</td>
<td>
<code>ax, ex, -x</code>
</td>
</tr>
<tr>
<td>
<code>[^0-9]x</code>
</td>
<td>
<code>
Jedes Zeichen, das keine Ziffer
darstellt, gefolgt von dem
Buchstaben x.
</code>
</td>
</tr>
<tr>
<td>
<code>.x</code>
</td>
<td>
<code>
Jedes Zeichen gefolgt von dem
Buchstaben x.
</code>
</td>
</tr>
<tr>
<td>
<code>.*abc.*</code>
</td>
<td>
<code>
1x2abc, abc1x2, z3456abchooray
....
</code>
</td>
</tr>
<tr>
<td>
<code>ab{2}x</code>
</td>
<td>
<code>abbx</code>
</td>
</tr>
<tr>
<td>
<code>ab{2,4}x</code>
</td>
<td>
<code>abbx, abbbx, abbbbx</code>
</td>
</tr>
<tr>
<td>
<code>ab{2,}x</code>
</td>
<td>
<code>
abbx, abbbx, abbbbx ....
</code>
</td>
</tr>
<tr>
<td>
<code>(ab){2}x</code>
</td>
<td>
<code>ababx</code>
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>Reguläre Ausdrücke - Fluchtsymbole</title>
<p>
Ein
<em>Fluchtsymbol</em>
(engl.:
<em>character escape</em>
) in regulären Ausdrücken dient der Darstellung
von Zeichen, die anderweitig nur schwer oder
unmöglich in einen regulären Ausdruck schreiben
kann (weil sie mit Bedeutung belegt sind oder
praktisch schwer zu schreiben sind wie etwa
Zeilenumbrüche, Zeilenvorschub oder
Tabulatoren). Diese sind in Teilen aus den
Programmiersprachen bekannt.
</p>
<table border="1">
<thead>
<tr>
<th>Fluchtsymbol</th>
<th>dadurch ausgedrücktes Zeichen</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>\n</code>
</td>
<td>
Das Zeichen für Zeilenumbruch (
<code>#xA</code>
).
</td>
</tr>
<tr>
<td>
<code>\r</code>
</td>
<td>
Das Zeichen für Zeilenvorschub (
<code>#xD</code>
).
</td>
</tr>
<tr>
<td>
<code>\t</code>
</td>
<td>
Das Tabulator-Zeichen (
<code>#x9</code>
).
</td>
</tr>
<tr>
<td>
<code>\\</code>
</td>
<td>
<code>\</code>
</td>
</tr>
<tr>
<td>
<code>\|</code>
</td>
<td>
<code>|</code>
</td>
</tr>
<tr>
<td>
<code>\.</code>
</td>
<td>
<code>.</code>
</td>
</tr>
<tr>
<td>
<code>\-</code>
</td>
<td>
<code>-</code>
</td>
</tr>
<tr>
<td>
<code>\^</code>
</td>
<td>
<code>^</code>
</td>
</tr>
<tr>
<td>
<code>\?</code>
</td>
<td>
<code>?</code>
</td>
</tr>
<tr>
<td>
<code>\*</code>
</td>
<td>
<code>*</code>
</td>
</tr>
<tr>
<td>
<code>\+</code>
</td>
<td>
<code>+</code>
</td>
</tr>
<tr>
<td>
<code>\{</code>
</td>
<td>
<code>{</code>
</td>
</tr>
<tr>
<td>
<code>\}</code>
</td>
<td>
<code>}</code>
</td>
</tr>
<tr>
<td>
<code>\(</code>
</td>
<td>
<code>(</code>
</td>
</tr>
<tr>
<td>
<code>\)</code>
</td>
<td>
<code>)</code>
</td>
</tr>
<tr>
<td>
<code>\[</code>
</td>
<td>
<code>[</code>
</td>
</tr>
<tr>
<td>
<code>\]</code>
</td>
<td>
<code>]</code>
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>Reguläre Ausdrücke - Zeichenklassen</title>
<p>
Verschiedene Zeichen mit ähnlichen Eigenschaften
werden im XML Schema zu
<em>Zeichenklassen</em>
gruppiert. Diese Zeichen können so in ihrer
Gesamtheit durch die Verwendung der sie
bezeichnenden Symbole in den regulären
Ausdrücken verwendet werden.
<br />
So bezeichnet die Angabe der Zeichenklasse
<code>\p{X}</code>
alle Zeichen aus X. Diese Angaben können durch
<code>\P{X}</code>
invertiert werden. (
<code>[\P{X}] = [^\p{X}]</code>
).
</p>
<ul>
<li>Buchstaben</li>
<table border="1">
<thead>
<tr>
<th>Symbol</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>L</code>
</td>
<td>Alle Buchstaben</td>
</tr>
<tr>
<td>
<code>Lu</code>
</td>
<td>Großbuchstaben (uppercase)</td>
</tr>
<tr>
<td>
<code>Ll</code>
</td>
<td>Kleinbuchstaben (lowercase)</td>
</tr>
<tr>
<td>
<code>Lt</code>
</td>
<td>
Titlecase: Großschreibung des
ersten Zeichens eines Wortes.
Diese Art der Schreibung ist
üblicherweise abhängig von der
verwendeten Sprache. Im
Englischen jedoch kommt der Name
aus dem Zeitschriftenwesen, da
dort oft in Überschriften
einzelne Wörter großgeschrieben
werden.
</td>
</tr>
<tr>
<td>
<code>Lm</code>
</td>
<td>
Modifier: Verschiedene Ton- und
Betonungszeichen
</td>
</tr>
<tr>
<td>
<code>Lo</code>
</td>
<td>
Other: Alle Zeichen, die in
keine der sonstigen
L-Zeichenfamilien fallen
</td>
</tr>
</tbody>
</table>
<li>
<q>Markierungssymbole</q>
</li>
<table border="1">
<thead>
<tr>
<th>Symbol</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>M</code>
</td>
<td>Alle Markierungssymbole</td>
</tr>
<tr>
<td>
<code>Mn</code>
</td>
<td>
Markierungssymbole ohne
Leerzeichen (z.B. diakritische
Zeichen: kleine Zeichen wie
Punkte, Häkchen, Kringel, sie
markieren eine besondere
Betonung oder Aussprache.)
</td>
</tr>
<tr>
<td>
<code>Mc</code>
</td>
<td>
Markierungssymbole
<q>spacing combining</q>
: Hauptsächlich im asiatischen
Sprachraum anzutreffende
(Myanmar, Khmer, Tibetisch,
Bengalisch, ...)
Markierungssymbole, die mit
Leerzeichen kombiniert sind.
</td>
</tr>
<tr>
<td>
<code>Me</code>
</td>
<td>
Andere Markierungssymbole, die
andere Zeichen beinhalten (z.B.
das kyrillische Zeichen für
Hunderttausend und Million).
</td>
</tr>
</tbody>
</table>
<li>Zahlen</li>
<table border="1">
<thead>
<tr>
<th>Symbol</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>N</code>
</td>
<td>Alle Nummern</td>
</tr>
<tr>
<td>
<code>Nd</code>
</td>
<td>
Dezimalzahlen, darunter auch
auch arabisch-indische, gurmukhi
und gujarati (zwei indische
Schriften), thailändisch, und
Weitere,
</td>
</tr>
<tr>
<td>
<code>Nl</code>
</td>
<td>
Durch Buchstaben dargestellte
Nummern, z.B. die lateinischen
Zahlen
<code>I</code>
,
<code>II</code>
,
<code>III</code>
, ....
</td>
</tr>
<tr>
<td>
<code>No</code>
</td>
<td>
Andere Darstellungen von Nummern
(z.B. Brüche 1/4, 1/2, 3/4,
weitere Khmer-Symbole für 10 bis
100, hochgestellt und
tiefgestellte Ziffern, in
Kreisen dargestellte Zahlen,
etc.)
</td>
</tr>
</tbody>
</table>
<li>Interpunktionssymbole</li>
<table border="1">
<thead>
<tr>
<th>Symbol</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>P</code>
</td>
<td>
Alle Interpunktionssymbole
(Punctuation)
</td>
</tr>
<tr>
<td>
<code>Pc</code>
</td>
<td>
Verbindende
Interpunktionssymbole wie
Unterstrich, Bogen über Zeichen,
etc.
</td>
</tr>
<tr>
<td>
<code>Pd</code>
</td>
<td>Verbindungsstriche</td>
</tr>
<tr>
<td>
<code>Ps</code>
</td>
<td>
Bereiche öffnende
Interpunktionssymbole (z.B.
öffnende Klammern)
</td>
</tr>
<tr>
<td>
<code>Pe</code>
</td>
<td>
Bereiche schließende
Interpunktionssymbole (z.B.
schließende Klammern)
</td>
</tr>
<tr>
<td>
<code>Pi</code>
</td>
<td>
Zitatbeginn (z.B. öffnende
Anführungszeichen)
</td>
</tr>
<tr>
<td>
<code>Pf</code>
</td>
<td>
Zitatende (z.B. schließende
Anführungszeichen)
</td>
</tr>
<tr>
<td>
<code>Po</code>
</td>
<td>
Alle anderen
Interpunktionssymbole (z.B.
Semikolen, Ausrufezeichen,
Fragezeichen, etc.)
</td>
</tr>
</tbody>
</table>
<li>Seperatoren</li>
<table border="1">
<thead>
<tr>
<th>Symbol</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>Z</code>
</td>
<td>Alle Separatoren</td>
</tr>
<tr>
<td>
<code>Zs</code>
</td>
<td>
Alle Leerzeichen (einfache,
diverse Längen (3-fach, 4-fach),
aber auch mongolische
vokaltrennende Leerzeichen)
</td>
</tr>
<tr>
<td>
<code>Zl</code>
</td>
<td>
Zeilentrenner (
<code>#x2028</code>
)
</td>
</tr>
<tr>
<td>
<code>Zp</code>
</td>
<td>
Absatztrenner (
<code>#x2029</code>
)
</td>
</tr>
</tbody>
</table>
<li>Symbole</li>
<table border="1">
<thead>
<tr>
<th>Symbol</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>S</code>
</td>
<td>Alle Symbole</td>
</tr>
<tr>
<td>
<code>Sm</code>
</td>
<td>mathematische Symbole</td>
</tr>
<tr>
<td>
<code>Sc</code>
</td>
<td>
Währungssymbole (
<code>€, $</code>
)
</td>
</tr>
<tr>
<td>
<code>Sk</code>
</td>
<td>
Modifier (wenige Akzente,
Betonungshinweise, etc.)
</td>
</tr>
<tr>
<td>
<code>So</code>
</td>
<td>
weitere Symbole
(Copyright-Symbol, Grad Celsius,
Pfeile, etc.)
</td>
</tr>
</tbody>
</table>
<li>Sonstige</li>
<table border="1">
<thead>
<tr>
<th>Symbol</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>C</code>
</td>
<td>Alle Sonstigen</td>
</tr>
<tr>
<td>
<code>Cc</code>
</td>
<td>
Kontrollzeichen (z.B.
<code>End of Transmission</code>
,
<code>>Backspace</code>
,
<code>Delete</code>
, etc.)
</td>
</tr>
<tr>
<td>
<code>Cf</code>
</td>
<td>
Formatierungszeichen (z.B.
syrisches Abkürzungszeichen)
</td>
</tr>
<tr>
<td>
<code>Co</code>
</td>
<td>
Zeichen aus dem Unicode-Bereich
zur freien anwenderdefinierten
Belegung (mit ungefähr 137500
Zeichen)
</td>
</tr>
<tr>
<td>
<code>Cn</code>
</td>
<td>
Zeichen, denen innerhalb Unicode
explizit keine Belegung
zugewiesen wurde
</td>
</tr>
</tbody>
</table>
</ul>
</slide>
<slide>
<title>
Reguläre Ausdrücke - Negation und
Zeichensequenzen
</title>
<ul>
<li>
Durch das Zeichen
<code>^</code>
wird eine Negation eines Ausdrucks
definiert.
</li>
<li>
Desweiteren existieren noch folgende vor
definierte Zeichensequenzen mit häufig
anzutreffenden Zeichen:
</li>
<table border="1">
<thead>
<tr>
<th>Symbol</th>
<th>Bedeutung</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>.</code>
</td>
<td>
Alle Zeichen außer Zeilenumbruch
und Zeilenvorschub (entspricht
<code>[^\n\r]</code>
)
</td>
</tr>
<tr>
<td>
<code>\s</code>
</td>
<td>
Versammelt Leerzeichen,
Tabulator, Zeilenumbruch und
Zeilenvorschub (
<code>[#x20\t\n\r]</code>
)
</td>
</tr>
<tr>
<td>
<code>\S</code>
</td>
<td>
Alles außer Leerzeichen,
Tabulator, Zeilenumbruch und
Zeilenvorschub (
<code>[^\s]</code>
)
</td>
</tr>
<tr>
<td>
<code>\i</code>
</td>
<td>
Die initialen Zeichen eines
gültigen XML-Namens: ein
Buchstabe, der Unterstrich
<code>_</code>
oder der Doppelpunkt
<code>:</code>
</td>
</tr>
<tr>
<td>
<code>\I</code>
</td>
<td>
Die Negation der vorhergehenden
Definition (
<code>[^\i]</code>
)
</td>
</tr>
<tr>
<td>
<code>\c</code>
</td>
<td>
Alle für XML-Namen zugelassenen
Zeichen
</td>
</tr>
<tr>
<td>
<code>\C</code>
</td>
<td>
Alle Zeichen, die nicht in
XML-Namen zugelassen sind
</td>
</tr>
<tr>
<td>
<code>\d</code>
</td>
<td>
Entspricht
<code>\p{Nd}</code>
: Dezimalzahlen, darunter auch
auch arabisch-indische, gurmukhi
und ....
</td>
</tr>
<tr>
<td>
<code>\D</code>
</td>
<td>
Alle Zeichen, die nicht
Dezimalzahlen entsprechen (
<code>[^\d]</code>
)
</td>
</tr>
<tr>
<td>
<code>\w</code>
</td>
<td>
<br />
Alle Zeichen außerhalb der
Zeichenklassen
<q>Interpunktion</q>
,
<q>Separatoren</q>
" und
<q>Sonstige</q>
(
<code>
[#x0000-#x10FFFF]-[\p{P}\p{Z}\p{C}]
</code>
)
</td>
</tr>
<tr>
<td>
<code>\W</code>
</td>
<td>
Alle Zeichen innerhalb der
Zeichenklassen
<q>Interpunktion</q>
,
<q>Separatoren</q>
" und
<q>Sonstige</q>
(
<code>[^\w]</code>
)
</td>
</tr>
</tbody>
</table>
</ul>
</slide>
<slide>
<title>Reguläre Ausdrücke - Beispiele</title>
<ul>
<li>KFZ-Kennzeichen</li>
<listing
src="regExp.xsd"
line="3-7">
</listing>
<li>
Social Security Number (vgl.
<em>Professional XML Schemas</em>
. By Kurt Cagle, Jon Duckett, Oliver
Griffin, Stephen Mohr, Francis Norton,
Nikola Ozu, Ian Stokes-Rees, Jeni Tennison,
and Kevin Williams. Wrox Programmer to
Programmer Series. Birmingham, UK: Wrox
Press Ltd., [July] 2001. ISBN:
1-861005-47-4)
</li>
<listing
src="regExp.xsd"
line="8-12">
</listing>
<li>
Initialen (vgl.
<a
href="http://www.w3schools.com/schema/schema_facets.asp">
Beispiel auf W3 Schools
</a>
)
</li>
<listing
src="regExp.xsd"
line="13-19">
</listing>
<li>
Vorwahl (vgl.
<a
href="http://goetz.buerkle.org/mat/medien/lernen/studium/2006_ss_ai2tutorium/tutorium04_folien.pdf">
Tutorium für angewandte Informatik an
der Universität Karlsruhe (von Götz
Bürkle)
</a>
</li>
<listing
src="regExp.xsd"
line="20-26">
</listing>
</ul>
</slide>
<slide>
<title>XML Schema - Attributdefinitionen</title>
<ul>
<li>
Die Definition von Attributen erfolgt mit
dem Element
<code>attribute</code>
.
</li>
<li>
Es können analog zu DTDs optionale
Attribute, zwingend anzugebende Attribute
und Attribute mit festen Werten angegeben
werden.
</li>
<li>
Darüber hinaus könne auch
Aufzählungsattribute und Mengen realisiert
werden.
</li>
<li>
Folgende Eigenschaften können für
Attributdefinitionen angegeben werden:
</li>
<ul>
<li>
<em>name</em>
: Ein Name ohne Doppelpunkt (
<code>NCName</code>
)
</li>
<li>
<em>id</em>
: kann mit einer Schema-weit eindeutigen
Zeichenkette zum Zweck der
Identifikation gekennzeichnet werden.
</li>
<li>
<em>default</em>
: Erlaubt die Angabe eines Vorgabewert.
Dieser Vorgabewert wird vom
XML-Prozessor an die verarbeitende
Applikation geliefert, wenn im
Instanzdokument kein Wert für das
Attribut angegeben ist.
</li>
<li>
<em>fixed</em>
: Erlaubt die Festlegung eines
konstanten Werts für das Attribut.
<code>fixed</code>
und
<code>default</code>
schließen sich gegenseitig aus.
</li>
<li>
<em>type</em>
: Mit
<code>type</code>
wird der Typ des Attributes (ein
<code>simpleType</code>
) bestimmt.
</li>
<li>
<em>form</em>
: Legt fest, ob der Attributname im
XML-Instanzdokument durch ein
Namensraumpräfix eingeleitet wird
(Belegung:
<code>qualified</code>
, andernfalls
<code>unqualified</code>
).
</li>
<li>
<em>ref</em>
: Verweis auf eine globale
Attributdefinition.
</li>
<li>
<em>use</em>
: Legt mit den Werten
<code>optional</code>
,
<code>required</code>
oder
<code>prohibited</code>
die Verwendung des Attributes fest.
Vorgabewert ist
<code>optional</code>
, das Attribut wird nicht zwingend im
XML-Dokument erwartet. Den Gegensatz
hierzu bildet
<code>required</code>
, wodurch das Attribut als zwingend
anzugeben definiert wird.
<code>prohibited</code>
verbietet die Nutzung des Attributes im
XML-Dokument.
</li>
</ul>
</ul>
</slide>
<slide>
<title>
XMl Schema am Beispiel - Attributdefinitionen
</title>
<listing src="attDefs.xsd"></listing>
<ul>
<li>
Für das Attribut
<code>myAtt1</code>
ist kein Typ vorgegeben. Es ist damit per
Definition vom Typ
<code>anySimpleType</code>
</li>
<li>
Dem Attribute
<code>myAtt2</code>
wird hingegen der vordefinierte Typ
<code>decimal</code>
zugewiesen.
</li>
<li>
Der Datentyp für Für
<code>myAtt3</code>
wird innerhalb der Attributdefinition selbst
definiert (
<code>simpleType</code>
). Mit einer Einschränkung werden die
zulässigen Werte limitiert. Diese dürfen
zwar vom Typ
<code>int</code>
sein, davon sind aber nur die Werte
<code>10</code>
und
<code>20</code>
für das Attribut gültig.
</li>
<li>
<code>myAtt4</code>
zeigt die Verwendung eines benannten
komplexen Typs für die Typdefinition eines
Attributs. Zunächst wird der komplexe Typ
namens
<code>myType1</code>
definiert. Er erlaubt Zeichenketten mit
einer maximalen Länge von 5 Zeichen. Dieser
Typ wird danach in der Typdefinition
</li>
<li>
In der Elementdefinition für
<code>foo</code>
wird die Verwendung der global definierten
Attribute
<code>myAtt1</code>
bis
<code>myAtt4</code>
demonstriert. Diese werden mit Hilfe des
<code>ref</code>
-Attributs referenziert.
<code>myAtt1</code>
ist als optional anzugebend deklariert,
wohingegen
<code>myAtt2</code>
zwingend anzugeben ist. Für
<code>myAtt3</code>
ist die Verwendung im Instanzdokument
verboten (
<code>prohibited</code>
).
</li>
<li>
<code>myAtt5</code>
stellt eine lokale Attributdefinition dar,
sie ist nur innerhalb der Elementdefinition
von
<code>foo</code>
gültig. Die Attributwerte müssen vom Typ
<code>date</code>
sein. Darüber hinaus erhält das Attribut
noch eine Zeichenkette zur Identifikation:
<code>id</code>
.
</li>
<li>
<code>myAtt6</code>
entspricht wiederum der Bildung eines
anonymen (inneren) Datentyps. Die lokale
Attributdefinition beschränkt Werte vom Typ
<code>float</code>
auf 5 Stellen.
</li>
<li>
In der Elementdefinition von
<code>bar</code>
wird die globale Attributdefinition für
<code>myAtt1</code>
wiederverwendet, für dieses Element ist das
Attribut zwingend anzugeben.
</li>
</ul>
</slide>
<slide>
<title>
XML Schema am Beispiel - komplettes Schema der
Projektverwaltung
</title>
<p>
Das vollständige Schema für das Beispiel
Projektverwaltung ist hier aufgeführt.
</p>
<listing src="projektverwaltung-komplett.xsd"></listing>
</slide>
<slide>
<title>
XML Schema am Beispiel - schemakonformes
Instanzdokument der Projektverwaltung
</title>
<p>
Abschließend eine gültige (sowohl valid als auch
schema valid) Dokumentinstanz der
Projektverwaltungsstruktur.
</p>
<listing src="projektverwaltung-komplett.xml"></listing>
</slide>
<slide>
<title>XML Schema - Tools</title>
<p>
Mittlerweile existieren eine Reihe von
Werkzeugen, mit deren Hilfe XML-Schemata
(grafisch) erstellt und gepflegt werden können.
Eine kleine Auswahl finden Sie hier versammelt.
</p>
<ul>
<li>
Der
<em><oXygen/></em>
XML Editor beinhaltet einen
<em>Visual Schema Editor</em>
. Erlaubt das Generieren von
Instanzdokumenten zu einem Schema.
Kostenpflichtig.
</li>
<li>
Der Schema Editor aus der
<em>XML Spy</em>
Suite von Altova unterstützt unter anderem
die grafische Erstellung von Schemata.
Generieren von Instanzdokumenten möglich.
Kostenpflichtig.
</li>
<li>
<em>Stylus Studio</em>
XML Schema Editor: Auch die Stylus Studio
Suite bringt einen grafischen Schema-Editor
mit sich. Kostenpflichtig.
</li>
<li>
Eine umfassende Übersicht über XML
Schema-Tools findet sich auf der
<a
href="http://www.w3.org/XML/Schema#Tools">
XML Schema Webseite des W3C
</a>
</li>
</ul>
</slide>
<slide>
<title>XML Schema - Übungsaufgabe</title>
<p>
Erstellen Sie ein Schema, das die folgenden
Bedingungen abbildet.
</p>
<ul>
<li>
Das Element Information Item
<code>Autor</code>
verfügt über die Kindknoten
<code>Vorname</code>
(mindestens einmaliges, aber höchstens
zweimaliges Auftreten) sowie
<code>Nachname</code>
. Beide Elemente sind Namen und verfügen
über keine interne Formatierung durch
Leerzeichen oder Zeilenumbrüche
</li>
<li>
Der Wurzelknoten
<code>Zeitschrift</code>
enthält genau ein als
<code>Verlag</code>
bezeichnetes Kindelement des Typs
<code>string</code>
.
</li>
<li>
Jeder
<code>Beitrag</code>
besitzt mindestens einen aber beliebig viele
<code>Autor</code>
en.
</li>
<li>
Jedes Element Information Item des Typs
<code>Beiträge</code>
enthält eine positive Anzahl von Element
Information Items des Namens
<code>Beitrag</code>
.
</li>
<li>
Jedes Element Information Item des Typs
<code>Beitrag</code>
enthält das Attribut
<code>Seitenanzahl</code>
(positive Ganzzahl) und
<code>Annahmedatum</code>
(Datum)
</li>
<li>
Jedes Element Information Item des Typs
<code>Zeitschrift</code>
enthält genau ein Element Information Item
des Namens
<code>Beiträge</code>
.
</li>
<li>
Zu jedem
<code>Beitrag</code>
existiert eine Menge von
<code>Schlagworten</code>
. Diese werden in einem Element Information
Item
<code>Schlagworte</code>
abgelegt. Dieses Element kann zwischen drei
und fünf Zeichenketten als Eintrag
beinhalten.
</li>
</ul>
</slide>
</part>
</part>
</presentation>
<!-- Ende Schema -->
<!-- Übungen zu XML Schema -->
<presentation id="uebungsaufgabenXMLSchema">
<title short="uebungsaufgabenXMLSchema">
Übungsaufgaben zu XML Schema.
</title>
<date>2008-11-03</date>
<toc id="resources" />
<toc id="abstract">Übungsaufgaben zu XML Schema.</toc>
<part>
<title>Übungsaufgaben zu XML Schema - Aufgabe 1</title>
<slide>
<title>Übungsaufgaben zu XML Schema - Aufgabe 1</title>
<p>
Gegeben sei nachfolgendes Schema. Geben Sie dazu
eine
<em>schema-gültige</em>
Dokumentinstanz an.
</p>
<listing src="uebung-schema-valid-instanz.xsd"></listing>
</slide>
</part>
<part>
<title>Übungsaufgaben zu XML Schema - Aufgabe 2</title>
<slide>
<title>Übungsaufgaben zu XML Schema - Aufgabe 2</title>
<p>
Erstellen Sie ein Schema, das die nachfolgend
aufgeführten Zusammenhänge abbildet. Erstellen Sie
ein Instanzdokument und validieren Sie dieses gegen
Ihr Schema.
</p>
<ul>
<li>
Das Element Information Item
<code>Autor</code>
verfügt über die Kindknoten
<code>Vorname</code>
(mindestens einmaliges, aber höchstens
zweimaliges Auftreten) sowie
<code>Nachname</code>
.
<br />
Beide Elemente stellen Namen im herkömmlichen
Sinne dar und verfügen über keine interne
Formatierung durch Leerzeichen oder
Zeilenumbrüche
</li>
<li>
Der Wurzelknoten
<code>Zeitschrift</code>
enthält genau ein als
<code>Verlag</code>
bezeichnetes Kindelement des Typs
<code>string</code>
.
</li>
<li>
Jeder
<code>Beitrag</code>
besitzt mindestens einen aber beliebig viele
<code>Autor</code>
en.
</li>
<li>
Jedes Element Information Item des Typs
<code>Beiträge</code>
enthält eine positive Anzahl von Element
Information Items des Namens
<code>Beitrag</code>
.
</li>
<li>
Jedes Element Information Item des Typs
<code>Beitrag</code>
enthält das Attribut
<code>Seitenanzahl</code>
(positive Ganzzahl) und
<code>Annahmedatum</code>
(Datum)
</li>
<li>
Jedes Element Information Item des Typs
<code>Zeitschrift</code>
enthält genau ein Element Information Item des
Namens
<code>Beiträge</code>
.
</li>
<li>
Zu jedem
<code>Beitrag</code>
existiert eine Menge von
<code>Schlagworten</code>
. Diese werden in einem Element Information Item
<code>Schlagworte</code>
abgelegt. Dieses Element kann zwischen drei und
fünf Zeichenketten als
<code>Eintrag</code>
beinhalten.
</li>
</ul>
</slide>
</part>
<part>
<title>Übungsaufgaben zu XML Schema - Aufgabe 3</title>
<slide>
<title>Übungsaufgaben zu XML Schema - Aufgabe 3</title>
<p>
Gegeben sei nachfolgendes Dokument. Entwerfen Sie
dafür ein gültiges XML-Schema.
</p>
<listing src="uebung-schemaentwurf.xml"></listing>
</slide>
</part>
</presentation>
<!-- Ende Übungen zu XML Schema -->
<presentation id="uebungenSchema">
<title short="uebungenSchema">Übungen zu XML Schema</title>
<date>2008-10-27</date>
<toc id="resources" />
<toc id="abstract">
Übungen aus der Vorlesung zu XML Schema.
</toc>
<part>
<title>Übungen aus der Vorlesung zu XML Schema.</title>
<slide>
<title>Umwandlung einer DTD in ein XML Schema</title>
<ul>
<li>
Gegeben ist folgende DTD. Erstellen Sie ein
äquivalentes Schema gemäß der
<a href="http://www.w3.org/TR/xmlschema-1/">
W3C XML Schema Recommendation
</a>
.
</li>
<listing src="dtd-fuer-schemaumwandlung.dtd"></listing>
</ul>
</slide>
</part>
</presentation>
<presentation id="SAX">
<title short="SAX">Die Simple API for XML (SAX)</title>
<date>2008-11-10</date>
<toc id="resources">
<a href="http://www.megginson.com/">
Die
<em>ursprüngliche SAX Seite</em>
von David Megginson
</a>
<br />
<a href="http://www.saxproject.org/">
Webseite des SAX Projekts
</a>
<br />
<a href="https://jaxp.dev.java.net/">
Die JAXP Projektseite
</a>
</toc>
<toc id="abstract">
Für diverse Programmiersprachen existieren mittlerweile
gängige Schnittstellen, um auf XML-Dokumente zuzugreifen und
diese weiterzuverarbeiten. Die
<em>Simple API for XML (SAX)</em>
ist eine sehr einfach (=leichtgewichtig) gehaltene API für
die
<em>ereignisbasierte</em>
Verarbeitung von XML-Dokumenten. Die Charakterisierung als
leichtgewichtiger Ansatz bezieht sich sowohl auf den
Implementierungsaufwand der API selbst, als auch ihren
Integrationsaufwand in eigene Applikationen.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract" />
</p>
</slide>
<slide>
<title>XML-APIs - baumorientiert vs. ereignisbasiert</title>
<p>
Für die Verarbeitung von XML-Dokmenten sind im
Wesentlichen zwei Ansätze verfügbar.
</p>
<ul>
<li>
<em>Baumorientierte APIs</em>
:
<br />
Baumorientierte APIs bilden das gesamte zu
verarbeitende Dokument in eine Baumstruktur ab. Eine
weiterverarbeitende Applikation kann je nach Bedarf
entlang dieser Baumstruktur navigieren. Das Document
Object Model (DOM) stellt solche eine
baumorientierte API zur Verfügung.
</li>
<li>
<em>Ereignisbasierte APIs</em>
:
<br />
Diese Art Programmierschnittstelle liest über ein
Dokument und berichtet dabei über sogenannte
berichtenswerte "Ereignisse", die während des Lesens
auftreten (zum Beispiel den Start oder das Ende
eines Elementes). Die Applikation wird über
sogenannte "Callback"-Methoden über diese Ereignisse
benachrichtigt. Es wird keine interne Baumstruktur
aufgebaut, die dem XML-Dokument entspricht.
</li>
</ul>
</slide>
<slide>
<title>Was ist ein Parser? Was sind seine Aufgaben?</title>
<p class="definition">
Ein Parser (engl. to parse „analysieren“ bzw. von
lateinisch pars „Teil“; im Deutschen gelegentlich auch
Zerteiler) ist ein Computerprogramm, das in der
Computertechnik für die Zerlegung und Umwandlung einer
beliebigen Eingabe in ein für die Weiterverarbeitung
brauchbares Format zuständig ist. Häufig werden Parser
eingesetzt, um im Anschluss an den Analysevorgang die
Semantik der Eingabe zu erschließen und daraufhin
Aktionen durchzuführen.
</p>
<p>
Quelle:
<a href="http://de.wikipedia.org/wiki/Parser">
Wikipedia
</a>
</p>
</slide>
<slide>
<title>SAX - Einführendes</title>
<ul>
<li>
Ursprünglich war SAX eine Sammlung generischer
Java-Schnittstellen für XML-Parser.
</li>
<li>
Weiterentwicklung zur eigenständigen
Verarbeitungsmöglichkeit für XML-Dokumente in
verschiedenen weiteren Programmiersprachen:
</li>
<ul>
<li>C++</li>
<li>Python</li>
<li>Perl</li>
<li>Eiffel</li>
</ul>
<li>
In der Vorlesung konzentrieren wir uns auf die
Java-Umsetzung von SAX2.
</li>
<li>
SAX2 ist eine Weiterentwicklung von SAX und
unterstützt beispielsweise Namensräume.
</li>
<li>
SAX2 ist seit JDK 1.4 Bestandteil des JDK und ist
Bestandteil der Java APIs for XML Processing (JAXP).
</li>
</ul>
</slide>
<slide>
<title>Bestandteile von SAX Implementierungen</title>
<p>
SAX-Implementierungen weisen üblicherweise drei
erkennbare Blöcke auf.
</p>
<ul>
<li>
<em>Die Schnittstellen:</em>
<br />
SAX definiert eine Sammlung abstrakter
Schnittstellen (siehe nächste Seite).
</li>
<li>
<em>Reader (Parser)</em>
<br />
Der Parser selbst (= die Implementierung zu den
Schnittstellen). Die SAX2-Schnittstellen werden
durch den jeweiligen eingesetzten Parser bedient und
die definierten (Callback)-Methoden entsprechend
eingebunden.
</li>
<li>
<em>ReaderFactory</em>
<br />
Sie dient zur Erzeugung verschiedener Ausprägungen
(z.B. validierend/nicht-validierend, Namespace
berücksichtigend, etc.) SAX-basierter Parser.
<br />
Bei einer
<em>Factory Method</em>
handelt es sich um ein sogenanntes
<em>Design Pattern</em>
(Entwurfsmuster,
<a
href="http://de.wikipedia.org/wiki/Viererbande_(Softwareentwicklung)">
Gang of Four
</a>
). Ziel: Objekte erzeugen, ohne die genaue Klasse
des zu erzeugenden Objekts anzugeben. Lösung: es
wird in einer Schnittstelle eine Methode zur
Erzeugung von Objekten definiert. In den Subklassen
kann diese Methode dann überschrieben werden, um ein
abgeleitetes Objekt zu erzeugen.
</li>
</ul>
</slide>
<slide>
<title>Die SAX2 Schnittstellen</title>
<ul>
<li>
<em>ContentHandler:</em>
<br />
Versammelt Operationen zur Reaktion auf
Dokumentereignisse (wie
<code>startDocument</code>
,
<code>startElement</code>
,
<code>processingInstruction</code>
...) Hinweis: In älterer Literatur findet sich
häufig statt des ContentHandlers eine mit
DocumentHandler benannte Schnittstelle. Dabei
handelt es sich um die Schnittstelle der
Vorgängerversion (SAX1). Sie bietet unter anderem
keine Namensraumintegration und wurde durch den
<code>ContentHandler</code>
ersetzt.
<br />
Achtung: Die Java-Standardklassenbibliothek bietet
im Paket
<code>java.net</code>
eine mit
<code>ContentHandler</code>
benannte Klasse an. Diese kann durch
Importanweisungen mit der gleichnamigen
SAX-Schnittstelle aus dem Paket
<code>org.xml.sax</code>
kollidieren!
</li>
<li>
<em>ErrorHandler:</em>
<br />
Versammelt Operationen zur Reaktion auf die drei in
der XML-Spezifikation definierten Fehlerklassen:
<ul>
<li>
<em>error</em>
(behebbarer Fehler):
<br />
Bei einem Fehler ist das Ergebnis der
aktuellen Verarbeitung undefiniert, der
Prozessor fährt jedoch mit der Verarbeitung
eines Dokumentes fort.
<br />
Beispiel: Anderer Wert als
<code>1.0</code>
oder
<code>1.1</code>
im XML-Prolog oder ein
nichtdeterministisches Inhaltsmodell (siehe
nächste Seite).
</li>
<li>
<em>fatalError</em>
:
<br />
Ein fataler Fehler führt dazu, daß der
XML-Prozessor die Verarbeitung eines
Dokumentes abbricht und einen Fehler an die
Applikation meldet.
<br />
Beispiel: Falsche Codierung eines Dokuments
(tatsächliche Codierung stimmt nicht mit im
Prolog angegebener Codierung überein),
Verletzung der Wohlgeformtheitsregeln
</li>
<li>
<em>warning</em>
:
<br />
Mit einer Warnung können Hinweise gegeben
werden. Warnungen sind als Hilfestellung
gedacht und optional. Das bedeutet,
Prozessoren
<em>können</em>
Warnungen ausgeben, müssen dies aber nicht
tun.
<br />
Beispiel: Referenzierung eines nicht
deklarierten Elements als Kindelement.
</li>
</ul>
</li>
<li>
<em>DTDHandler:</em>
<br />
Möglichkeit zur Implementierung eigener
Behandlungsroutinen für Notation-Deklarationen und
ungeparste Entitäten.
</li>
<li>
<em>EntityResolver:</em>
<br />
Möglichkeit zur Implementierung von
Auflösungsmechanismen für Entitäten gemäß ihres
System Identifiers und, falls vorhanden, des Public
Identifiers.
</li>
</ul>
</slide>
<slide>
<title>
Ausflug in den Compilerbau: deterministisches
Inhaltsmodell
</title>
<ul>
<li>
Mit
<em>Determinismus</em>
bezeichnet man in der Informatik einen Zustand, zu
dem nur definierte und reproduzierbare Folgezustände
auftreten können. Das bedeutet etwa, daß bei der
Abarbeitung eines Algorithmus nach einer bestimmten
Anweisung unter den gleichen Voraussetzungen immer
die gleiche nächste Anweisung folgt. Der nächste
Abarbeitungsschritt ist immer eindeutig festgelegt.
<br />
(Quelle:
<a
href="http://de.wikipedia.org/wiki/Determinismus_(Algorithmus)">
Wikipedia
</a>
)
</li>
<li>
Anders formuliert und in Bezug auf Grammatiken
gesetzt: Zu jedem Zustand und Eingabesymbol eines
Automaten darf höchstens ein Folgezustand
existieren.
<br />
(Quelle:
<a
href="http://books.google.de/books?id=Zo7I8kutRVIC">
Grundkurs Theoretische Informatik, von Gottfried
Vossen, Kurt-Ulrich Witt
</a>
)
</li>
<li>
Beispiel:
<code>((b, c) | (b, d))</code>
. Ein Prozessor kann, wenn er das Element
<code>b</code>
in einem Dokument liest, nicht wissen, ob als
nächstes Element
<code>c</code>
oder
<code>d</code>
erscheint. Welche der beiden Möglichkeiten trifft
zu? Der Prozessor müßte zur Beantwortung dieser
Frage im Dokument bereits
<q>vorauslesen</q>
. Eine Umformulierung der Grammatik hilft in diesen
Fällen. Wäre das Inhaltsmodell als
<code>(b, (c | d))</code>
definiert, so treten diese Probleme nicht auf, denn
der Prozessor muß nicht zwischen zwei Regeln
auswählen, er muß hier nicht
<q>vorauslesen</q>
, sowohl
<code>c</code>
als auch
<code>d</code>
würden akzeptiert.
</li>
</ul>
</slide>
<slide>
<title>Das SAX Ausführungsmodell</title>
<ul>
<li>Ereignisbasierte Ausführung von Operationen</li>
<li>
Der Parser liest das Eingabedokument und aktiviert
währenddessen verschiedene Operationen, die der
Behandlung des soeben eingelesenen Information Items
dienen.
</li>
<li>
Der Programmierer einer Applikation ruft diese
Operationen nicht explizit auf!
</li>
<li>
Die Reihenfolge der Abarbeitung wird nicht durch
einen durchgängigen Programmcode gesteuert.
Stattdessen ergibt sie sich aus der Reihenfolge der
Ereignisse, die bei der Verarbeitung des Dokumentes
aktiviert wird. Die Abarbeitung erfolgt also
dokumentgesteuert.
</li>
</ul>
</slide>
<slide>
<title>SAX - Leichtgewichtiger Ansatz</title>
<ul>
<li>
SAX-Parser wurden bewußt
<em>leichtgewichtig</em>
konzipiert.
</li>
<li>
Sie halten nur die nötigste Information im Speicher,
die für die Verarbeitung des gerade eingelesenen
Information Items nötig ist. Das bedeutet, nur die
Menge an Information, die gerade nötig ist, um die
Callback-Operation auszuführen (Übergabeparameter),
ist von Interesse.
</li>
<li>
Aufgrund dieser geringen Anforderungen ist dieses
Konzept mit nur geringen Anpassungen auf sehr viele
Programmiersprachen anwendbar.
</li>
<li>SAX eignet sich daher für</li>
<ul>
<li>
Geräte, denen nur geringer Hauptspeicher zur
Verfügung steht (z.B. Embedded Devices, tragbare
Geräte, etc.)
</li>
<li>
die Verarbeitung von sehr großen XML-Dokumenten,
die zu groß sind, um im Hauptpeicher gehalten
werden zu können. (XML-Dokumente für
3D-Grafiken, etwa tesselierte Daten, werden
bspw. sehr schnell sehr groß!)
</li>
<li>
<q>Einfache</q>
Aufgaben, bei denen es nicht nötig ist, das
gesamte Dokument mit seiner Struktur im Speicher
zu behalten.
<br />
Beispiel: Finden eines Elements, das einen
bestimmte Zeichenkette enthält. Für solche
Aufgaben ist es nicht effizient, die
Dokumentstruktur als Baum nachzubilden und dann
so lange im Baum zu navigieren, bis diese
Information gefunden ist. Eine ereignisbasierte
API erlaubt die Durchführung dieser Aufgabe
schnell (keine Nnvigation nötig) und effizient
(wenig Speicherverbrauch).
</li>
</ul>
</ul>
</slide>
<slide>
<title>Push Model</title>
<ul>
<li>
Eine SAX-Applikation wird nie selbst aktiv, steuert
nie den Kontrollfluß selbst.
</li>
<li>
Stattdessen wartet sie passiv auf ihre Aktivierung,
durch Auswerfen der jeweiligen Ereignisse.
</li>
<li>
Ein derartiges Verhalten wird auch
<em>Push Model</em>
genannt.
</li>
<li>
Am Eingabedokument sind mit SAX keine großen
Änderungen möglich, da das
<q>Blickfeld</q>
sehr eingeschränkt ist.
</li>
<li>
Möglich sind lediglich einfache Transformationen,
indem das Eingabedokument verändert wieder
ausgegeben wird.
</li>
</ul>
</slide>
<slide>
<title>SAX - Ein erstes Beispiel</title>
<listing src="SAXExample1.java" />
</slide>
<slide>
<title>SAX - erste Übung</title>
<ul>
<li>
Führen Sie einen
<a
href="http://www.barbara-zengler.de/vorlesung/SAXExample1.java">
Download des ersten SAX-Beispiels
</a>
auf Ihren Rechner durch.
</li>
<li>Öffnen Sie eine Shell (Befehlseingabefenster).</li>
<li>
Prüfen Sie die bei Ihnen installierte Java-Version
durch Absetzen des Befehls
<code>java -version</code>
. Prüfen Sie das Vorhandensein des Java Compilers (
<code>javac</code>
).
</li>
<li>
Zur Erstellung der Beispiele und Übungen in diesem
Skript wurde das
<a href="http://download.java.net/jdk6/binaries/">
Java SDK 1.6 Update 10
</a>
verwendet.
</li>
<li>
Wechseln Sie in das Verzeichnis, in das Sie das
Beispiel gespeichert haben und compilieren Sie es
mit dem Befehl
<code>javac SAXExample1.java</code>
</li>
<li>
Nun können Sie die Anwendung mit beliebigen
XML-Dokumenten ausführen.
<br />
Am Beispiel unseres ersten XML-Dokumentes ergibt
sich folgende Ausgabe:
</li>
<listing src="SAXExample1.output" />
</ul>
</slide>
<slide>
<title>SAX - erstes Beispiel - Analyse (1/2)</title>
<p>
Was ist während der Ausführung des Beispiels passiert?
<br />
Eine Analyse.
</p>
<ul>
<li>
Der SAX-Parser liest das auf der Kommandozeile
angegebene Dokument (
<code>erstes-XML-dokument.xml</code>
) ein.
</li>
<listing src="SAXExample1.bat" />
<li>
Zu Beginn des Lesevorgangs ruft er die vordefinierte
callback-Funtion
<code>startDocument</code>
auf.
<br />
Diese wurde in der Applikation (
<code>SAXExample2.java</code>
) implementiert. Sie gibt die eine Zeile mit dem
Text
<code>document started</code>
aus.
</li>
<listing
src="SAXExample1.java"
line="9-11" />
<li>
Am Ende des Lesevorgangs wird vom Parser eine
weitere vordefinierte callback-Funktion aufgerufen:
<code>endDocument</code>
. Auch diese wurde in der Applikation implementiert,
sie gibt eine Zeile mit dem Text
<code>document ended</code>
aus.
</li>
<listing
src="SAXExample1.java"
line="13-15" />
<li>
Unsere im Beispiel erstellte Klasse erweitert die in
SAX definierte Basisklasse
<code>
<a
href="http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html">
DefaultHandler
</a>
</code>
(definiert im Paket
<code>
<a
href="https://jaxp-sources.dev.java.net/nonav/docs/api/org/xml/sax/helpers/package-summary.html">
org.xml.sax.helpers
</a>
</code>
).
<br />
Hier sind auch die Signaturen der beiden verwendeten
Operationen
<code>startDocument</code>
und
<code>endDocument</code>
festgelegt (
<a
href="http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html">
In JAXP API Dokumentation nachlesen
</a>
).
<br />
Unsere Beispielklasse erbt diese beiden Methoden,
die zunächst einfach
<q>nichts tun</q>
, von dieser Klasse. In der Beispielklasse werden
die Methoden dann überschrieben und die oben
erwähnten Textausgaben produziert.
</li>
<listing
src="SAXExample1.java"
line="7" />
</ul>
</slide>
<slide>
<title>SAX - erstes Beispiel - Analyse (2/2)</title>
<ul>
<li>
Bevor das Dokument durch einen XML Reader (Parser)
gelesen werden kann, muß erst ein entsprechendes
Objekt (eine Instanz) eines Readers erzeugt werden.
Dies geschieht mit dem Aufruf
<code>XMLReaderFactory.createXMLReader()</code>
E stehen verschiedene konfigurierbare SAX-Parser
Implementierungen zur Verfügung. Unter Nutzung der
aktuellen Systemkonfiguration wird mittels
<code>createXMLReader</code>
ein neuer Parser erzeugt. Im Beispiel wird die
Vorgabekonfiguration verwendet.
</li>
<listing
src="SAXExample1.java"
line="18" />
<li>
Danach müssen die EventHandler registriert werden,
mit deren Hilfe der Parser uns Informationen über
das gelesene Dokument mitteilt.
<br />
Dies geschieht mit Hilfe der Methoden
<code>setContentHandler</code>
und
<code>setErrorHandler</code>
der XMLReader Schnittstelle. Werden diese Handler
nicht gesetzt, so werden sämtliche Ereignisse, die
der Parser meldet, schlichtweg von der Anwendung
ignoriert. Es passiert
<q>nichts</q>
.
<br />
Hat man diese Schritte durchgeführt, dann kann die
(passive) SAX API durch den Parser aufgerufen
werden.
</li>
<listing
src="SAXExample1.java"
line="19-21" />
<li>
Im obigen Codeauszug wird ein Objekt der Klasse
SAXExample2 erzeugt, mit dem die Ereignisse des
SAX-Parsers empfangen werden können. Es werden
EreignisHandler für den Inhalt des Dokuments (
<em>Content Handler</em>
) und für Fehler (
<em>Error Handler</em>
) registriert.
</li>
<li>
Die Methode
<code>parse</code>
des
<code>XMLReader</code>
-Objekts führt auf dem über Kommandozeilenparameter
(
<code>args[0]</code>
) übergebenen Dokument den Lesevorgang durch.
<br />
<em>Beachten Sie</em>
: Die Datei muss über ein Objekt der Klasse
<code>InputSource</code>
gekapselt werden, damit sie eingelesen werden kann.
</li>
<listing
src="SAXExample1.java"
line="23-24" />
</ul>
</slide>
<slide>
<title>SAX - Erweiterung des ersten Beispiels</title>
<ul>
<li>
Das erste Beispiel soll so erweitert werden, daß der
Parser auch Start und Ende der Elemente eines
Dokuments ausgeben soll.
</li>
<li>
Dazu werden die beiden Callback-Methoden
<code>startElement</code>
und
<code>endElement</code>
in der Applikation implementiert.
</li>
<listing
src="SAXExample2.java"
line="18-24" />
<li>
Die Signatur der Methode
<code>startElement</code>
erfordert das Einbinden der Schnittstelle
<code>Attributes</code>
aus dem Paket
<code>org.xml.sax</code>
.
</li>
<listing
src="SAXExample2.java"
line="4" />
<li>
Der komplette Code des erweiterten Beispiels sieht
demnach nun folgendermaßen aus.
</li>
<listing src="SAXExample2.java" />
</ul>
</slide>
<slide>
<title>Die SAX2-Schnittstellen</title>
<p>
Die grundlegende Schnittstelle der SAX2-API wird mit
ContentHandler bezeichnet, sie versammelt Operationen
zur Abbildung des logischen Inhaltes eines
XML-Dokumentes. Die in unseren Beispielen verwendete
Basisklasse
<code>DefaultHandler</code>
implementiert u.a. diese Schnittstelle und stellt sie so
der Beispielapplikation zur Verfügung.
<br />
Die Übersicht in untenstehender Tabelle stellt die
wichtigsten Operationen der Schnittstelle mit ihrer
Signatur und Funktionalität zusammen.
</p>
<table border="1">
<thead>
<tr>
<th>Operation</th>
<th>Funktionalität</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#startDocument()">
startDocument()
</a>
</code>
</td>
<td>
Aufruf zu Beginn eines Dokuments. Naturgemäß
wird diese Methode nur einmal ausgeführt.
</td>
</tr>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#endDocument()">
endDocument()
</a>
</code>
</td>
<td>
Aufruf am Ende des Einlesevorgangs eines
Dokuments. Auch diese Methode wird vom SAX
Parser nur einmal aufgerufen.
</td>
</tr>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#startElement(java.lang.String,%20java.lang.String,%20java.lang.String,%20org.xml.sax.Attributes)">
startElement(String namespaceURI,
String localName, String qName,
Attributes atts)
</a>
</code>
</td>
<td>
Die Operation wird am Anfang (öffnender Tag)
eines jeden Elements in einem XML-Dokument
aufgerufen (auch bei leeren Elementen!). Sie
gibt unter den Namen des Elementes als Namen
ohne Namensraumpräfix (
<code>localName</code>
) sowie auch den qualifizierten Namen des
Elements (
<code>qName</code>
) zurück.
<br />
Anmerkung: Namensrauminformationen werden
nur erzeugt, wenn der Parser entsprechend
konfiguriert wurde.
<note>
Das bedeutet z.B., der qualifizierte
Name wird nur dann zurückgegeben, wenn
der Parser konfiguriert wurde,
Namensraum-Präfixe zu verwenden.
</note>
<br />
Objekte des Type Attributes enthalten die
Attribute eines Elements in der Reihenfolge
ihrer Definition.
<br />
Zu jedem Attribut sind neben dem lokalen und
dem qualifizierten Namen die Namensraum URI
sowie Typ und Attributwert gemäß XML v1.0
abrufbar.
</td>
</tr>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#endElement(java.lang.String,%20java.lang.String,%20java.lang.String)">
endElement(String namespaceURI,
String localName, String qName)
</a>
</code>
</td>
<td>
Die Operation wird aufgerufen, wenn das Ende
eines jeden Elements in einem XML-Dokument
erreicht ist (auch bei leeren Elementen!)
<br />
Die Übergabeparameter entsprechen denen des
zugehörigen startElement-Aufrufs.
</td>
</tr>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#processingInstruction(java.lang.String,%20java.lang.String)">
processingInstruction(String target,
String data)
</a>
</code>
</td>
<td>
Liefert die deklarierten
Verarbeitungsanweisungen. Diese können vor
und nach Eintritt des
<code>startDocument</code>
-Ereignisses auftreten. Der XML-Prolog wird
hierbei nicht als Processing Instruction
behandelt, entsprechend wird daher auch kein
Ereignis dieses Typs ausgelöst.
</td>
</tr>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#startPrefixMapping(java.lang.String,%20java.lang.String)">
startPrefixMapping(String prefix,
String uri)
</a>
</code>
</td>
<td>
Signalisiert den Beginn des
Gültigkeitsbereits des Namensraumkürzels
<code>prefix</code>
.
<code>uri</code>
enthält die vollständige URI des gebundenen
Namensraums. Ist
<code>prefix</code>
leer, so handelt es sich um die Redefinition
des Vorgabenamensraums. Das Ereignis wird
vor dem ersten Element des Namensraums (d.h.
dem Element, das die Präfixbindung enthält
oder den Vorgabenamensraum überschreibt)
ausgelöst.
</td>
</tr>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#endPrefixMapping(java.lang.String)">
endPrefixMapping(String prefix)
</a>
</code>
</td>
<td>
Signalisiert das Ende des
Gültigkeitsbereichs des Namensraumkürzels
<code>prefix</code>
. Ist der Übergabeparameter leer, so bezieht
sich das Ereignis auf den Vorgabenamensraum.
Das Ereignis tritt nach dem
<code>endElement</code>
-Ereignis des letzten Elements im Namensraum
ein.
</td>
</tr>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)">
characters(char[] ch, int start, int
length)
</a>
</code>
</td>
<td>
Aufruf bei der Verarbeitung von
Zeichenkettendaten innerhalb eines Elements.
<code>ch</code>
enthält ab der Position
<code>start</code>
Zeichenketten-artige Daten der Länge
<code>length</code>
.
<br />
Hinweis: Manche Parser melden Leerzeichen
innerhalb von Elementen mit Hilfe der
Operation
<code>ignorableWhitespace</code>
. Validierenden Parsern ist dies sogar
vorgeschrieben.
</td>
</tr>
<tr>
<td>
<code>
<a
href="http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#ignorableWhitespace(char[],%20int,%20int)">
ignorableWhitespace(char[] ch, int
start, int length)
</a>
</code>
</td>
<td>
Diese Operation wird aufgerufen, wenn der
Parser ignorierbare Leerzeichen im Inhalt
von Elementen liest.
<br />
Validierende Parser müssen hierbei diese
Operation verwenden, nicht validierende
Parser können sie verwenden.
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>Beispiel 3 - Eine kleine Dokumentstatistik</title>
<ul>
<li>
Erweitern wir unser Beispiel durch ein paar der
vorgestellten Operationen, um eine kleine
Dokumentstatistik zu erzeugen.
</li>
<li>
Zunächst werden in der Klasse
<code>SAXExample3</code>
einige Variablen deklariert und mit
<code>0</code>
vorinitialisiert.
</li>
<listing
src="SAXExample3.java"
line="8-15" />
<li>
In den jeweiligen Operationen (die den Eintritt
eines Ereignisses widerspiegeln) werden dann die
Werte dieser Variablen entsprechend inkrementiert.
Beispiel:
<code>startElement++;</code>
in
<code>startElement()</code>
.
</li>
<listing
src="SAXExample3.java"
line="39-42" />
<li>
Nach Abschluß des vollständigen Lesevorganges, d.h.
Eintritt des Ereignisses
<code>endDocument</code>
, werden die aufsummierten Zahlen durch die Methode
<code>printStatistics</code>
auf der Standardausgabe dargestellt.
</li>
<listing
src="SAXExample3.java"
line="34-37" />
</ul>
</slide>
<slide>
<title>Beispiel 3 - Analyse</title>
<ul>
<li>
Ein Aufruf des kompilierten Programms auf das erste
XML-Dokument...
</li>
<listing src="SAXExample3.bat" />
<listing src="erstes-XML-dokument.xml" />
<li>ergibt folgendes Ergebnis:</li>
<listing src="SAXExample3.output" />
<li>
Erwähnenswert ist die Ausgabe für
<code>character events</code>
.
<br />
Warum ist das so?
</li>
<li>
Ändert man das Eingabedokument testweise
folgendermaßen ab:
</li>
<listing src="erstes-xml-dokument-modified.xml" />
<li>
So ergibt sich für die Aufrufe der Methode
<code>characters</code>
die Anzahl
<code>7</code>
. Der Parser meldet alle Zeilenumbrüche in
Elementinhalt als Ereignis.
</li>
<listing src="SAXExample3-modified.output" />
</ul>
</slide>
<slide>
<title>Beispiel 3 - komplettes Listing</title>
<ul>
<li>
Im folgenden ist das gesamte Listing des Beispiels 3
aufgeführt.
</li>
<listing src="SAXExample3.java" />
</ul>
</slide>
<slide>
<title>
Beispiel 4 - Häufigkeitsermittlung einzelner
Elementnamen
</title>
<ul>
<li>
In diesem Codebeispiel wird zusätzlich das Paket
<code>java.util.HashMap</code>
eingebunden.
</li>
<listing
src="SAXExample4.java"
line="7" />
<li>
Zur Ermittlung der Anzahl der Elemente wird mit
Hilfe der Java-Collection-API-Klasse
<code>HashMap</code>
eine Liste mit Tupeln aus Elementnamen und
Auftretensanzahlen verwaltet. Eintragungen und
Aktualisierungen dieser Liste erfolgen bei jedem
<code>startElement</code>
-Ereignis.
</li>
<listing
src="SAXExample4.java"
line="14-22" />
<li>
Die Ausgabe der
<code>HashMap</code>
erfolgt in der Operation
<code>endDocument()</code>
.
</li>
<listing
src="SAXExample4.java"
line="24-26" />
<li>
Ein Aufruf des Programms auf unser erstes XML
Dokument ergibt folgendes Ergebnis:
</li>
<listing src="SAXExample4.output" />
</ul>
</slide>
<slide>
<title>Beispiel 4 - komplettes Listing</title>
<ul>
<li>
Im folgenden ist das gesamte Listing des Beispiels 4
aufgeführt.
</li>
<listing src="SAXExample4.java" />
</ul>
</slide>
<slide>
<title>
SAX - Probleme des Xerces-Parsers mit der Byte Order
Mark (1/3)
</title>
<ul>
<li>Angewendet auf das untenstehendes Dokument...</li>
<listing src="namespace15.xml" />
<li>
... stürzt das Programm ab! Wir erhalten folgende
Fehlermeldung:
</li>
<listing src="SAXExample4-ns.output" />
<li>
Die Fehlermeldung
<code>Content is not allowed in prolog.</code>
deutet auf ein Problem bei der Verarbeitung des
XML-Prologes hin.
</li>
</ul>
</slide>
<slide>
<title>
SAX - Probleme des Xerces-Parsers mit der Byte Order
Mark (2/3)
</title>
<ul>
<li>
Lädt man die betreffende Datei in einen XML-Editor,
so sieht sie völlig normal aus.
</li>
<li>
Bedient man sich jedoch eines Kommandozeilenviewers,
wie beispielsweise des auf UNIX-Systemen vorhandenen
Pagers
<code>less</code>
, so erkennt man, daß vor dem Prolog noch Zeichen
stehen.
</li>
<img
style="margin : 4% ; width : 90% ; "
src="xerces-exception.jpg" />
</ul>
</slide>
<slide>
<title>Die Unicode Byte Order Mark</title>
<ul>
<li>
Es handelt sich hierbei um die sogenannte
<code>Byte Order Mark</code>
. Dies sind Zeichen, die in Unicode-codierten
Dateien an den Anfang der Datei gestellt werden
können. Die Byte Order Mark gibt an, welche
Codierung bei der Datei vorliegt (z.B. UTF-16) und
in welcher Byte-Reihenfolge (Little-Endian,
Big-Endian) die Datei gespeichert ist.
</li>
<li>
Der
<a
href="http://www.unicode.org/versions/Unicode5.0.0/ch16.pdf#G25817">
Unicode Standard, Kapitel 16
</a>
listet in Tabelle 16-4 folgende Byte Order
Mark-Werte für die verschiedenen Codierungen auf:
</li>
<table border="1">
<thead>
<tr>
<th>Codierungsschema</th>
<th>Signatur</th>
</tr>
</thead>
<tbody>
<tr>
<td>UTF-8</td>
<td>EF BB BF</td>
</tr>
<tr>
<td>UTF-16 Big-endian</td>
<td>FE FF</td>
</tr>
<tr>
<td>UTF-16 Little-endian</td>
<td>FF FE</td>
</tr>
<tr>
<td>UTF-32 Big-endian</td>
<td>00 00 FE FF</td>
</tr>
<tr>
<td>UTF-32 Little-endian</td>
<td>FF FE 00 00</td>
</tr>
</tbody>
</table>
</ul>
</slide>
<slide>
<title>
SAX - Probleme des Xerces-Parsers mit der Byte Order
Mark (3/3) - Lösung
</title>
<ul>
<li>
Abhilfe schafft das Entfernen der Byte Order Mark
aus der betreffenden Datei. Dies können Sie mit
Hilfe eines Unicode Editors, z.B.
<a href="http://www.unipad.org/main/">SC Unipad</a>
, bewerkstelligen.
</li>
<li>
Ist die Byte Order Mark aus der Datei entfernt, so
verschwindet die Fehlermeldung des Parsers, das
Dokument ...
</li>
<listing src="namespace15-noBOM.xml" />
<li>
...kann verarbeitet werden und liefert folgende
Ausgabe:
</li>
<listing src="SAXExample4-ns-korrekt.output" />
<li>
Offensichtlich ignoriert der verwendete SAX-Parser
in der Standardkonfiguration die deklarierten
Namensräume.
</li>
</ul>
</slide>
<slide>
<title>Namensraum-konformer SAX-Parser</title>
<ul>
<li>
Zunächst müssen wir feststellen, ob der verwendete
Parser in der Lage ist, Namensraumpräfixe zu
erkennen und Namensräume als URIs zurückzugeben.
</li>
<li>
Hierfür ist es nötig, den Parser nach seiner
derzeitigen Unterstützung der beiden
<em>Features</em>
<code>namespaces</code>
und
<code>namespace-prefixes</code>
abzufragen.
</li>
<listing
src="IsParserNSAware.java"
line="17-41" />
<li>Die Abfrage kann folgendes Ergebnis bringen:</li>
<listing src="IsParserNSAware.output" />
<li>
In diesem Fall kann versucht werden, den Wert mit
Hilfe der Methode
<code>setFeature</code>
auf
<code>true</code>
zu setzen und somit die Unterstützung für
Namensraum-Präfixe zu erhalten.
</li>
<listing
src="setParserNSAware.java"
line="30-47" />
<li>Die Ausgabe des Programms:</li>
<listing src="setParserNSAware.output" />
</ul>
</slide>
<slide>
<title>
Beispiel 5 - Elemente zählen mit Namensraumunterstützung
</title>
<ul>
<li>
Im nachfolgenden Beispiel soll der Code zum Zählen
der Elemente so modifiziert werden, daß die Elemente
korrekt gezählt werden.
</li>
<li>
Zunächst wird der Parser so konfiguriert, daß er
Namensräume unterstützt.
</li>
<li>
Darüber hinaus wird die Routine zur Zählung der
Elementauftritte entsprechend angepaßt.
</li>
<listing
src="SAXExample5.java"
line="14-25" />
<li>
Angewendet auf das
<a href="namespace15-noBOM.xml">
Beispiel-Dokument
</a>
liefert es nun das erwartete korrekte Ergebnis:
</li>
<listing src="SAXExample5.output" />
<li>
Konsequenterweise wird dem Wurzelelement
<code>document</code>
, für das kein Namensraum definiert ist (es befindet
sich daher spezifikationsgemäß im NULL-Namensraum),
die leere Namensraum-URI vorangestellt.
</li>
<li>
Hinweis: Bei der Ausgabenotation handelt es sich um
keine syntaktisch korrekte Elementdeklaration, sie
dient lediglich der Veranschaulichung!
</li>
</ul>
</slide>
<slide>
<title>SAX Features</title>
<ul>
<li>
Neben der eben verwendeten Eigenschaften
<code>namespaces</code>
und
<code>namespace-prefixes</code>
definiert die SAX2-Schnittstelle noch weitere
Features.
<br />
Untenstehende Tabelle gibt eine Übersicht.
</li>
<table border="1">
<thead>
<tr>
<th>Feature-URI</th>
<th>Funktionalität</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>external-general-entities</code>
</td>
<td>
Zeigt an/Steuert, ob der Parser externe
Textentitäten verarbeitet. Bei
validierenden Parsern ist diese
Eigenschaft immer
<code>true</code>
.
</td>
</tr>
<tr>
<td>
<code>external-parameter-entities</code>
</td>
<td>
Zeigt an/Steuert, ob der Parser externe
Parameterentitäten verarbeitet. Bei
validierenden Parsern ist diese
Eigenschaft immer
<code>true</code>
.
</td>
</tr>
<tr>
<td>
<code>is-standalone</code>
</td>
<td>
Diese Eigenschaft kann nur abgefragt
werden, während der Parser gerade ein
Dokument einliest (nachdem die Methode
<code>startDocument()</code>
abgearbeitet wurde). Der Wert der
Eigneschaft ist
<code>true</code>
, wenn im Prolog des Dokumentes
<code>standalone="yes"</code>
spezifiziert wurde, andernfalls
<code>false</code>
.
</td>
</tr>
<tr>
<td>
<code>
lexical-handler/parameter-entities
</code>
</td>
<td>
<code>true</code>
zeigt an, daß der LexicalHandler (eine
optionale Erweiterung von SAX, die etwa
Informationen über die Grenzen von
lexikalischen Bereichen, wie z.B.
Kommentarbereichen liefert) den Start
und das Ende von Parameterentitäten
anzeigt.
</td>
</tr>
<tr>
<td>
<code>namespaces</code>
</td>
<td>
<code>true</code>
zeigt an, daß Namensraum-URIs und lokale
Namen für Elemente und Attribute
abfragbar sind.
</td>
</tr>
<tr>
<td>
<code>namespace-prefixes</code>
</td>
<td>
<code>true</code>
zeigt an, daß qualifizierte Namen und
Namensraumattribute abfragbar sind.
</td>
</tr>
<tr>
<td>
<code>resolve-dtd-uris</code>
</td>
<td>
<code>true</code>
zeigt an, daß System-IDs in
Deklarationen als absolute URIs (im
Gegensatz zu relativen URIs)
zurückgeliefert werden.
<code>false</code>
bedeutet, daß die URIs als relative URIs
zurückgegeben werden. Zugriff auf die
Basis-URI ist dann über
<code>Locator.getSystemId()</code>
möglich.
</td>
</tr>
<tr>
<td>
<code>string-interning</code>
</td>
<td>
<code>true</code>
bedeutet, daß alle XML-Namen (für
Elemente, Attribute, Präfixe, Entities,
Notations) mit Hilfe von
<code>java.lang.String.intern</code>
als kanonische Repräsentation vorliegen
und damit eindeutig sind. Vorteil:
Schnelles Testen auf Gleichheit mit
Stringkonstanten (schneller als ein
Aufruf von
<code>String.equals()</code>
).
</td>
</tr>
<tr>
<td>
<code>
unicode-normalization-checking
</code>
</td>
<td>
Steuert, ob der Parser Fehler meldet,
die bei der Unicode Normalisierung
entstehen (siehe
<a
href="http://www.w3.org/TR/xml11/#sec-normalization-checking">
XML 1.1 Spezifikation, Abschnitt
2.13
</a>
).
<br />
Derartige Fehler stellen keine
schwerwiegenden Fehler bei der
Verarbeitung dar. Ein Dokument bleibt
wohlgeformt, auch wenn die betreffenden
Konstrukte nicht vollständig
normalisiert wurden.
</td>
</tr>
<tr>
<td>
<code>use-attributes2</code>
</td>
<td>
<code>true</code>
zeigt an, ob die Attributobjekte, die
dieser Parser in der Operation
<code>startElement()</code>
übergibt, der Schnittstellen
<code>org.xml.sax.ext.Attributes2</code>
entsprechen. Diese Schnittstelle erlaubt
weitergehende Information, wie etwa, ob
der Attributwert im Dokument angegeben
wurde oder ob der Defaultwert, der in
der DTD spezifiziert war, angenommen
wurde.
</td>
</tr>
<tr>
<td>
<code>use-locator2</code>
</td>
<td>
<code>true</code>
bedeutet, daß die
<code>Locator</code>
objekte, die der Parser in der Methode
<code>setDocumentLocator()</code>
übergibt, die Schnittstelle
<code>org.xml.sax.ext.Locator2</code>
unterstützt. Diese Schnittstelle
unterstützt weitergehende Information
über das Dokument, wie etwa die
Zeichenkodierung sowie die verwendete
XML-Version.
</td>
</tr>
<tr>
<td>
<code>use-entity-resolver2</code>
</td>
<td>
<code>true</code>
zeigt an, wenn der Entity Resolver die
Schnittstelle
<code>
org.xml.sax.ext.EntityResolver2
</code>
unterstützt. In diesem Fall werden die
dort definierten (neuen) Methoden
verwendet.
</td>
</tr>
<tr>
<td>
<code>validation</code>
</td>
<td>
Steuert, ob ein validierender Parser
verwendet wird, der alle
Validierungsfehler meldet. Wenn ja (
<code>true</code>
), werden alle externen Entitäten
gelesen.
</td>
</tr>
<tr>
<td>
<code>xmlns-uris</code>
</td>
<td>
Steuert, ob der Parser Attribute mit
Namensraumdeklarationen so behandelt,
daß sie sich im Namensraum
<code>
http://www.w3.org/2000/xmlns/
</code>
befinden. Ursprünglich befinden sich
diese Attribute explizit in keinem
Namensraum (siehe
<a
href="http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-using">
Namespaces in XML
</a>
). Eine spätere Ausgabe der
Spezifikation (siehe
<a
href="http://www.w3.org/TR/2006/REC-xml-names-20060816/#ns-decl">
Namespaces in XML 1.0 (Second
Edition)
</a>
oder
<a
href="http://www.w3.org/TR/2006/REC-xml-names11-20060816/#ns-decl">
Namespaces in XML 1.1 (Second
Edition)
</a>
definiert für diese Attribute jedoch den
oben angegebenen Namensraum.
</td>
</tr>
<tr>
<td>
<code>xml-1.1</code>
</td>
<td>
Wenn der Parser sowohl XML 1.0 als auch
XML 1.1 unterstützt, so besitzt diese
Eigenschaft den Wert
<code>true</code>
.
</td>
</tr>
</tbody>
</table>
</ul>
</slide>
<slide>
<title>Fehlerbehandlung</title>
<ul>
<li>
Während der Arbeit mit der SAX-Schnittstelle können
innerhalb zweier getrennter Operationsphasen
Fehlersituationen auftreten.
</li>
<ul>
<li>
während der Konstruktionsphase des SAX-basierten
Parsers, d.h. vor Aufruf der Methode
<code>parse</code>
</li>
<li>
während des eigentlichen Parsingvorganges beim
Einlesen des Dokuments
</li>
</ul>
<li>
Die Schnittstelle bietet die drei von
<code>SAXException</code>
abgeleiteten Ausnahmeereignisklassen an
</li>
<ul>
<li>
<a
href="http://www.saxproject.org/apidoc/org/xml/sax/SAXNotRecognizedException.html">
SAXNotRecognizedException
</a>
</li>
<li>
<a
href="http://www.saxproject.org/apidoc/org/xml/sax/SAXNotSupportedException.html">
SAXNotSupportedException
</a>
</li>
<li>
<a
href="http://www.saxproject.org/apidoc/org/xml/sax/SAXParseException.html">
SAXParseException
</a>
</li>
</ul>
</ul>
</slide>
<slide>
<title>Fehlerbehandlung - SAXNotRecognizedException</title>
<ul>
<li>
Fehler während der Parserkonstruktions- und
Initialisierungsperiode rühren, abgesehen von
externen Effekten, zumeist vom Versuch her, einen
Parser in unzulässiger Weise zu parametrisieren.
</li>
<li>So führt etwa der Aufruf von folgendem Code..</li>
<listing src="SAXExample6.java" />
<li>... zu folgender Fehlermeldung:</li>
<listing src="SAXExample6.output" />
</ul>
</slide>
<slide>
<title>Fehlerbehandlung - SAXParseException</title>
<ul>
<li>
Tritt während des Parsingvorganges ein Verstoß
hinsichtlich der well-formedness Regeln auf, so wird
ein
<code>SAXParseException</code>
-Ausnahmeereignis erzeugt. Es stellt Methoden zur
näheren Lokalisierung der Fehlerstelle im
Eingabedokument zur Verfügung.
</li>
<li>
Im folgenden Beispiel wird dies umgesetzt: Mittels
der Methoden
<code>getColumnNumber</code>
und
<code>getLineNumber</code>
lassen sich Spalten- und Zeilennummer des Fehlers
ermitteln.
<code>getSystemId</code>
und
<code>getPublicId</code>
können zur Ausgabe des System-Identifiers, der bei
lokaler Referenzierung identisch zum Dateisystempfad
ist, bzw. zur Ausgabe des Public-Identifiers --
falls gesetzt -- herangezogen werden.
</li>
<listing src="SAXExample7.java" />
<li>Angewendet auf folgendes XML-Dokument...</li>
<listing src="NotWellFormed-noBOM.xml" />
<li>... ergibt sich folgende Ausgabe:</li>
<listing src="SAXExample7.output" />
</ul>
</slide>
<slide>
<title>Fehlerbehandlung - SAXNotSupportedException</title>
<ul>
<li>
Das Auftreten einer
<code>SAXNotSupportedException</code>
wird durch den Versuch ausgelöst, eine zulässige und
erkannte Parameterisierung des SAX-Parsers
vorzunehmen, die durch diesen nicht unterstützt
wird.
</li>
<li>
Diese Fehlersituation läßt sich daher an keinem
statischen Beispiel zeigen, sondern hängt von der
konkreten Parser-Implementierung ab.
</li>
</ul>
</slide>
<slide>
<title>Abschließendes Beispiel</title>
<ul>
<li>
Das folgende Abschlußbeispiel zeigt eine
vollständige Implementierung der verschiedenen
SAX-Ereignisse der
<code>ContentHandler</code>
-Schnittstelle.
</li>
<listing src="SAXExample8.java" />
<li>Angewendet auf folgendes Eingabedokument...</li>
<listing src="SAXExample8-input.xml" />
<li>... ergibt sich folgende Ausgabe:</li>
<listing arc="SAXExample8.output" />
<li>
Die Ausführung liefert eine textuelle Ausgabe, deren
Ereignisreihenfolge der der folgenden Abbildung
entspricht
</li>
<img src="saxEvents.gif" />
</ul>
</slide>
<slide>
<title>Einfache Transformationen</title>
<ul>
<li>
Bedingt durch die sequentielle Aktivierung der
verschiedenen Ereignisbehandlungsroutinen lassen
sich mit SAX sehr komfortabel einfache
Dokumenttransformationen, wie z.B. die Umbenennung
von Elementen, realisieren.
</li>
<li>
Der Code aus untenstehendem Beispiel zeigt die
Umbenennung eines Elements von
<code>foo</code>
nach
<code>bar</code>
. Alle anderen Elemente, Attribute und
Zeichenketten-artigen Elementinhalte werden
unverändert kopiert.
<br />
Hinweis: Das Beispiel berücksichtigt dabei jedoch
weder Namensräume noch Processing Instructions.
</li>
<li>
Zur Realisierung komplexer Transformationen,
insbesondere solcher, die die Zwischenspeicherung
von Dokumentinformationen erfordern sind jedoch
Ansätze mit expliziter Abbildung in
Hauptspeicherstrukturen wie DOM oder XSLT besser
geeignet.
</li>
<listing src="SAXExample9.java" />
<li>Angewendet auf folgendes Eingabedokument...</li>
<listing src="SAXExample9-input.xml" />
<li>...ergibt sich folgende Ausgabe:</li>
<listing src="SAXExample9.output" />
</ul>
</slide>
<slide>
<title>Einbindung von SAX in Applikationsprogramme</title>
<ul>
<li>
Untenstehendes Beispiel zeigt die Einbindung eines
SAX-Parsers in ein Applikationsprogramm. Die
Anwendung überführt beliebige XML-Eingabedokumente
in eine Java-SWING-konforme Baumdarstellung.
</li>
<listing src="TreeViewer.java" />
<li>
Der Code zeigt die sukzessive Konstruktion der
Baumansicht entlang der beim Lesevorgang
eintretenden SAX-Ereignisse.
</li>
<li>
Hervorzuheben ist hierbei die Erzeugung je eines
Baumknotens innerhalb der
Ereignisbehandlungsroutinen
<code>startElement</code>
,
<code>processingInstruction</code>
und
<code>characters</code>
. All diese Methoden fügen einen neuen Kindknoten
zum aktuell bearbeiteten Baumknoten zu. Zusätzlich
wird innerhalb der Behandlung des
<code>startElement</code>
-Ereignisses der neu erzeugte Kindknoten für die
weitere Verarbeitung als Aktueller definiert und
damit eine zusätzliche Baumstufe eröffnet.
</li>
<li>
Das rekursive Aufsteigen im Baum findet beim
Verlassen eines Elements (Ereignis:
<code>endElement</code>
) statt.
</li>
<li>
Untenstehende Abbildung zeigt die durch Verarbeitung
des Dokuments
<a href="namespace15-noBOM.xml">
namespace15-noBOM.xml
</a>
erzeugte Bildschirmansicht. Die vermeintlich
„leeren“ CHARACTER-Elemente entstehen durch die
nichtdruckbaren Zeichen wie Zeilenumbrüche und
Wagenrückläufe.
</li>
<img src="TreeViewer.gif" />
</ul>
</slide>
<slide>
<title>Abschlußbemerkungen und Einsatzempfehlungen</title>
<ul>
<li>
SAX offenbart sich als leicht einzusetzende und
trotzdem für geeignete Anwendungsfälle sehr mächtige
Schnittstelle. Insbesondere ist der serielle
Verarbeitungsansatz, der nur geringe
Hauptspeicheranforderungen stellt, sehr gut für
große XML-Dokumente geeignet. Gleichzeitig skalieren
SAX-basierte Anwendungen vergleichsweise gut, da das
Eingabedokument nur einmal durchlaufen wird.
</li>
<li>
Als gravierende Nachteile offenbaren sich jedoch die
fehlenden Navigationsmöglichkeiten, die der
Applikation die Reihenfolge der Elemente im Dokument
als Verarbeitungsreihenfolge aufzwingen.
Festzuhalten bleibt, daß es sich bei SAX lediglich
um eine Schnittstelle handelt, auf der Parser
realisiert werden können. SAX selbst ist jedoch kein
solcher.
</li>
</ul>
</slide>
</presentation>
<!-- Übungen zu SAX -->
<presentation id="uebungsaufgabenSAX">
<title short="uebungsaufgabenSAX">
Übungsaufgaben zum Thema SAX.
</title>
<date>2008-11-10</date>
<toc id="resources" />
<toc id="abstract">Übungsaufgaben zum Thema SAX.</toc>
<part>
<title>Übungsaufgaben zu SAX</title>
<slide>
<title>Übersicht Übungsaufgaben SAX</title>
<p>
In den folgenden Übungsaufgaben werden Sie Schritt
für Schritt eine umfangreichere Programmieraufgabe
lösen.
<br />
Im Laufe der nächsten Wochen werden weitere
Teilaufgaben hinzukommen.
</p>
</slide>
<slide>
<title>Übungsaufgaben zu SAX - Teilaufgabe 1</title>
<ul>
<li>
Melden Sie sich beim
<a
href="http://pages.ebay.de/entwickler/api.html">
eBay-Entwicklerprogramm
</a>
an.
<br />
</li>
<li>
Arbeiten Sie sich dort zunächst durch den
<em>Quick Start</em>
.
<br />
</li>
<li>
Verschaffen Sie sich eine Übersicht über die
<a
href="http://developer.ebay.com/DevZone/shopping/docs/Concepts/ShoppingAPIGuide.html">
eBay Shopping API
</a>
.
</li>
<li>
Lernen Sie, wie Sie einen
<a
href="http://developer.ebay.com/DevZone/Shopping/docs/Concepts/ShoppingAPI_FormatOverview.html">
Aufruf an die eBay Shopping API absetzen
können
</a>
.
<br />
Hinweis: Die URL, an die Sie Ihre Anfrage
schicken müssen, lautet
<code>http://open.api.ebay.com/shopping?</code>
.
</li>
</ul>
</slide>
<slide>
<title>Übungsaufgaben zu SAX - Teilaufgabe 2</title>
<p>
Formulieren Sie eine Anfragedatei im XML-Format, um
die eBay Shopping API anzufragen. Ihre Anfrage
sollte folgenden Kriterien genügen:
</p>
<ul>
<li>
Verwendung der Methode
<code>FindItems</code>
. Es sollen maximal 50 Suchergebnisse
zurückgeliefert werden.
</li>
<li>
Angabe der Zeichenkette
<q>
eBay Anfrage Praktikum XML, Name: X. XXXXX
</q>
als Parameter
<code>MessageID</code>
.
<br />
Bitte ersetzen Sie X. XXXXX durch Ihre(n) Namen.
</li>
<li>
Doppelte Suchergebnisse sollen nicht angezeigt
werden.
</li>
<li>
Die Suchergebnisse sollen nach der Endzeit der
Auktion sortiert werden. Bald endende Angebote
sollen zuerst angezeigt werden.
</li>
<li>
Schränken Sie die Suche bei sehr vielen
Suchergebnissen durch Angabe Ihrer Postleitzahl
ein.
</li>
</ul>
<p>
Testen Sie die von Ihnen erstellte XML-Datei mit
Hilfe des
<a
href="https://developer.ebay.com/DevZone/build-test/test-tool/Default.aspx">
eBay API Test Tools
</a>
</p>
</slide>
<slide>
<title>Übungsaufgaben zu SAX - Teilaufgabe 3</title>
<p>
Schreiben Sie ein Java-Programm, das die eBay
Shopping API mittels einer XML-Anfrage über das
Protokoll HTTP mit der Methode
<code>POST</code>
abfragt und die Rückantwort von eBay im XML-Format
erwartet. Ihr Programm soll diese Rückantwort in
einem ersten Schritt zunächst entgegennehmen und in
eine Datei speichern.
</p>
<p>... To Be Continued!</p>
</slide>
<slide>
<title>Übungsaufgaben zu SAX - Teilaufgabe 4</title>
<p>
Geben Sie die durch die eBay API zurückgegebenen
Objekte in eine HTML-Datei als Tabelle formatiert
aus.
</p>
<ul>
<li>
Erstellen Sie sich hierfür zunächst ein
Rohgerüst einer HTML-Datei, anhand der Sie sich
überlegen, wie Sie die erhaltenen Daten anzeigen
möchten (Anzahl der Spalten, etc.).
</li>
<li>
Erstellen Sie dann eine SAX-Applikation, mit der
Sie diese HTML-Datei erzeugen und sie
entsprechend befüllen.
</li>
</ul>
</slide>
</part>
</presentation>
<!-- Ende Übungen zu SAX -->
<!-- Exkurs: Netzwerken mit Java -->
<presentation id="JavaNetworking">
<title short="JavaNetworking">
Exkurs: Netzwerken mit Java
</title>
<date>2008-11-17</date>
<toc id="resources" />
<toc id="abstract">Zugriff auf das Internet mit Java</toc>
<part>
<title>Mit einem Webserver verbinden</title>
<slide>
<title>Mit HTTP auf eine URL zugreifen</title>
<p>
Um auf einen Webserver zuzugreifen, ist es nötig,
Mit Hilfe des
<em>Hypertext Transfer Protocols (HTTP)</em>
eine Verbindung zu einer URL aufzubauen.
<br />
Im Folgenden wird Schritt für Schritt erklärt, wie
dies in Java zu bewerkstelligen ist.
</p>
<ul>
<li>
In Java existiert eine Klasse
<code>HttpURLConnection</code>
. Wird die Methode
<code>openConnection()</code>
dieser Klasse auf einer URL ausgeführt, so
erhält man eine Instanz.
</li>
<listing
src="callEbay.java"
line="16-21" />
<li>
Ist die Instanz dieser Klasse erzeugt, so kann
diese in einem zweiten Schritt konfiguriert
werden. So wird etwa festgelegt, ob für die
Verbindung Benutzereingaben vorgesehen ist (hat
Auswirkungen auf die Dauer der Verbindung) sowie
ob seitens der Applikation Ein- und Ausgaben für
die Verbindung vorgesehen sind.
</li>
<listing
src="callEbay.java"
line="23-28" />
<li>
Anschließend können dann die Parameter für diese
Verbindung gesetzt werden. Dazu gehören
beispielsweise die Festlegung der Methode, mit
der auf den HTTP Server zugegriffen wird, sowie
das Setzen diverser HTTP Header. Außerdem wird
die Verbindung konfigurier
</li>
<ul>
<li>
Der Zugriff auf die eBay API erfolgt mittels
der Methode
<code>HTTP POST</code>
. Aus diesem Grund muß die soeben erzeugte
<code>HttpURLConnection</code>
entsprechend konfiguriert werden.
</li>
<listing
src="callEbay.java"
line="31-32" />
<li>
Nun sind noch die entsprechenden Header der
HTTP Anfrage zu setzen. Dies ist mit Hilfe
der Methode
<code>
setRequestProperty(String key, String
value)
</code>
möglich.
</li>
<li>
Die eBay API verlangt zwingend folgende HTTP
Header:
<br />
<code>X-EBAY-API-REQUEST-ENCODING</code>
,
<code>X-EBAY-API-RESPONSE-ENCODING</code>
,
<code>X-EBAY-API-APP-ID</code>
,
<code>X-EBAY-API-CALL-NAME</code>
und
<code>X-EBAY-API-VERSION</code>
</li>
<listing
src="callEbay.java"
line="33-38" />
</ul>
<li>
Sind die Parameter gesetzt und die generellen
Eigenschaften einer Anfrage festgelegt, so wird
die eigentliche Verbindung zur Ressource
geöffnet (
<code>connect()</code>
).
</li>
<listing
src="callEbay.java"
line="41-47" />
<li>
Der Aufruf der Applikation erfordert unter
Umständen die Angabe eines Proxys per
Kommandozeile, abhängig von der vorhandenen
Netzwerkinfrastruktur.
</li>
<listing src="callEbay.bat" />
</ul>
</slide>
<slide>
<title>
Ein- und Ausgabe für eine Verbindung setzen
</title>
<p>
Zu Demonstrationszwecken soll verschaulicht werden,
wie die Ausgabe von Daten auf die Netzwerkverbindung
sowie das Einlesen von Daten von der
Netzwerkverbindung bewerkstelligt werden kann.
</p>
<p>
Es soll eine XML-Datei auf die Netzwerkverbindung
übertragen werden. Diese Datei wird zunächst mit
einem
<code>BufferedReader</code>
eingelesen.
</p>
<listing
src="callEbay.java"
line="52-54" />
<p>
Für die Ausgabe von Daten auf die Netzwerkverbindung
kann ein
<code>OutputStreamWriter</code>
verwendet werden. Dieser wird dann etwa Zeile für
Zeile mit der Eingabedatei befüllt.
</p>
<listing
src="callEbay.java"
line="56-63" />
<p>
Das Einlesen von Daten aus einer Netzwerkverbindung
erfolgt ähnlich. Es wird ein
<code>BufferedReader</code>
erzeugt und mit einem
<code>InputStreamReader</code>
der Netzwerkverbindung verbunden. Danach wird der
Puffer zeilenweise ausgelesen und auf
<code>stdout</code>
ausgegeben.
</p>
<listing
src="callEbay.java"
line="65-76" />
<p>
Am Ende wird die Netzwerkverbindung wieder
geschlossen.
</p>
<listing
src="callEbay.java"
line="78-79" />
</slide>
<slide>
<title>Fehlersuche bei Netzwerkverbindungen</title>
<ul>
<li>
Um feststellen zu können, was genau von einer
Applikation über eine Netzwerkverbindung
geschickt wird, bietet sich der Einsatz des frei
verfügbaren Tools
<a href="http://www.wireshark.org/">
Wireshark
</a>
an.
</li>
<li>
Es handelt sich dabei um ein Werkzeug zur
Netzwerkprotokollanalyse.
</li>
<li>
Der mitgeschnittene Netzwerkverkehr erscheint
ungefähr in folgender Form auf dem Bildschirm:
</li>
</ul>
<img
src="wireshark-connection.gif"
style="margin : 4% ; width : 80% ;" />
<ul>
<li>
Über den Menüpunkt "Follow TCP Stream" kann die
Darstellung gefiltert und lesbarer gestaltet
werden:
</li>
</ul>
<img
src="wireshark.gif"
style="margin : 4% ; width : 80% ;" />
</slide>
<slide>
<title>Gesamtes Beispiel</title>
<p>
Das gesamte Codebeispiel.
<br />
Hinweis: Der Code hat Beispielcharakter und stellt
lediglich
<em>eine mögliche Lösung</em>
für die Aufgabenstellung dar.
</p>
<listing src="callEbay.java" />
</slide>
</part>
</presentation>
<!-- Ende Netzwerken mit Java-->
<!-- DOM -->
<presentation id="DOM">
<title short="DOM">Das Document Object Model (DOM)</title>
<date>2008-11-17</date>
<toc id="resources">
<a href="http://www.w3.org/DOM/index.html">
W3C DOM Webseite
</a>
</toc>
<toc id="abstract">
Die W3C-Spezifikation des
<em>Document Object Models</em>
(abgekürzt als: DOM) definiert eine
Programmiersprachen-unabhängige und plattformneutrale Menge
abstrakter Schnittstellen, mit denen Programme und Skripte
lesend und schreibend auf gültige HTML-Dokumente und
wohlgeformte XML-Dokumente sowie eine Reihe weiterer Formate
zugreifen können.
<br />
HTML: Das Dokument kann weiterverarbeitet werden, das
Ergebnis dieser Verarbeitung kann direkt in die angezeigte
Seite eingebunden werden.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract" />
</p>
</slide>
<slide>
<title>Was ist DOM?</title>
<p>
DOM versteht sich als Application Programming Interface
(API) für beliebige XML-Dokumente (und damit auch
XHTML-Dokumente). Es definiert die logische Struktur
eines Dokumentes und die Art und Weise, wie auf diese
Struktur zugegriffen und die Information verändert
werden kann. Hierzu versammelt es auf Basis einer
generischen Speicherrepräsentation für XML eine Menge
von Operationen.
</p>
<p>
Programmierer können mit DOM Dokumente erstellen,
entlang ihrer Struktur navigieren, Elemente und deren
Inhalt hinzufügen, verändern oder löschen.
</p>
<p>
Als W3C-Spezifikation zielt DOM nicht auf eine spezielle
Programmierumgebung ab, sondern wurde vor dem
Hintergrund entworfen, für beliebige unterschiedlicher
Programmiersprachen einsetzbar zu sein.
<br />
Aus diesem Grund wurde die Spezifikation in einer
besonderen Sprache für Schnittstellen, der sogenannten
<em>
<a
href="http://www.omg.org/technology/documents/formal/corba_2.htm">
Interface Definition Language (IDL)
</a>
</em>
entworfen.
<br />
Es existiert eine Abbildung der IDL Spezifikation auf
die Programmiersprache Java.
</p>
</slide>
<slide>
<title>DOM ist...</title>
<ul>
<li>
Eine Programmier-API für Dokumente. Es basiert auf
einer Objektstruktur, die die Struktur eines
Dokumentes recht genau widerspiegelt.
</li>
<li>
Betrachten wir folgendes Beispieldokument in XHTML:
</li>
<listing src="DOMExample1.xml" />
<li>
Eine grafische Repräsentation des DOM dieser XHTML-
Tabelle wäre:
</li>
<img src="DOMExample1.png" />
<li>
Eine beispielhafte DOM Manipulation in Pseudocode
wäre etwa:
</li>
<listing src="DOMExample1.pseudocode" />
<li>
Der Name DOM rührt davon her, daß es sich dabei um
ein "Objektmodell" im traditionellen
objektorientierten Sinn handelt. Dokumente werden
mit Objekten modelliert. Das Modell umfasst nicht
nur die Struktur eines Dokuments, sondern auch das
Verhalten des Dokuments und der Objekte, aus denen
es sich zusammensetzt. Mit anderen Worten stellen
die Knoten in o.g. Diagramm keine Datenstruktur dar,
sondern Objekte mit Funktionen und einer Identität.
</li>
<li>
Als ein Objektmodell identifiziert DOM folgendes:
</li>
<ul>
<li>Die Objekte, die ein Objekt repräsentieren</li>
<li>
Die Schnittstellen, mit denen es verändert
werden kann
</li>
<li>
Die Bedeutungen dieser Schnittstellen und
Objekte - inkl. ihres Verhaltens und ihrer
Attribute
</li>
<li>
Die Beziehungen und Zusammenarbeit zwischen
diesen Schnittstellen und Objekten.
</li>
</ul>
</ul>
</slide>
<slide>
<title>DOM ist nicht...</title>
<ul>
<li>
DOM ist keine binäre Spezifikation. DOM Programme,
die in einer bestimmten Programmiersprache
geschrieben sind, sind kompatibel zu Sourcecode, der
in einer anderen Programmiersprache geschrieben
sind. Binär kompatibel sind die Programme jedoch
nicht.
</li>
<li>
DOM ist keine Methodik, mit der beliebige Objekte
nach XML überführt werden können. DOM spezifiziert
stattdessen, wie XML und XHTML-DOkumente als Objekte
repräsentiert werden können, so daß man in
objektorientierten Programmiersprachen einfach damit
arbeiten kann.
</li>
<li>
DOM ist keine Sammlung von Datenstrukturen, sondern
ein Objektmodell, das Schnittstellen spezifiziert.
Auch wenn Dokumente oft mit Diagrammen dargestellt
werden, die Elten/Kind-Beziehungen darstellen, sind
dies logische Beziehungen, die von
Programmierschnittstellen definiert sind. Es handelt
sich dabei nicht um irgendwelche internen
Datenstrukturen.
</li>
<li>
DOM definiert nicht, welche Information in einem
Dokument relevant ist, oder wie die Information in
einem Dokument strukturiert ist. Dies wird vielmehr
durch das XML Infoset spezifiziert. DOM ist
lediglich eine API für dieses Infoset.
</li>
<li>
DOM ist kein Wettbewerber zu COM, auch wenn man das
aufgrund der Namensähnlichkeit vermuten könnte. COM
dient wie CORBA dazu, programmiersprachenunabhängig
Schnittstellen und Objekte zu
<em>spezifizieren</em>
. DOM hingegen besteht aus einer Menge von
Schnittstellen und Objekten, mit denen man XML und
XHTML-Dokumente bearbeiten kann. DOM kann mit
Systemen wie COM und CORBA implementiert werden. Es
kann aber auch Abbildungen in eine
Programmiersprache wie Java geben (wie etwa in der
DOM Spezifikation selbst spezifiziert).
</li>
</ul>
</slide>
<slide>
<title>DOM - Herkunft</title>
<p>
DOM spezifizierte ursprünglich, wie JavaScript Skripte
und Java-Programme über Web Browser hinweg portabel sein
konnten. "Dynamisches HTML" war der direkte Vorgänger
des DOM. Der Fokus lag damals stark auf Browsern. Im
Rahmen der Weiterentwicklung hatte die SGML und
schließlich die XML so starken Einfluß auf DOM, daß
mittlerweile der Hauptfokus auf XML-Dokumenten liegt.
</p>
</slide>
<slide>
<title>Die DOM Module</title>
<p>
DOM bietet eine Menge von einzelner APIs, die zusammen
die DOM API bilden. Jede dieser Spezifikationen
definiert ein oder mehrere Module, von denen wiederum
jedes mit ein oder mehr Feature-Namen assoziiert ist.
</p>
<p>
Die DOM Core spezifikation definiert beispielsweise zwei
Module:
</p>
<ul>
<li>
Das Core Modul, in dem die grundlegenden
Schnittstellen spezifiziert sind, die von allen
DOM-konformen Implementierungen zur Verfügung
gestellt werden müssen.
<br />
Das damit verbundene Feature hat den Namen
<q>Core</q>
.
</li>
<li>
Das XML Modul, das die Schnittstellen enthält, die
von allen XML 1.0-konformen DOM Implementierungen
zur Verfügung gestellt werden müssen.
<br />
Das damit verbundene Feature hat den Namen
<q>XML</q>
.
</li>
</ul>
<p>
Die folgende Abbildung zeigt alle DOM Module mit ihren
Feature-Namen, die in DOM spezifiziert sind:
</p>
<img
src="dom-architecture.png"
style="margin : 4%;" />
</slide>
<slide>
<title>
DOM - Übersicht über die verschiedenen Spezifikationen
</title>
<ul>
<li>
Die erste verabschiedete Spezifikation (Status einer
W3C-Recommendation) ist das sog.
<em>
<a
href="http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/index.html">
DOM Level 1
</a>
</em>
.
</li>
<li>
Die darauf aufsetzende Spezifikation
<em>DOM Level 2</em>
besteht aus folgenden Teilspezifikationen:
</li>
<ul>
<li>
<a
href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/index.html">
Document Object Model Level 2 Core
</a>
</li>
<li>
<a
href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Views-20001113/index.html">
Document Object Model Level 2 Views
</a>
</li>
<li>
<a
href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/index.html">
Document Object Model Level 2 Events
</a>
</li>
<li>
<a
href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/index.html">
Document Object Model Level 2 Style
</a>
</li>
<li>
<a
href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/index.html">
Document Object Model Level 2 Traversal and
Range
</a>
</li>
<li>
<a
href="http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/index.html">
Document Object Model Level 2 HTML
</a>
</li>
</ul>
<li>
Es wird bereits an der als DOM Level 3 bezeichneten
Weiterentwicklung gearbeitet.
<br />
Davon sind
<ul>
<li>
<em>DOM Level 3 Core</em>
</li>
<li>
<em>DOM Level 3 Load and Save</em>
</li>
<li>
<em>
Document Object Model Level 3 Validation
</em>
</li>
</ul>
im Status einer W3C Recommendation.
<br />
Die anderen DOM Level 3 Spezifikationen (z.B.
<em>DOM Level 3 XPath</em>
oder
<em>DOM Level 3 Views and Formatting</em>
) haben erst den Stand eines
<em>Working Drafts</em>
erreicht.
</li>
</ul>
</slide>
<slide>
<title>DOM - Vergleich Level 1 - Level 2 - Level 3</title>
<p>
DOM Level 2 erweitert die in Level 1 eingeführten
Schnittstellen hinsichtlich der Erfordernisse des
aktuellen XML-Standes um Namensräume und bietet einige
neue Operationen, die seitens der Anwendergemeinde
gefordert wurden. Die bisherigen Operationen existieren
aus Kompatibilitätsgründen weiter, die
Namespace-berücksichtigenden Pendants sind identisch
benannt, jedoch um ein angehängtes NS erweitert.
</p>
<p>
DOM Level 3 komplettiert im Vergleich zu DOM Level 2 die
Abbildung zwischen DOM und dem XML Information Set. Dies
beinhaltet Unterstützung für XML Base, Unterstützung zur
Auflösung von Namensraumpräfixen oder der Manipulation
von
<em>ID</em>
Attributen, etc.
</p>
</slide>
<slide>
<title>DOM Conformance</title>
<p>
Eine Implementierung darf sich als
<em>konform zur DOM Level 3 Spezifikation</em>
bezeichnen, wenn sie das
<em>Core</em>
-Modul unterstützt.
</p>
<p>
Eine Implementierung darf sich als
<em>konform zu einem DOM Level 3 Modul</em>
bezeichnen, wenn sie alle zu diesem Modul definierten
Schnittstellen unterstützt, sowie die damit verbundene
Semantik.
</p>
<p>
Ob eine DOM-Implementierung ein einzelnes Modul
unterstützt, kann durch die Schnittstellenfunktion
<code>hasFeature</code>
der Schnittstelle
<code>DOMImplementation</code>
des Moduls
<em>Core</em>
ermittelt werden.
</p>
</slide>
<slide>
<title>
DOM - erstes Beispiel: Ermitteln der unterstützten
DOM-Module
</title>
<ul>
<li>
Die Pakete zur Realisierung des Einlesevorganges
sind in der Hierarchie
<code>javax.xml.parsers</code>
organisiert.
</li>
<li>
Die in Java implementierten DOM-Attribute und
Operationen finden sich in der Hierarchie
<code>org.w3c.dom</code>
</li>
<listing
src="DOMExample2.java"
line="1-3" />
<li>
Zunächst muß ein DOM Parser erzeugt werden, mit
dessen Hilfe ein Dokument eingelesen werden kann.
Das geschieht analog zur Erzeugungs- und
Initialisierungsphase eines SAX-Parsers auch bei DOM
über eine
<code>factory</code>
-Instanz, die den Parser (ein Objekt der Klasse
<code>DocumentBuilder</code>
) liefert.
</li>
<listing
src="DOMExample2.java"
line="8-9" />
<li>
Die Methode
<code>hasFeature</code>
ist abhängig von der konkreten Implementierung des
Parsers und wird auf der Schnittstelle
<code>DOMImplementation</code>
aufgerufen. Diese muß zunächst erzeugt werden.
</li>
<listing
src="DOMExample2.java"
line="10" />
<li>
Danach sollen alle in DOM Level 3 spezifizierten
Features...
</li>
<listing
src="DOMExample2.java"
line="13-19" />
<li>... abgefragt werden.</li>
<listing
src="DOMExample2.java"
line="21-30" />
<li>
Ein Aufruf des Programms ergibt für JDK 1.6 Update
10 folgendes Ergebnis:
</li>
<listing src="DOMExample2.output" />
</ul>
</slide>
<slide>
<title>DOM - erstes Beispiel: komplettes Listing</title>
<listing src="DOMExample2.java" />
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Document
</title>
<p>
Die Schnittstelle Document stellt eine spezialisierte
Schnittstelle von
<code>Node</code>
dar. Sie stellt den Einstieg in ein XML-Dokument dar und
wird deshalb zuerst behandelt.
</p>
<p>
Diese Schnittstelle steht für das gesamte XML oder
XHTML-Dokument. Sie bildet die Wurzel des Dokumentbaumes
und bietet den ersten Einstiegspunkt, um auf die Daten
des Dokuments zuzugreifen.
</p>
<p>
Weil es außerhalb des Kontexts eines Dokuments keine
Textknoten, Kommentare, Processing Instructions, etc.
geben kann, enthält die Schnittstelle
<code>Document</code>
auch die Fabrikmethoden zur Erzeugung dieser Objekte.
</p>
</slide>
<slide>
<title>Die vier durch DOM definierten Datentypen</title>
<p>DOM definiert folgende vier Datentypen</p>
<ul>
<li>
<code>DOMString</code>
:
<br />
Mit dem Datentyp
<code>DOMString</code>
werden Zeichen als Sequenz von 16-Bit Einheiten
codiert. Die Codierung ist UTF-16.
<br />
<em>Achtung:</em>
Ein einzelnes Zeichen aus einem XML oder
XHTML-Dokument kann aufgrund der Codierung des
Dokumentes auch in zwei 16-Bit Einheiten eines
<code>DOMString</code>
abgebildet werden.
<br />
In Java wird
<code>DOMString</code>
durch den Datentyp
<code>String</code>
abgebildet.
</li>
<li>
<code>DOMTimeStamp</code>
:
<br />
Mit dem Datentyp
<code>DOMTimeStamp</code>
werden absolute und relative Zeiten abgespeichert.
Die Einheit von
<code>DOMTimeStamp</code>
sind Millisekunden.
<br />
In Java wird
<code>DOMTimeStamp</code>
durch den Datentyp
<code>long</code>
abgebildet.
</li>
<li>
<code>DOMUserData</code>
:
<br />
In Form von
<code>DOMUserData</code>
werden Applikationsdaten abgelegt.
<br />
In Java wird
<code>DOMUserData</code>
mit dem Datentyp
<code>Object</code>
abgebildet.
</li>
<li>
<code>DOMObject</code>
:
<br />
<code>DOMObject</code>
repräsentiert ein Objekt, es stellt eine
Objektreferenz dar.
<br />
In Java wird
<code>DOMObject</code>
mit dem Datentyp
<code>Object</code>
abgebildet.
</li>
</ul>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Document -
Attribute
</title>
<p>Die Schnittstelle besitzt folgende Eigenschaften</p>
<listing
src="DOMDocument.txt"
line="3-17" />
<p>
Einige wenige Attribute der Schnittstelle erlauben
einfachen und schnellen Zugriff auf Kindelemente, ohne
daß dorthin navigiert werden muss:
</p>
<ul>
<li>
<code>doctype</code>
</li>
<li>
<code>documentElement</code>
</li>
</ul>
<p>Bedeutung DOM-sezifischer Attribute:</p>
<ul>
<li>
<code>domConfig</code>
:
<br />
Entspricht der Konfiguration, die beim Aufruf von
<code>Document.normalizeDocument()</code>
verwendet wird.
</li>
<li>
<code>implementation</code>
:
<br />
Das
<code>DOMImplementation</code>
Objekt, das das Dokument bearbeitet.
</li>
<li>
<code>inputEncoding</code>
:
<br />
Das Attribut gibt die Kodierung an, die während des
Parsens des Dokuments erkannt wurde. Ist sie
unbekannt, entspricht der Wert
<code>null</code>
.
</li>
<li>
<code>strictErrorChecking</code>
:
<br />
Mit diesem Attribut kann spezifiziert werden, wie
strikt die Fehlerüberprüfung auf DOM Operationen
durchgeführt werden soll. Der Vorgabewert ist
<code>true</code>
.
</li>
</ul>
<p>Abbildung nach Java:</p>
<table
border="1"
cellpadding="5">
<thead>
<tr>
<th>DOM Attribut</th>
<th>Java Methode(n)</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>doctype</code>
</td>
<td>
<code>DocumentType getDoctype()</code>
</td>
</tr>
<tr>
<td>
<code>implementation</code>
</td>
<td>
<code>
DOMImplementation getImplementation()
</code>
</td>
</tr>
<tr>
<td>
<code>documentElement</code>
</td>
<td>
<code>Element getDocumentElement()</code>
</td>
</tr>
<tr>
<td>
<code>inputEncoding</code>
</td>
<td>
<code>String getInputEncoding()</code>
</td>
</tr>
<tr>
<td>
<code>xmlEncoding</code>
</td>
<td>
<code>String getXmlEncoding()</code>
</td>
</tr>
<tr>
<td>
<code>xmlStandalone</code>
</td>
<td>
<code>boolean getXmlStandalone()</code>
,
<br />
<code>
void setXmlStandalone(boolean
xmlStandalone)
</code>
</td>
</tr>
<tr>
<td>
<code>xmlVersion</code>
</td>
<td>
<code>String getXmlVersion()</code>
,
<br />
<code>
void setXmlVersion(String xmlVersion)
</code>
</td>
</tr>
<tr>
<td>
<code>strictErrorChecking</code>
</td>
<td>
<code>
boolean getStrictErrorChecking()
</code>
,
<br />
<code>
void setStrictErrorChecking(boolean
strictErrorChecking)
</code>
</td>
</tr>
<tr>
<td>
<code>documentURI</code>
</td>
<td>
<code>String getDocumentURI()</code>
,
<br />
<code>
void setDocumentURI(String documentURI
</code>
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Document -
Operationen
</title>
<p>
Folgende Operationen sind für die Schnittstelle
<code>Document</code>
definiert:
</p>
<listing
src="DOMDocument.txt"
line="20-56" />
<ul>
<li>
<code>adoptNode</code>
<q>Adoptiert</q>
einen Knoten aus einem anderen Dokument. Wenn die
Operation unterstützt wird, ändert sich die
Eigenschaft
<code>ownerDocument</code>
des Knotens, seiner Kinder und aller evtl.
vorhandenen Attributknoten. Der Knoten wird aus der
Kindknoten-Liste seines ursprünglichen
Elternelements entfernt. Auf diese Weise kann ein
Teilbaum sehr effektiv von einem Dokument zum
anderen bewegt werden. Ist diese Operation nicht
unterstützt, sollte stattdessen
<code>importNode</code>
verwendet werden.
</li>
<li>
<code>importNode</code>
bewegt keine Teilbäume durch Umkopieren, sondern
erzeugt eine Kopie des Quellknotens. Das
Quelldokument wird dabei nicht verändert. Ergebnis
der Operation ist ein neu erzeugter Knoten (die
Kopie), der noch an kein Elternelement angehängt
ist. Beim Kopiervorgabg werden auch sämtliche
Attributwerte inkl. der Namensraumattribute kopiert.
</li>
<li>
<code>createElement</code>
,
<code>createAttribute</code>
,
<code>createTextNode</code>
,
<code>createComment</code>
,
<code>createCDATASection</code>
,
<code>createProcessingInstruction</code>
,
<code>createEntityReference</code>
und
<code>createDocumentFragment</code>
dienen zum Erzeugen neuer Knoten des jeweiligen
Knotentyps.
</li>
<li>
<code>createElementNS</code>
und
<code>createAttributeNS</code>
erzeugen Element- bzw. Attributknoten mit
entsprechenden Namensrauminformationen.
</li>
<li>
<code>getElementsByTagNameNS</code>
gibt eine Liste von Knoten zurück, die den
angegebenen lokalen Namen besitzen und sich im
angegebenen Namensraum befinden.
</li>
<li>
<code>getElementById</code>
gibt das Element zurück, das ein ID-Attribut
enthält, dessen Wert dem angegebenen Wert
entspricht.
</li>
<li>
<code>normalizeDocument</code>
<q>Normalisiert</q>
das Dokument. Dies betrifft insbesondere Textknoten,
die wie in der Methode
<code>Node.normalize()</code>
normalisiert werden (z.B. Entfernen leerer
Textknoten). Welche weiteren
Normalisierungsmöglichkeiten auf das Dokument
angewendet werden sollen, wird in der
<code>DOMConfiguration</code>
festgelegt.
</li>
<li>
<code>renameNode</code>
Dient zur Umbenennung eines Element- oder
Attributknotens. Optimalerweise wird einfach der
Name des betreffenden Knotens verändert, andernfalls
ein neuer Knoten mit einem entsprechenden Namen
erzeugt und der vorhandene Knoten durch den neuen
ersetzt.
</li>
</ul>
<p>Abbildung in Java</p>
<table
border="1"
cellpadding="5">
<thead>
<tr>
<th>DOM Methode</th>
<th>Java Methode(n)</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>
createElement(in DOMString tagName)
</code>
</td>
<td>
<code>
Element createElement(String tagName)
</code>
</td>
</tr>
<tr>
<td>
<code>createDocumentFragment()</code>
</td>
<td>
<code>
DocumentFragment
createDocumentFragment()
</code>
</td>
</tr>
<tr>
<td>
<code>
createTextNode(in DOMString data)
</code>
</td>
<td>
<code>
Text createTextNode(String data)
</code>
</td>
</tr>
<tr>
<td>
<code>
createComment(in DOMString data)
</code>
</td>
<td>
<code>
Comment createComment(String data)
</code>
</td>
</tr>
<tr>
<td>
<code>
createCDATASection(in DOMString data)
</code>
</td>
<td>
<code>
</code>
</td>
</tr>
<tr>
<td>
<code>
createProcessingInstruction(in DOMString
target, in DOMString data)
</code>
</td>
<td>
<code>
CDATASection createCDATASection(String
data)
</code>
</td>
</tr>
<tr>
<td>
<code>
createAttribute(in DOMString name)
</code>
</td>
<td>
<code>
Attr createAttribute(String name)
</code>
</td>
</tr>
<tr>
<td>
<code>
createEntityReference(in DOMString name)
</code>
</td>
<td>
<code>
EntityReference
createEntityReference(String name)
</code>
</td>
</tr>
<tr>
<td>
<code>
getElementsByTagName(in DOMString
tagname)
</code>
</td>
<td>
<code>
NodeList getElementsByTagName(String
tagname)
</code>
</td>
</tr>
<tr>
<td>
<code>
importNode(in Node importedNode, in
boolean deep)
</code>
</td>
<td>
<code>
Node importNode(Node importedNode,
boolean deep)
</code>
</td>
</tr>
<tr>
<td>
<code>
createElementNS(in DOMString
namespaceURI, in DOMString
qualifiedName)
</code>
</td>
<td>
<code>
Element createElementNS(String
namespaceURI, String qualifiedName)
</code>
</td>
</tr>
<tr>
<td>
<code>
createAttributeNS(in DOMString
namespaceURI, in DOMString
qualifiedName)
</code>
</td>
<td>
<code>
Attr createAttributeNS(String
namespaceURI, String qualifiedName)
</code>
</td>
</tr>
<tr>
<td>
<code>
getElementsByTagNameNS(in DOMString
namespaceURI, in DOMString localName)
</code>
</td>
<td>
<code>
NodeList getElementsByTagNameNS(String
namespaceURI, String localName)
</code>
</td>
</tr>
<tr>
<td>
<code>
getElementById(in DOMString elementId)
</code>
</td>
<td>
<code>
Element getElementById(String elementId)
</code>
</td>
</tr>
<tr>
<td>
<code>adoptNode(in Node source)</code>
</td>
<td>
<code>Node adoptNode(Node source)</code>
</td>
</tr>
<tr>
<td>
<code>normalizeDocument()</code>
</td>
<td>
<code>void normalizeDocument()</code>
</td>
</tr>
<tr>
<td>
<code>
renameNode(in Node n, in DOMString
namespaceURI, in DOMString
qualifiedName)
</code>
</td>
<td>
<code>
Node renameNode(Node n, String
namespaceURI, String qualifiedName)
</code>
</td>
</tr>
</tbody>
</table>
<p>
Es ist festzustellen, daß die Abbildung der DOM
Attribute und Operationen in die Programmiersprache Java
sich sehr übersichtlich gestaltet.
</p>
</slide>
<slide>
<title>DOM - zweites Codebeispiel: einfacher Parser</title>
<p>
In diesem Codebeispiel soll eine DOM-basierte
Speicherstruktur mit SUNs JDK erzeugt werden.
</p>
<ul>
<li>
Die Methode
<code>parse</code>
erzeugt ein Document-Objekt gemäß der W3C
Spezifikation.
</li>
<listing
src="DOMExample3.java"
line="9" />
<li>
Die entsprechenden Schnittstellendefinitionen sind
im Paket
<code>org.w3c.dom</code>
zusammengefaßt.
</li>
<listing
src="DOMExample3.java"
line="1-3" />
<li>Das gesamte dritte Codebeispiel:</li>
<listing src="DOMExample3.java" />
<li>
Der Zugriff auf das Wurzelelement des verarbeiteten
Dokuments wird über das Attribut
<code>documentElement</code>
bereitgestellt. Es liefert ein Objekt des Typs
<em>Element</em>
.
</li>
</ul>
</slide>
<slide>
<title>Die grundlegenden DOM-Schnittstellen - Node</title>
<p>
Die Schnittstelle
<code>Node</code>
ist der wichtigste Datentyp für das gesamte DOM. Sie
stellt einen einzelnen Knoten im gesamten Dokumentbaum
dar.
</p>
<p>
Die Schnittstelle konzentriert alle gemeinsamen Anteile
der verschiedenen Knoten eines XML-Baumes. Hierzu
gehören:
</p>
<ul>
<li>Das Dokument selbst</li>
<li>alle darin enthaltenen Attribute</li>
<li>alle darin enthaltenen Elemente</li>
<li>alle darin enthaltenen Kommentare</li>
<li>alle darin enthaltenen Textelemente</li>
<li>
weitere durch die InfoSet-Spezifikation definierte
Primitive
</li>
</ul>
<p>
Alle Objekte, die die Schnittstelle
<code>Node</code>
implementieren, stellen Methoden zur Verfügung, um mit
Kindknoten umzugehen. Gleichzeitig verfügen jedoch nicht
alle dieser Objekte über Kindknoten (z.B. Textknoten,
diese haben keine Kindknoten).
</p>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Node -
Knotentypisierung
</title>
<p>
In der Schnittstelle sind verschiedene Konstanten
definiert, die dazu dienen, eine Typisierung für die
verschiedenen Arten von Knoten zu realisieren. Ein
Integer weist darauf hin, um welchen Knotentyp es sich
handelt (die Zahlen bis 200 sind hierfür reserviert).
Für jeden dieser Knotentypen existiert jeweils eine
eigene DOM-Schnittstelle.
</p>
<listing
src="DOMNode.txt"
line="4-15" />
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Node -
Knotentypisierung - Beispiel
</title>
<p>
Der Knotentyp eines jeden Knotens kann über das in DOM
spezifizierte Attribut
<code>nodeType</code>
abgefragt werden.
<br />
In Java ist dieses DOM-Attribut durch die Operation
<code>getNodeType()</code>
abgebildet.
</p>
<p>
Im vorgestellten Beispiel wird diese Operation auf
verschiedenen Knotentypen aufgerufen:
</p>
<ul>
<li>document (9)</li>
<li>element (1)</li>
<li>text (3)</li>
</ul>
<p>
Auszug aus dem Sourcecode: Aufruf der Operation auf
Inhaltsknoten des Wurzelelementes
</p>
<listing
src="DOMNodeType.java"
line="20-22" />
<p>Angewendet auf das folgendes XML-Dokument...</p>
<listing src="erstes-XML-dokument.xml" />
<p>... ergibt sich folgende Ausgabe:</p>
<listing src="DOMNodeType.output" />
<p>
Die gefundenen Textknoten entsprechen dem textuellen
Inhalt in
<code>Vorlesung</code>
inkl. der Zeilenumbrüche.
</p>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Node -
grundlegende Attribute
</title>
<p>
Mit den Attributen
<code>nodeName</code>
,
<code>nodeValue</code>
und
<code>attributes</code>
stehen grundlegende Attribute zur Verfügung, die es
erlauben, einfach auf die Information der betreffenden
Knoten zuzugreifen, ohne daß auf die spezifische
Schnittstelle des jeweiligen Knotentyps direkt
zugegriffen werden muß.
<br />
Hinweis: die spezifischen Schnittstellen enthalten unter
Umständen zusätzliche Mechanismen, mit denen man sehr
einfach relevante Informationen erhalten oder setzen
kann.
</p>
<listing
src="DOMNode.txt"
line="17-21" />
<p>Abbildung nach Java:</p>
<ul>
<li>
Das Attribut
<code>nodeName</code>
bildet sich auf die Methode
<code>String getNodeName()</code>
ab.
<br />
<code>nodeName</code>
ist für alle Knotentypen verfügbar.
</li>
<listing
src="DOMNode.java"
line="16" />
<li>
Das Attribut
<code>nodeValue</code>
bildet sich auf die Methode
<code>String getNodeValue()</code>
ab.
<br />
Die Eigenschaft
<code>nodeValue</code>
ist für Knoten des Typs
<code>ATTRIBUTE_NODE</code>
,
<code>CDATA_SECTION_NODE</code>
,
<code>COMMENT_NODE</code>
,
<code>PROCESSING_INSTRUCTION_NODE</code>
und
<code>TEXT_NODE</code>
gesetzt.
</li>
<listing
src="DOMNode.java"
line="22-24" />
<li>
Das Attribut
<code>attributes</code>
bildet sich auf die Methode
<code>NamedNodeMap getAttributes()</code>
ab.
<br />
Die Eigenschaft
<code>attributes</code>
liefert erwartungsgemäß nur für Knoten des Typs
<code>ELEMENT_NODE</code>
, die auch Attribute besitzen, ein positives
Ergebnis, ansonsten
<code>null</code>
.
</li>
</ul>
<p>
Das vorige Beispiel erweitert um Ausgaben zu
<code>nodeName</code>
und
<code>nodeValue</code>
liefert folgende Ausgabe:
</p>
<listing src="DOMNode1.output" />
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Node - weitere
Attribute
</title>
<p>
Des weiteren versammelt die Schnittstelle
<code>Node</code>
folgende weiteren Attribute:
</p>
<listing
src="DOMNode.txt"
line="23-44" />
<p>Abbildung nach Java:</p>
<table
border="1"
cellpadding="5">
<thead>
<tr>
<th>DOM Attribut</th>
<th>Java Methode(n)</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>nodeType</code>
</td>
<td>
<code>short getNodeType()</code>
</td>
</tr>
<tr>
<td>
<code>parentNode</code>
</td>
<td>
<code>Node getParentNode()</code>
</td>
</tr>
<tr>
<td>
<code>childNodes</code>
</td>
<td>
<code>NodeList getChildNodes()</code>
</td>
</tr>
<tr>
<td>
<code>firstChild</code>
</td>
<td>
<code>Node getFirstChild()</code>
</td>
</tr>
<tr>
<td>
<code>lastChild</code>
</td>
<td>
<code>Node getLastChild()</code>
</td>
</tr>
<tr>
<td>
<code>previousSibling</code>
</td>
<td>
<code>Node getPreviousSibling()</code>
</td>
</tr>
<tr>
<td>
<code>nextSibling</code>
</td>
<td>
<code>Node getNextSibling()</code>
</td>
</tr>
<tr>
<td>
<code>ownerDocument</code>
</td>
<td>
<code>Document getOwnerDocument()</code>
</td>
</tr>
<tr>
<td>
<code>namespaceURI</code>
</td>
<td>
<code>String getNamespaceURI()</code>
</td>
</tr>
<tr>
<td>
<code>prefix</code>
</td>
<td>
<code>String getPrefix()</code>
</td>
</tr>
<tr>
<td>
<code>localName</code>
</td>
<td>
<code>String getLocalName()</code>
</td>
</tr>
<tr>
<td>
<code>baseURI</code>
</td>
<td>
<code>String getBaseURI()</code>
</td>
</tr>
<tr>
<td>
<code>textContent</code>
</td>
<td>
<code>String getTextContent()</code>
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Node -
Operationen
</title>
<p>
Die aufgeführten Operationen erlauben Veränderungen der
Knotenstruktur. So können etwa neue Knoten in eine
bestehendes DOM-Objektmodell eingefügt werden.
Darüberhinaus können existierende Knoten ersetzt,
gelöscht und kopiert werden. Die Schnittstelle
<code>Node</code>
wird von allen im folgenden diskutierten nach Knotentyp
spezialisierten Schnittstellen erweitert.
</p>
<listing
src="DOMNode.txt"
line="46-81" />
<p>
Die Abbildung in Java wird ab hier nicht mehr explizit
aufgeführt. Für eine Übersicht der Java Schnittstellen
siehe
<a
href="http://java.sun.com/javase/6/docs/api/index.html">
Java API Dokumentation
</a>
, Paket
<code>org.w3c.dom</code>
.
</p>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Node - Beispiel
</title>
<p>
Das komplette Beispiel zur Schnittstelle
<code>Node</code>
</p>
<listing src="DOMNode.java" />
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Element
</title>
<p>
Die Schnittstelle
<code>Element</code>
entspricht einem Element eines XML- oder
HTML-Dokumentes. Da die Schnittstelle
<code>Node</code>
erweitert wird, können die dort definierte generischen
Attribute verwendet werden, um beispielsweise die Menge
von Attributen zu einem Element zu erhalten.
<br />
Des weiteren enthält die Schnittstelle eine Reihe von
Operationen zum Zugriff auf XML-Elemente.
</p>
<p>Die Schnittstelle versammelt folgende Eigenschaften:</p>
<listing
src="DOMElement.txt"
line="2-4" />
<ul>
<li>
<code>schemaTypeInfo</code>
:
<br />
Die Typinformation (aus einem Schema), die mit
diesem Element verknüpft ist.
</li>
<li>
<code>tagName</code>
:
<br />
Der Name des Elements in qualifizierter Form.
</li>
</ul>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Element -
Operationen
</title>
<p>
Folgende Operationen sind für die Schnittstelle
<code>Element</code>
definiert:
</p>
<listing
src="DOMElement.txt"
line="6-52" />
<ul>
<li>
Auffallend ist, daß es jeweils zwei unterschiedliche
Methoden zum Zugriff auf Attribute gibt (z.B.
<code>getAttribute</code>
und
<code>getAttributeNode</code>
.
<br />
Der Unterschied bei diesem Methoden liegt darin,
dass mit der einen ein Objekt vom Typ
<code>Attr</code>
erhalten wird, mit der anderen jedoch der
Attributwert.
</li>
<li>
Beachtenswert sind auch die drei Methoden zur
Erstellung eines Attributs vom Typ
<code>ID</code>
.
</li>
</ul>
</slide>
<slide>
<title>
DOM - Beispiel: Zugriff auf das Wurzelelement eines
Dokuments
</title>
<p>
In diesem Beispiel soll der Einsatz der Operation
<code>hasAttributes</code>
gezeigt werden. Die Methode testet, ob für das gegebene
Element Attribute existieren.
</p>
<p>
Zunächst wird mit der Methode
<code>getDocumentElement</code>
auf das Wurzelelement des Dokuments zugegriffen. Diese
Methode entspricht keiner DOM-Operation, sondern dem
DOM-Attribut
<code>documentElement</code>
.
<br />
Grund: Java erlaubt in Schnittstellen keine änderbaren
Attribute. Daher stellt die DOM-Implementierung des JDK
für diese Attribute eigene Zugriffsmethoden zur
Verfügung.
</p>
<listing
src="DOMExample4.java"
line="12" />
<p>
In einem weiteren Schritt wird mittels
<code>getTagName()</code>
der Name des Wurzelelements ermittelt. Diese
Java-Methode entspricht dem DOM-Attribut
<code>tagName</code>
.
</p>
<listing
src="DOMExample4.java"
line="14" />
<p>
Mit der Methode
<code>hasAttributes()</code>
wird schließlich abgefragt, ob das Element Attribute
besitzt, und eine entsprechende Ausgabe erzeugt.
</p>
<listing
src="DOMExample4.java"
line="16-19" />
<p>Das gesamte Listing:</p>
<listing src="DOMExample4.java" />
<p>
Angewandt auf die XML-Datei der Projektverwaltung
liefert das Programm die Ausgabe:
</p>
<listing src="DOMExample4.output" />
</slide>
<slide>
<title>DOM - Beispiel: Ein Dokument modifizieren</title>
<p>
Mit DOM kann -- im Gegensatz zu SAX -- ein eingelesenes
Dokument verändert werden. Das hier diskutierte Beispiel
demonstriert dies.
</p>
<p>
Dem Wurzelelement eines Dokuments (das Objekt
<code>theRootElement</code>
vom Typ
<code>Element</code>
) soll ein Attribut (benannt mit
<code>myFirstNewAttribute</code>
) hinzugefügt und mit dem Wert
<code>01</code>
belegt werden.
<br />
</p>
<listing
src="DOMExample5.java"
line="12-20" />
<p>
Zudem soll ein neues Element
<code>myNewElement</code>
als Kindelement des Wurzelelements erzeugt werden.
</p>
<listing
src="DOMExample5.java"
line="22-28" />
<p>
Achtung:
<br />
Die Methode
<code>createElement</code>
ist für die Schnittstelle
<code>document</code>
definiert und muß auf dieser aufgerufen werden.
<br />
Das neu erzeugte Element muß mit
<code>appendChild</code>
(von der Schnittstelle
<code>Element</code>
) an das Wurzelelement angehängt werden.
</p>
<p>
Hinweis: In früheren JDK-Versionen konnte durch den
Aufruf der Methode
<code>String.println</code>
ein DOM-Baum in eine Zeichenkettenrepräsentation
serialisiert und über die Standardausgabe ausgegeben
werden. Dies ist inzwischen nicht mehr der Fall!
</p>
<p>
Angewendet auf eine sehr einfache
<a href="DOMExample5-input.xml">Eingabedatei</a>
mit dem (einzigen) Element
<code>empty</code>
als Wurzelelement ergibt sich folgende Ausgabe:
</p>
<listing src="DOMExample5.output" />
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - NodeList
</title>
<p>
Die Schnittstelle
<code>NodeList</code>
definiert einen Container zur Aufnahme beliebiger
Objekte des Typs
<code>Node</code>
. Sie definiert das Attribut
<code>length</code>
, welches zu jedem Zeitpunkt die Anzahl der verwalteten
Elemente enthält. Der Zugriff auf die verwalteten Knoten
erfolgt indexsequentiell durch die Methode
<code>item</code>
.
</p>
<listing src="DOMNodeList.txt" />
</slide>
<slide>
<title>
DOM - Beispiel NodeList: Ein Dokument modifizieren
</title>
<p>
Das Beispiel zeigt die Verwendung der Schnittstelle, um
festzustellen, wie oft ein als Kommandozeilenparameter
übergebener Elementname in einem Dokument auftritt.
</p>
<p>
Die Methode
<code>getElementsByTagName</code>
der Schnittstelle
<code>Document</code>
fügt während der Ausführung alle Auftreten von Elementen
mit dem gesuchten Namen in die Ergebnismenge ein.
</p>
<listing src="DOMExample6.java" />
<p>
Angewendet auf die XML-Datei der
<a href="projektverwaltung-erweitert.xml">
erweiterte Projektverwaltung
</a>
ergibt die Suche nach Elementen mit dem Namen
<code>Vorname</code>
...
</p>
<listing src="DOMExample6.bat" />
<p>... folgende Ausgabe:</p>
<listing src="DOMExample6.output" />
</slide>
<slide>
<title>
DOM - Beispiel NodeList: Anzahl enthaltener Elemente
zählen
</title>
<p>
In diesem Beispiel (aus der Praxis) soll eine
statistische Aussage getroffen werden:
<q>
Wie viele Fehlerspeicher sind für ein Steuergerät in
einer XML-Datei definiert?
</q>
</p>
<p>
Für die Definition von Diagnosedaten für Steuergeräte
existiert ein XML-Standard namens
<em>ODX</em>
. In diesem XML-Vokabular werden sogenannte
<em>Fehlerspeicher</em>
und
<em>Diagnosejobs</em>
definiert.
</p>
<p>
Eine Fehlerspeicher wird in ODX durch ein Element mit
dem Namen
<code>DTC</code>
definiert. Möchte man wissen, wie viele Fehlerspeicher
definiert sind, so benötigt man die Anzahl der
<code>DTC</code>
-Elemente.
</p>
<p>
Diese werden analog zum vorherigen Beispiel durch die
Methode
<code>getElementsByTagName</code>
in einer Knotenliste gesammelt. Die Länge der
Knotenliste ergibt die Anzahl der enthaltenen
<code>DTC</code>
-Elemente.
</p>
<listing src="countDTCs.java" />
<listing src="countDTCs.output" />
</slide>
<slide>
<title>Die grundlegenden DOM-Schnittstellen - Attr</title>
<p>
Die Schnittstelle
<code>Attr</code>
erweitert Node. Sie steht für ein Attribut eines
Elements. Objekte vom Typ
<code>Attr</code>
erben von
<code>Node</code>
. Dabei wird
<code>Node</code>
um drei Attribute zur Abbildung der Charakteristika
eines XML-Attributs erweitert.
</p>
<p>
DOM betrachtet Attribute eher als Eigenschaften von
Elementen denn als eigenständige Objekte mit einer
eigenen Identität. Sie werden in DOM demnach nicht als
Kindknoten des Elements betrachtet, das sie beschreiben.
Attribute werden werden von DOM nicht als Teil des
Dokumentbaums gesehen. Die Eigenschaften
<code>parentNode</code>
,
<code>previousSibling</code>
und
<code>nextSibling</code>
sind für
<code>Attr</code>
-Objekte nicht definiert und haben den Nullwert.
</p>
<p>
In DOM werden alle Attributwerte als einfache
Zeichenketten dargestellt, auch wenn eine DTD oder ein
Schema sie als einem bestimmten Typ zugehörig (z.B. als
Token) definiert.
</p>
<listing src="DOMAttr.txt" />
<p>
Die Attribut-spezifischen Eigenschaften werden durch den
Attributnamen (
<code>name</code>
) und seinen Wert (
<code>value</code>
) abgebildet.
<br />
Ferner ist verfügbar, ob es sich um ein im eingelesenen
Quelldokument auftretendes Attribut handelt (
<code>specified</code>
hat den Wert
<code>true</code>
), oder durch den Parser der in der DTD oder dem Schema
festgelegte Vorgabewert geliefert wird.
<code>schemaTypeInfo</code>
liefert Information über den Typ, der mit dem Attribut
verbunden ist. Einen Verweis auf das umgebende Element
liefert das Attribut
<code>ownerElement</code>
.
</p>
</slide>
<slide>
<title>
DOM - Beispiel: Zugriff auf Attributinformation
</title>
<p>
Im folgenden Codebeispiel sollen verschiedene
Informationen, die in Form von Attributen vorliegen,
ermittelt werden. Als Eingabe dient eine um die
DOCTYPE-Deklaration erweiterte Variante der
Projektverwaltung.
</p>
<listing src="projektverwaltung2DTD.xml" />
<p>
Zunächst werden alle Elemente des Typs
<code>Projekt</code>
in einer
<code>NodeList</code>
zusammengestellt.
</p>
<listing
src="DOMExample7.java"
line="10-16" />
<p>
Danach werden alle Elemente der Knotenmenge durchlaufen,
und im Falle der Existenz (geprüft mit hasAttributes)
verschiedene Charakteristika des Attributs ausgegeben.
</p>
<listing
src="DOMExample7.java"
line="18-31" />
<p>Ein Aufruf ergibt folgendes Ergebnis:</p>
<listing src="DOMExample7.output" />
<p>
Die Auswertungen zum ID-Attribut sind direkt aus dem
XML-Eingabedokument ersichtlich.
</p>
<p>
Woher jedoch kommen die Werte für das Attribut
<code>budget</code>
(Auflösung mit Taste
<code>n</code>
)?
</p>
<note>
<p>
Der XML-Prozessor erhält seine Informationen über
<code>budget</code>
aus der referenzierten Dokument Typ Deklaration. In
ihr ist das Attribut mit dem Vorgabwert 10.000
definiert. Dieser Wert wird an die Applikation
zurückgegeben, wenn keine andere Belegung im
Dokument gefunden wird. Dies ist für beide
<code>Projekt</code>
-Elemente der Fall. Verfügt das Eingabedokument über
keine DOCTYPE-Deklaration, so kann diese Information
nicht ausgewertet werden.
</p>
</note>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Processing
Instruction
</title>
<p>
Die Schnittstelle ProcessingInstruction steht für eine
<code>processing instruction</code>
, wie sie in XML verwendet wird, um dem verarbeitenden
Prozessor Hinweise zur Verarbeitung des XML-Dokuments zu
übergeben.
<br />
Der Inhalt einer
<code>processing instruction</code>
wird keiner Prüfung unterzogen.
<br />
Die Processing Instruction enthält folgende zwei
Eigenschaften:
</p>
<listing src="DOMProcessingInstruction.txt" />
<p>
<code>target</code>
: Der Name des Prozessors / der Applikation, die die
Processing Instruction berücksichtigen soll.
</p>
<p>
<code>data</code>
: der Inhalt der Processing Instruction.
</p>
</slide>
<slide>
<title>
Die grundlegenden DOM-Schnittstellen - Character Data
</title>
<p>
Die Schnittstelle
<code>CharacterData</code>
erweitert
<code>Node</code>
um eine Reihe von Attributen und Methoden, mit denen auf
Zeichendaten in DOM zugegriffen werden kann. Es gibt
kein DOM Objekt, das direkt dieser Schnittstelle
entspricht. Es handelt sich hierbei vielmehr um eine
Sammlung von Methoden und Attribute, die ansonsten für
jedes Objekt, das diese Schnittstelle erweitert (z.B.
<code>Text</code>
, neu definiert werden hätten müssen.
</p>
<listing src="DOMCharacterData.txt" />
<p>
<code>data</code>
: Die Zeichendaten des Knotens als
<code>DOMString</code>
Datentyp. The DOM implementation may not put arbitrary
limits on the amount of data that may be stored in a
CharacterData node. However, implementation limits may
mean that the entirety of a node's data may not fit into
a single DOMString. In such cases, the user may call
substringData to retrieve the data in appropriately
sized pieces.
</p>
<p>
<code>length</code>
: Gibt die Anzahl der 16-bit Einheiten an, die über die
Methoden
<code>data</code>
und
<code>substringData</code>
verfügbar sind. Leere Zeichenketten liefern den Wert
<code>0</code>
.
</p>
<p>
<code>appendData</code>
: dient dazu, den übergebenen String and Ende der Daten
des Knotens anzuhängen. Bei Erfolg, kann mit
<code>data</code>
auf die so zusammengefügte Zeichenkette zugegriffen
werden.
</p>
<p>
<code>deleteData</code>
: Entfernt einen Bereich von 16-bit Einheiten vom
Knoten.
</p>
<p>
<code>insertData</code>
: Fügt einen String am angegebenen Ort ein.
</p>
<p>
<code>replaceData</code>
: Ersetzt die Zeichen am angegebenen Ort durch die
übergebene Zeichenkette.
</p>
<p>
<code>substringData</code>
: Liefert einen Teilstring aus dem angegebenen Bereich
zurück.
</p>
</slide>
<slide>
<title>Die grundlegenden DOM-Schnittstellen - Text</title>
<p>
Die Schnittstelle Text erweitert
<code>CharacterData</code>
. Sie steht für textuellen Inhalt von ELementen oder
Attributen.
</p>
<p>
Wenn innerhalb eines Elements kein Markup vorkommt, ist
der enthaltene Text in einem einzigen Objekt vom Typ
<code>Text</code>
enthalten. Dieses Objekt ist das einzige Kind des
Elements.
</p>
<p>
Andernfalls wird das enthaltene Markup analysiert und
entsprechende Knoten (Elemente, Attribute, Kommentare,
Text) als Kindknoten des Elements erzeugt.
</p>
<p>
Zusätzlich zu den in
<code>CharacterData</code>
bereits definierten Attributen und Methoden definiert
<code>Text</code>
folgende:
</p>
<listing src="DOMText.txt" />
<p>
<code>isElementContentWhitespace</code>
: Gibt zurück, ob dieser Textkniten Leerzeichen enthält,
der
<q>ignoriert</q>
werden kann.
</p>
<p>
<code>wholeText</code>
:Gibt den Text all der Textknoten zurück, die vom
aktuellen Knoten aus besucht werden können, ohne die
Grenzen von Elementmarkup, Kommentaren oder Processing
Instructions zu überschreiten.
<br />
</p>
<listing
src="DOMText.java"
line="26-27" />
<p>
<code>replaceWholeText</code>
: Ersetzt den Text des aktuellen Knotens, der vom
aktuellen Knoten aus besucht werden kann, ohne die
Grenzen von Elementmarkup, Kommentaren oder Processing
Instructions zu überschreiten.
</p>
<listing
src="DOMText.java"
line="40" />
<p>
<code>splitText</code>
: Spaltet den Knoten an der angegebenen Position in zwei
Geschwisterknoten auf.
</p>
</slide>
<slide>
<title>DOM - Beispiel Textknotenverarbeitung</title>
<p>
Das hier vorgestellte Beispiel versammelt Zugriff auf
alle vorgestellten Methoden zur Textknotenverarbeitung.
</p>
<p>
Es extrahiert zunächst alle Paragraphen
<code>p</code>
(in denen üblicherweise Textinhalt steht) aus dem
Eingabedokument. Die weitere Textverarbeitung findet
dann aus Gründen der Einfachheit auf dem Inhalt des
ersten extrahierten Paragraphen statt.
</p>
<p>
Es werden zuerst einige Statistiken zum textuellen
Inhalt auf
<code>stdout</code>
ausgegegeben, bevor der Text zum besseren Verständnis
dieser ermittelten Statistiken zeichenweise ausgegeben
wird.
</p>
<p>
Im Anschluß wird der Textinhalt des einen Knotens auf
zwei Textknoten aufgeteilt, um danach durch neuen Text
ersetzt zu werden.
</p>
<listing src="DOMText.java" />
<p>Angewendet auf folgendes Eingabedokument...</p>
<listing src="DOMText.xml" />
<p>... ergibt sich folgende Ausgabe:</p>
<listing src="DOMText.output" />
</slide>
<slide>
<title>
DOM - abschließendes Beispiel - Erzeugen eines Dokuments
im Hauptspeicher
</title>
<p>
Das abschließende Beispiel zeigt die Nutzung aller
vorgestellten Schnittstellen zur Konstruktion eines
neuen XML-Dokuments.
</p>
<p>
Folgendes Dokument soll komplett im Hauptspeicher
erzeugt werden und danach über die Standardausgabe
ausgegeben werden.
</p>
<listing src="DOMFinalExample.xml" />
<p>
Zuerst wird ein Dokument erzeugt und die Processing
Instruction als Kindelement an das Dokument hinzugefügt.
</p>
<listing
src="DOMFinalExample.java"
line="12-20" />
<p>
Danach wird das
<code>html</code>
-Element als Kindelement des Dokuments im korrekten
Namensraum erzeugt sowie die beiden Attribute
<code>xmlns</code>
und
<code>xmlns:svg</code>
hinzugeügt.
</p>
<listing
src="DOMFinalExample.java"
line="22-26" />
<p>
In einem nächsten Schritt werden
<code>head</code>
- und
<code>title</code>
-Element samt textuellem Inhalt erzeugt und an den
jeweils korrekten Stellen in den Baum eingefügt.
</p>
<listing
src="DOMFinalExample.java"
line="28-35" />
<p>
Analog zum
<code>head</code>
-Element wird das
<code>body</code>
-Element erzeugt und als Kindelement an das
<code>html</code>
-Element angehängt.
</p>
<listing
src="DOMFinalExample.java"
line="37-38" />
<p>
Element
<code>p</code>
sowie dessen Kindelement
<code>a</code>
werden samt textuellem Inhalt erstellt und in die
Dokumentstruktur eingebunden.
</p>
<listing
src="DOMFinalExample.java"
line="41-47" />
<p>
Schließlich wird das Element
<code>svg</code>
im Namensraum
<code>http://www.w3.org/2000/svg</code>
mit seinen Attributen
<code>width</code>
und
<code>height</code>
sowie dessen Kindelement
<code>ellipse</code>
mit Attributen erzeugt und in den Dokumentbaum
eingehängt.
</p>
<listing
src="DOMFinalExample.java"
line="49-60" />
<p>
In früheren DOM Spezifikationen wurden durch den
Standard weder lesende Operationen definiert, noch die
Möglichkeiten zum Schreiben der erstellen
Objektstrukturen. Die hierfür notwendigen Operationen
wurden in konkreten Implementierungen durch proprietären
Code umgesetzt.
<br />
Im vorliegenden Beispiel wurde mit einer früheren
Implementierung von SUNs JDK die dort vorgeschlagene
(umständliche) Verfahrensweise genutzt: zur Ausgabe ein
StreamResult-Objekt als Ergebnis der
Dokumenttransformation mittels XSLT zu erzeugen. Dies
funktioniert mit aktuellen JDK-Versionen nicht mehr.
</p>
<p>
Ein- und Ausgabe sind seit DOM Level 3 wesentlich
einfacher gestaltet:
<em>DOM Load and Save</em>
.
</p>
<listing src="DOMFinalExample.java" />
</slide>
<slide>
<title>Ausgabe mit DOM Level 3: Load and Save</title>
<p class="definition">
Die Spezifikation
<em>DOM Level 3: Load and Save</em>
definiert eine plattform- und
programmiersprachenunabhängige Schnittstelle zum Laden
und Speichern von XML-Dokumenten. Sie beinhaltet das
dynamische Laden eines Dokumentinhalts in ein DOM
Dokument und umgekehrt die Serialisierung eines DOM
Dokumentes in ein XML-Dokument. Softwareentwickler und
Autoren von Webskripten können hiermit XML-Inhalt sehr
komfortabel laden und speichern. Auch die Filterung des
Inhalts während des Ladens und Speicherns ist möglich.
</p>
</slide>
<slide>
<title>DOM Load and Save - die Schnittstellen</title>
<p>
Folgende Schnittstellen werden in
<em>DOM Load and Save</em>
definiert
</p>
<ul>
<li>
<code>DOMImplementationLS</code>
<br />
Die Schnittstelle entspeicht einer erweiterten
<code>DOMImplementation</code>
Schnittstelle und bringt Fabrikmethoden mit sich, um
die zum Laden und Speichern nötigen Objekte zu
erzeugen.
</li>
<li>
<code>LSParser</code>
<br />
Mit dieser Schnittstelle können Daten in DOM
Dokumente
<q>geparst</q>
werden.
</li>
<li>
<code>LSSerializer</code>
<br />
Dient der Serialisierung von DOM Dokumenten oder
Knoten.
</li>
<li>
<code>LSParserFilter</code>
<br />
Während des Parsing-Vorgangs können hiermit Knoten
untersucht und eventuell entfernt werden.
</li>
<li>
<code>LSSerializerFilter</code>
<br />
Analog zum Filtern während des Einlesens können
hiermit auch während der Serialisierung Filter auf
Knoten angewendet werden.
</li>
<li>
<code>LSInput</code>
<br />
Dient der Kapselung der Daten, die geladen werden
sollen.
</li>
<li>
<code>LSOutput</code>
<br />
Kapselt Information über die Ausgabe der Daten.
</li>
<li>
<code>LSResourceResolver</code>
<br />
Applikationen können hiermit Referenzen auf externe
Ressourcen während des Parsens auflösen.
</li>
</ul>
</slide>
<slide>
<title>DOM Load and Save - die Datentypen</title>
<p>
Folgende zu DOM Core zusätzlichen Datentypen werden in
Load and Save definiert:
</p>
<ul>
<li>
<code>LSInputStream</code>
<br />
Repräsentiert eine Folge von Eingabebytes, eine
Bytestream-Quelle eines XML-Eingabedokuments. In
Java mit
<code>java.io.InputStream</code>
abgebildet.
</li>
<li>
<code>LSOutputStream</code>
<br />
Repräsentiert eine Folge von Ausgabebytes, ein Ziel
für einen Ausgabe-Bytestream in XML. In Java mit
<code>java.io.OutputStream</code>
abgebildet.
</li>
<li>
<code>LSReader</code>
<br />
Steht für eine Folge von Eingabezeichen in 16-bit
Einheiten, in UTF-16 codiert. In Java mit
<code>java.io.Reader</code>
abgebildet.
</li>
<li>
<code>LSWriter</code>
<br />
Steht für eine Folge von Eingabezeichen in 16-bit
Einheiten, in UTF-16 codiert. In Java mit
<code>java.io.Writer</code>
abgebildet.
</li>
</ul>
</slide>
<slide>
<title>
DOM Load and Save - die grundlegenden Schnittstellen
</title>
<p>
Die im folgenden besprochenen grundlegenden
Schnittstellen müssen von zu DOM Load and Save konformen
Modulen unterstützt werden.
<br />
Sie sind mit der Methode
<code>hasFeature</code>
mit den Parametern
<q>LS</q>
(für
<em>Load and Save</em>
) und
<q>3.0</q>
(für
<em>DOM Level 3.0</em>
)abfragbar.
</p>
<listing src="DOMExample2.output" />
</slide>
<slide>
<title>DOM Load and Save - Fehlerbehandlung</title>
<p>
Während Lese- oder Schreibvorgängen können Fehler
auftreten, die dazu führen, daß die Verarbeitung nicht
fortgesetzt werden kann. In diesem Fall tritt ein Fehler
der Art
<code>LSException</code>
auf. Durch die Abfrage eines Integerwerts kann die Art
des Fehler noch näher bestimmt werden:
</p>
<ul>
<li>
<code>81 (PARSE_ERR)</code>
<br />
Trit auf, wenn beim Laden eines Dokuments oder
XML-Fragments ein Fehler aufgetreten ist und die
Verarbeitung nicht fortgesetzt werden kann.
</li>
<li>
<code>82 (SERIALIZE_ERR)</code>
<br />
Tritt auf, wenn während des Serialisierens eines
Knotens ein Fehler aufgetreten ist und die
Verarbeitung nicht fortgesetzt werden kann.
</li>
</ul>
</slide>
<slide>
<title>
DOM Load and Save - die Schnittstelle
<code>DOMImplementationLS</code>
</title>
<p>
<code>DOMImplementationLS</code>
enthält die Fabrikmethoden, um Parser, Serializer, sowie
Input- und Outputobjekte aus
<em>Load and Save</em>
zu erzeugen.
</p>
<listing src="DOMImplementationLS.txt" />
<p>
Eine Instanz dieser Schnittstelle kann durch Aufruf der
Methode
<code>DOMImplementation.getFeature("LS", "3.0")</code>
erhalten werden (sofern DOM Level 3 Core unterstützt
wird) , oder alternativ durch
<em>Casten</em>
einer
<code>DOMImplementation</code>
-Instanz.
</p>
<listing
src="DOMImplementationExample.java"
line="14-21" />
</slide>
<slide>
<title>
DOM Load and Save - Die Schnittstelle
<code>LSParser</code>
</title>
<p>
Die Schnittstelle bietet die Möglichkeit, aus
verschiedenen Eingabequellen einen DOM Baum zu
erstellen.
<br />
</p>
<p>
Asynchrone LSParser bieten die Möglichkeit, Event
Listener für Ereignisse zu registrieren. Sie
implementieren die Schnittstelle
<code>EventTarget</code>
.
<br />
Folgende Ereignisse sind unterstützt:
</p>
<ul>
<li>
<code>load</code>
<br />
Der Parser hat den Ladevorgang des Dokuments
abgeschlossen.
</li>
<li>
<code>progress</code>
<br />
Der Parser erzeugt Information über den Fortschritt
beim Verarbeiten der Daten. In welchen Abständen der
Parser über seinen Fortschritt informiert, und ob
dies überhaupt geschieht, ist von der
Implementierung des Parsers abhängig.
</li>
</ul>
</slide>
<slide>
<title>
DOM Load and Save - Die Schnittstelle
<code>LSParser - Attribute</code>
</title>
<listing
src="LSParser.txt"
line="1-5" />
<ul>
<li>
<code>domConfig</code>
<br />
Das DOMConfiguration Objekt, das während der
Verarbeitung einer Eingabequelle verwendet wird. Es
ist spezifisch für die jeweilige Verarbeitung und
unterscheidet sich von dem DOMConfiguration-Objekt
des Dokuments, das verarbeitet wird.
<br />
Mit DOMConfiguration-Objekten für LSParser können
spezifische Verhaltensweisen festgelegt werden, wie
etwa, ob der gültige Zeichensatz eines Dokuments aus
dem Dokument selbst entnommen wird oder aus dem
Protokoll, mit dem das Dokument übertragen wurde,
oder ob Namensräume verarbeitet werden sollen.
<br />
Für Details, siehe
<a
href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSParser">
Abschnitt LSParser in der DOM Spezifikation
</a>
.
</li>
<li>
<code>filter</code>
<br />
Mit einem Filter können beim Einlesen des Dokuments
bestimmte Elemente "ausgefiltert" werden. Der Filter
wird vom Parser berücksichtigt, während die
DOM-Baumstruktur erzeugt wird. Er wird aufgerufen,
nachdem allgemeine, von der DOMConfiguration
abhängige Operationen, wie z.B. die Validierung
eines Dokumentes, abgearbeitet wurden.
</li>
<li>
<code>async</code>
<br />
Zeigt an, ob es sich um einen asynchronen oder
synchronen LSParser handelt.
</li>
<li>
<code>busy</code>
<br />
Gibt einen Hinweis darauf, ob der Parser gerade
damit beschäftigt ist, ein Dokument zu laden.
</li>
</ul>
</slide>
<slide>
<title>
DOM Load and Save - Die Schnittstelle
<code>LSParser - Operationen</code>
</title>
<listing
src="LSParser.txt"
line="7-18" />
<ul>
<li>
<code>parse</code>
<br />
Verarbeitet ein XML-Dokument über eine mit
<code>LSInput</code>
identifizierte Ressource. Gibt das erstellte
<code>Document</code>
zurück.
</li>
<li>
<code>parseURI</code>
<br />
Verarbeitet ein XML-Dokument, das an einer durch
eine URI identifizierte Ressource verfügbar ist.
</li>
<li>
<code>abort</code>
<br />
Bricht die Verarbeitung des aktuellen Dokuments ab.
Wenn der LSParser gerade nicht beschäftigt ist, hat
der Aufruf dieser Methode keinerlei Auswirkungen.
</li>
<li>
<code>parseWithContext</code>
<br />
Verarbeitet ein XML Fragment, das durch
<code>LSInput</code>
identifiziert wird. Der Inhalt wird in ein
existierendes Dokument eingefügt, und zwar an der
Position, die durch das Attribute
<code>context</code>
festgelegt wird. Die Art der Verarbeitung wird durch
<code>action</code>
(
<code>
ACTION_APPEND_AS_CHILDREN,
ACTION_REPLACE_CHILDREN, ACTION_INSERT_BEFORE,
ACTION_INSERT_AFTER, ACTION_REPLACE
</code>
) spezifiziert.
</li>
</ul>
</slide>
<slide>
<title>
DOM Load and Save - Beispiel: Datei per URI einlesen
</title>
<p>
Zunächst muß mit Hilfe der Methode
<code>DOMImplementationLS.createLSParser()</code>
eine Instanz eines LSParsers erzeugt werden.
</p>
<listing
src="DOMImplementationExample.java"
line="23-24" />
<p>
Mit der Methode
<code>parseURI</code>
kann ein Dokument eingelesen werden, z.B. auch eine
durch Kommandozeile übergebene Datei.
</p>
<listing
src="DOMImplementationExample.java"
line="25-26" />
</slide>
<slide>
<title>
DOM Load and Save - Die Schnittstelle
<code>LSInput</code>
</title>
<p>
Die andere Alternative, ein Dokument einzulesen, ist
über die Schnittstelle
<code>LSInput</code>
. Sie repräsentiert eine Eingabequelle für Daten.
</p>
<p>
Die Schnittstelle kapselt Information über die
Informationsquelle, z.B. einen Public Identifier, einen
System Identifier, einen Basis-URI, einen ByteStream
und/oder einen CharacterStream.
</p>
<p>
Die Schnittstelle kann erzeugt werden, indem die
Fabrikmethode
<code>createLSInput()</code>
auf die Schnittstelle
<code>DOMImplementationLS</code>
angewendet wird.
</p>
<p>
Mit
<code>LSInput</code>
ist ein Parser in der Lage, verschiedene Eingabequellen
komfortabel einzulesen. Die Engabequellen können durch
entsprechende
<code>set</code>
- Methoden auf der Schnittstelle angegeben werden. Sie
werden in der angegebenen Reihenfolge ausgewertet:
</p>
<listing src="LSInput.txt" />
<ul>
<li>
<code>characterStream</code>
<br />
(Methode
<code>
setCharacterStream(Reader characterStream)
</code>
)
</li>
<li>
<code>byteStream</code>
<br />
(Methode
<code>setByteStream(InputStream byteStream)</code>
)
</li>
<li>
<code>stringData</code>
<br />
(Methode
<code>setStringData(String stringData)</code>
)
</li>
<li>
<code>systemId</code>
<br />
(Methode
<code>setSystemId(String systemId)</code>
)
</li>
<li>
<code>publicId</code>
<br />
(Methode
<code>setPublicId(String publicId)</code>
)
</li>
</ul>
<p>
Mit der Methode
<code>parse(LSInput input)</code>
wird schlußendlich die Eingabe durch den Parser
verarbeitet.
</p>
<listing
src="DOMImplementationExample.java"
line="28-32" />
</slide>
<slide>
<title>
DOM Load and Save - Die Schnittstelle
<code>LSSerializer</code>
</title>
<p>
Der
<code>LSSerializer</code>
dient der Serialisierung (dem Schreiben) eines DOM
Knotens, typischerweise eines ganzen Dokuments, nach
XML. Die XML Daten werden dabei entweder in einen String
oder in einen OutputStream geschrieben. Während der
Serialisierung werden Namensräume insofern "korrigiert",
daß der leere Namensraum (der prinzipiell in
XML-Dokumenten vorkommen darf) nicht ausgegeben wird
sowie Namensräume nach einem spezifizierten Algorithmus
auf ihre Konsistenz geprüft und bei Bedarf korrigiert
werden (vgl. Appendix B.1, "Namespace normalization",
aus [DOM Level 3 Core]).
</p>
<p>
Das (konfigurierbare) Standardverhalten eines
LSSerializers beinhaltet, daß für Dokumentknoten der
XML-Prolog sowie das gesamte Dokument ausgegeben wird.
<br />
Für Dokumentteilbäume (Knotentyp
<code>DocumentFragment</code>
) werden alle Kindknoten in der Reihenfolge ihres
Auftretens ausgegeben.
<br />
Alle anderen Knotentypen werden in ihrer entsprechenden
XML-Repräsentation ausgegeben.
</p>
<listing src="LSSerializer.txt" />
<p>
Hinweis: Die Serialisierung von Knoten erzeugt nicht
immer wohlgeformtes XML!
</p>
<p>
Im nachfolgenden Beispiel werden zwei Serializer für
zwei Dokumente erzeugt. Dabei wird jeweils der
Dokumentknoten mit Hilfe der Methode
<code>writeToString</code>
serialisiert. Das erste Dokument wird mit
<code>System.out.println</code>
direkt auf die Standardausgabe ausgegeben. Das zweite
Dokument wird zunächst in der Variable
<code>outStr</code>
vom Typ
<code>String</code>
gespeichert.
</p>
<listing
src="DOMImplementationExample.java"
line="34-40" />
</slide>
<slide>
<title>
DOM Load and Save - Die Schnittstelle
<code>LSOutput</code>
</title>
<p>
<code>LSOutput</code>
repräsentiert (und kapselt) ein Ausgabeziel für Daten,
z.B. eine URI, einen ByteStream, eine Basis-URI und/oder
einen CharacterStream.
</p>
<p>
Die Schnittstelle kann erzeugt werden, indem die
Fabrikmethode
<code>createLSOutput()</code>
auf die Schnittstelle
<code>DOMImplementationLS</code>
angewendet wird.
</p>
<p>
Mit
<code>LSOutput</code>
ist ein Parser in der Lage, verschiedene Ausgabequellen
komfortabel zu verwenden. Die Ausgabequellen können
durch entsprechende
<code>set</code>
- Methoden auf der Schnittstelle angegeben werden. Sie
werden in der angegebenen Reihenfolge ausgewertet:
</p>
<ul>
<li>
<code>characterStream</code>
<br />
(Methode
<code>
setCharacterStream(Writer characterStream)
</code>
)
</li>
<li>
<code>byteStream</code>
<br />
(Methode
<code>setByteStream(OutputStream byteStream)</code>
)
</li>
<li>
<code>systemId</code>
<br />
(Methode
<code>setSystemId(String systemId)</code>
)
</li>
</ul>
<p>
Im nachfolgenden Codeauszug werden Daten in eine Datei
ausgegeben. Dazu wird ein
<code>FileOutputStream</code>
erzeugt und dieser durch
<code>setByteStream</code>
mit LSOutput verbunden.
</p>
<listing
src="DOMImplementationExample.java"
line="42-46" />
</slide>
<slide>
<title>DOM Load and Save - Das komplette Beispiel</title>
<p>
Im nachfolgenden Beispiel ist die Verwendung aller
Schnittstellen aus DOM Load and Save demonstriert.
</p>
<listing src="DOMImplementationExample.java" />
<p>Ein Aufruf des Beispiels ...</p>
<listing src="DOMImplementationExample.bat" />
<p>
... ergibt folgendes Ausgabe auf
<code>stdout</code>
:
</p>
<listing src="DOMImplementationExample.output" />
<p>
Zusätzlich wird die Datei
<code>DOMImplementationExampleOutput.xml</code>
erzeugt und mit dem Inhalt der zweiten eingelesenen
Datei befüllt.
</p>
</slide>
<slide>
<title>DOM Load and Save - Abschließendes Beispiel</title>
<p>
Das nach DOM LS einführende Beispiel (im Hauptspeicher
erzeugtes Dokument) soll hier nochmals aufgeführt und
mit DOM LS ausgegeben werden.
</p>
<listing src="DOMFinalExample_LS.java" />
<p>
Die Ausgabe erfolgt zunächst nach
<code>stdout</code>
sowie in eine Datei.
</p>
<listing src="DOMFinalExample_LS_Output.xml" />
</slide>
</presentation>
<!-- Ende DOM -->
<presentation id="uebungsaufgabenDOM">
<title short="uebungsaufgabenDOM">
Übungsaufgaben zum Thema DOM.
</title>
<date>2008-12-01</date>
<toc id="resources" />
<toc id="abstract">Übungsaufgaben zum Thema DOM.</toc>
<part>
<title>Übungsaufgaben zu DOM</title>
<slide>
<title>Übungsaufgabe zu DOM</title>
<p>
Aufbauend auf die zu SAX ausgearbeitete
Übungsaufgabe soll hier ebenfalls die ebay Shopping
API ausgewertet und als HTML-Datei dargestellt
werden. Einziger Unterschied ist die zu verwendende
API.
</p>
<p>
Lesen Sie mit Hilfe der DOM API die HTML-Datei, die
Sie sich bereits als Rohgerüst überlegt haben, ein.
Befüllen Sie den so erstellten Dokumentbaum dann mit
den Ergebnissen der ebay Shopping API.
</p>
<p>
Das so erhaltene DOM Dokument soll mit Hilfe der DOM
Load and Save-API in eine (HTML-)Ausgabedatei
serialisiert werden.
</p>
</slide>
</part>
</presentation>
<!-- Ende Übungen zu DOM -->
<!-- XML Pull Parser -->
<presentation id="XMLPP">
<title short="XMLPP">XML Pull Parser</title>
<date>2008-12-01</date>
<toc id="resources">
<a href="http://www.xmlpull.org/">
Webseite der XML Pull API
</a>
und
<a href="http://www.extreme.indiana.edu/xgws/xsoap/xpp/">
Webseite der Implementierung XPP3
</a>
</toc>
<toc id="abstract">
In letzter Zeit hat sich ein weiterer Ansatz zur lesenden
Verarbeitung von XML-Dokumenten durch Programmiersprachen
etabliert: die sogenannten
<em>extrahierenden Parser</em>
(engl. pull parser). Ihr Verarbeitungsmodell wurde gezielt
im Kontrast zu den bisher vorgestellten Mechanismen
entwickelt.
<br />
SAX und DOM verarbeiten XML-Eingaben, ohne dabei dem
Anwender den Eingriff in den Fluß der Verarbeitung zu
gestatten. Der Kontrollfluß wird nicht durch den Code im
Programm definiert, sondern wird zur Ausführungszeit durch
die Struktur des verarbeiteten XML-Dokuments bestimmt. Bei
SAX spiegelt sich dies in der Reihenfolge der durch den
Parser aufgerufenen Call-back-Routinen wieder, bei DOM sind
im Verlauf der Baumkonstruktion durch einen Parsers
keinerlei Eingriffsmöglichkeiten für den Programmierer
vorgesehen.
<br />
Extrahierende Parser kehren dies Paradigma um. Sie
definieren eine Schnittstelle um innerhalb des
Programmflusses aktiv Inhalte eines XML-Dokumentes zu
extrahieren. Allerdings erfolgt der Zugriff nicht wahlfrei
(wie es beispielsweise bei Abfragen mit XPath der Fall ist),
sondern konsekutiv entlang der Reihenfolge der einzelnen
Primitive im XML-Dokument. Dieses Verhalten ist daher
weniger mit einer Anfrage, als eher mit dem Vorrücken eines
Dateizeigers bei linearer Konsumption vergleichbar.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract" />
</p>
</slide>
<slide>
<title>Definition extrahierender Parser</title>
<p class="definition">
Ein extrahierender Parser gestattet dem Programmierer
die konsekutive lesende Verarbeitung der einzelnen
Primitive eines XML-Dokuments gemäß der Dokumentordnung.
</p>
</slide>
<slide>
<title>extrahierende Parser: Implementierungen</title>
<p>
Gegenwärtig sind Pull-Parser für die Java-Sprachwelt
verfügbar. Es liegt auch eine Implementierung als
Bestandteil des Microsoft .NET-Frameworks vor. Jedoch
konnte sich für diese Art der Verarbeitung noch kein
allgemein anerkanntes und unterstütztes API
herausbilden.
</p>
<p>
Lediglich die
<em>Common API for XML Pull Parsing (XPP)</em>
konnte im Java-Umfeld einige Bedeutung erlangen und ist
verfügbar. Dieser Schnittstellenvorschlag bildet auch
die Grundlage eines Standardisierungsansatzes (JSR 173)
im Rahmen des Java Community Processes: Die
<em>Streaming API for XML (StAX)</em>
.
<br />
Das vorliegende Kapitel stützt sich auf eine
Implementierung dieser API die unter dem Namen XPP3/MXP1
<a
href="http://www.extreme.indiana.edu/xgws/xsoap/xpp/">
kostenfrei verfügbar
</a>
ist.
</p>
</slide>
<slide>
<title>XPP API - Die grundlegenden Schnittstellen</title>
<p>
Das XPP-API definiert zur Verwaltung mindestens die
folgenden Schnittstellen:
</p>
<ul>
<li>
<code>XmlPullParserFactory</code>
: Fabrikklasse zur Erzeugung eines Parsers
</li>
<li>
<code>XmlPullParser</code>
: Abstrakte Klasse, die den tatsächlichen Parser
repräsentiert. Alle konkret instantiierbaren Parser
erben von dieser Klasse
</li>
<li>
<code>XmlPullException</code>
: Generische Ausnahmeklasse zur Signalisierung
verschiedenster Fehler
</li>
</ul>
<p>
Bereits diese Übersicht zeigt als einen ersten
wesentlichen Unterschied zu den klassischen
Parserschnittstellen: Bei der XPP-API wurde Wert auf die
Standardisierung der Infrastruktur zur Erzeugung des
Parsers sowie die Darstellung auftretender Fehler
gelegt.
</p>
</slide>
<slide>
<title>XPP API - Schnittstellen</title>
<p>
Zur Extraktion der Inhalte eines XML-Dokuments sieht die
XPP-Schnittstelle folgende durch Instanzen der Klasse
XmlPullParser umgesetzte Methoden vor:
</p>
<ul>
<li>
<code>getEventType</code>
: liefert Aufschluß darüber welche XML-Primitive
(START_TAG, END_TAG, CONTENT ...) extrahiert wurde
</li>
<li>
<code>getLocalName</code>
: liefert für Ereignisse des Typs START_TAG und
END_TAG den lokalen Namen des extrahierten Elements
</li>
<li>
<code>getNamespaceUri</code>
: liefert die URI des Namensraumes dem das
extrahierte Element zugeordnet ist
</li>
<li>
<code>getPrefix</code>
: liefert -- sofern vorhanden -- das
Namensraum-Präfix des extrahierten Elements
</li>
<li>
<code>readContent</code>
: liefert den textuellen Inhalt des extrahierten
Elements
</li>
<li>
<code>getAttributeCount</code>
: liefert für Ereignisse des Typs START_TAG die
Anzahl der für das extrahierte Element definierten
Attribute
</li>
<li>
<code>getAttributeLocalName(int i)</code>
: liefert den lokalen Namen des i-ten Attributs für
Ereignisse des Typs START_TAG
</li>
<li>
<code>getAttributeNamespaceUri(int i)</code>
: liefert die URI des Namensraumes dem das i-te
Attribut zugeordnet ist
</li>
<li>
<code>getAttributePrefix(int i)</code>
: liefert -- sofern vorhanden -- das
Namensraum-Präfix des i-ten Attributs
</li>
<li>
<code>getAttributeType(int i)</code>
: liefert -- sofern durch Zugriff auf eine DTD oder
ein XML-Schema möglich -- den Datentyp des i-ten
Attributs
</li>
<li>
<code>getAttributeValue(int i)</code>
: liefert den Wert des i-ten Attributs
</li>
<li>
<code>
getAttributeValue(String namespace, String
localName)
</code>
: liefert den Wert des durch Namen und Namensraum
bezeichneten Attributs
</li>
</ul>
</slide>
<slide>
<title>XPP API - ein erstes Beispiel</title>
<p>
Der Code des hier vorgestellten Beispiels zeigt die
Nutzung der XPP-API.
<br />
Zuerst wird eine Parser-Fabrik erzeugt, mit der wiederum
später der tatsächlichen Parsers erzeugt wird.
</p>
<listing
src="XPPsimple.java"
line="11" />
<p>
Diese wird durch Aufruf der Methode
<code>setNamespaceAware</code>
dahingehend parametrisiert, daß die von ihr zur
Verfügung gestellten Parser in einem Modus konform zur
Namensraumspezifikation arbeiten.
</p>
<listing
src="XPPsimple.java"
line="12" />
<p>
Anschließend wird von der Fabrik eine neue Parserinstanz
angefordert deren Eingabekanal auf die als
Kommandozeilenparameter übergebene Datei gelenkt wird.
</p>
<listing
src="XPPsimple.java"
line="13-14" />
<p>
Die Extraktion der einzelnen Bestandteile des
Eingabedokuments vollzieht sich in der Schleife ab Zeile
17. Dort wird, solange nicht das Ereignis
<code>END_DOCUMENT</code>
gelesen wurde, mittels Aufruf der Methode
<code>next</code>
ein weiteres Ereignis aus dem XML-Eingabestrom
angefordert.
<br />
Nach Feststellung des Ereignistyps (Zeilen 18 und 20)
kann eine Verarbeitung der mit dem Ereignis verknüpften
XML-Primitive erfolgen.
</p>
<listing
src="XPPsimple.java"
line="17-22" />
<p>Das gesamte Codebeispiel:</p>
<listing src="XPPsimple.java" />
</slide>
<slide>
<title>XMLPP - unterstützte Ereignistypen</title>
<p>
Einschließlich der im vorherigen Beispiel verwendeten
Ereignistypen unterstützen XPP-konforme Parser folgende
Ereignistypen:
</p>
<ul>
<li>
<code>START_DOCUMENT</code>
: Beginn eines Dokuments bevor XML-Anteile durch den
Parser verarbeitet wurden. Dieses Ereignis wird
nicht durch alle Implementierungen zur Verfügung
gestellt, da es implizit für den gesamten
programmiersprachlichen Quellcode vor dem ersten
Aufruf des XPP-Parsers gilt.
</li>
<li>
<code>CDSECT</code>
: Markiert das Auftreten einer CDATA-Sektion
innerhalb des XML-Dokumentes.
</li>
<li>
<code>COMMENT</code>
: Markiert das Auftreten eines XML-Kommentars
innerhalb des Eingabedokumentes.
</li>
<li>
<code>START_TAG</code>
: Markiert durch Extraktion des Start-Tags den
Beginn eines Elements.
</li>
<li>
<code>END_TAG</code>
: Markiert durch Extraktion des End-Tags den
Abschluß eines Elements. Für leere Elemente wird
dieses Ereignis, unabhängig von der möglicherweise
genutzten Minimierungssyntax, direkt nach dem
zugehörigen START_TAG-Ereignis extrahiert.
</li>
<li>
<code>ENTITY_REF</code>
: Markiert das Auftreten einer Entitätsreferenz.
</li>
<li>
<code>IGNORABLE_WHITESPACE</code>
: Markiert das Auftreten von Leerraumsymbolen, die
durch den Parser ohne Informationsverlust überlesen
werden können.
</li>
<li>
<code>PROCESSING_INSTRUCTION</code>
: Markiert das Auftreten einer Processing
Instruction.
</li>
<li>
<code>TEXT</code>
: Markiert das Auftreten freien Textes als
Elementinhalt.
</li>
<li>
<code>END_DOCUMENT</code>
: Markiert das Ende des Dokuments. Nach diesem
Ereignis können keine Weiteren extrahiert werden.
</li>
</ul>
</slide>
<slide>
<title>
XMLPP - zweites Beispiel: Zählen der einzelnen
XML-Primitive
</title>
<p>
In diesem Beispiel sollen die Auftreten der einzelnen
XML-Primitive auf der Basis eines extrahierenden Parsers
gezählt werden. Damit entspricht das Programm einer
Re-Implementierung des im Kapitel SAX vorgestellten
Beispiels mit der gleichen Funktionalität.
</p>
<listing src="XPPsample3.java" />
<p>
Insbesondere im Vergleich zum ereignisbasierten Lesen
unter Nutzung der SAX-Schnittstelle fällt die veränderte
Umsetzung auf.
<br />
So muß der Gesamtablauf nun nicht mehr in verschiedene
Methoden aufgespalten werden, die durch den Parser
aufgerufen werden, sondern kann innerhalb einer Methode
realisiert werden.
<br />
Aus diesem Grunde kann auch die konzeptionell
suboptimale Verwendung globaler Variablen unterbleiben.
<br />
Im Code fällt die Initialisierung der Zählvariable
<code>startDocument</code>
mit
<code>1</code>
auf (Zeile 15). Diese wird notwendig, da die verwendete
Parserimplementierung keine Extraktion von
<code>START_DOCUMENT</code>
leistet. Dieses Ereignis liegt immer implizit vor dem
Start des Extraktionsvorganges an.
</p>
</slide>
<slide>
<title>XPP Beispiel 3: Elementhäufigkeit zählen</title>
<p>
Auch dieses Beispiel entspricht funktional einem
Beispiel des SAX-Kapitels, es zählt die
Auftretenshäufigkeit der Elemente in einem XML-Dokument.
Jedoch unterstreicht es -- insbesondere im Vergleich zum
SAX-basierten Beispiel -- die Natur der
XPP-Schnittstelle. Im vorliegenden Fall werden durch den
Parser keine Methodenaufrufe durchgeführt. Die
Extraktion und Verarbeitung der einzelnen Elemente des
betrachteten XML-Dokuments liegt ausschließlich in der
Verantwortung des Programmierers.
</p>
<listing src="XPPsample2.java" />
</slide>
<slide>
<title>XPP - Fehlerbehandlung</title>
<p>
Ausgehend von den vorstehend beschriebenen Ereignistypen
läßt sich leicht eine Prüfung auf Wohlgeformtheit
realisieren. Üblicherweise wird dies von allen
verfügbaren XPP-Implementierungen durchgeführt.
Allerdings können Verletzungen der grundlegenden
XML-Strukturierungsregeln auch bei diesem Parsingmodell,
wie auch für SAX, nicht während eines nach außen
abgeschlossenen Aufrufs erkannt werden. Stattdessen
werden diese erst im Verlaufe des Extraktionsvorganges
offenbar.
</p>
<listing src="XPPsample4.java" />
<p>
Führt man den Code des Beispiels mit einem nicht
wohlgeformten Dokument als Eingabedokument aus, so
erzeugt der Parser folgende Ausnahme:
</p>
<listing src="XPPsample4.out" />
</slide>
</presentation>
<!-- Ende XML Pull Parser -->
<!-- XPath -->
<presentation id="xpath">
<title short="xPath">Die Lokatorsprache XPath</title>
<date>2007-12-10</date>
<toc id="resources">
<a href="http://www.w3.org/Style/XSL/">
W3C Webseite zu XSL
</a>
,
<a href="http://www.w3.org/TR/xpath20/">
XPath Spezifikation
</a>
</toc>
<toc id="abstract">
XML strukturiert Daten in einigen wenigen Konstrukten,
hauptsächlich in Elementen und Attributen. Die Sprache
<em>XML Path Language (XPath)</em>
definiert eine Möglichkeit, wie Teile von XML-Dokumenten für
die weitere Verarbeitung selektiert werden können. XPath
wird hauptsächlich von XSL Transformations (XSLT) verwendet,
aber auch von anderen XML-Sprachen wie etwa XML Schema.
XPath ist eine sehr kompakte Sprache mit einer Syntax, die
Pfadausdrücke widerspiegelt, wie sie aus Dateisystemen wohl
bekannnt sind. Diese Pfadausdrücke sind jedoch generalisiert
und damit sehr viel mächtiger als die vergleichsweise
einfachen Pfadausdrücke für Dateisysteme. Aufgrund ihrer
Verwendung in vielen verschiedenen XML-Sprachen ist XPath
eine der wichtigsten XML Sprachkomponenten.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract"></toc>
</p>
</slide>
<part>
<title>XPath</title>
<slide>
<title>Übersicht</title>
<ul>
<li>
Zur Extraktion beliebiger Teile eines
wohl-geformten XML-Dokuments verabschiedete das
W3C 1999 die Sprache XPath.
</li>
<li>
Sie bildet eine pfadorientierte Lokatorsprache
und erlaubt damit das Auffinden von
Dokumentteilen (einzelnen Elementen, Attributen,
etc.) durch Pfadausdrücke, die sich an der
Struktur des XML-Dokuments orientieren.
</li>
<li>
XPath wurde in erster Linie für die Nutzung in
Kombination mit der Transformationssprache XSLT
und den erweiterten Verweisen der Sprache
XPointer konzipiert.
</li>
<li>
Die Sprache ist ausschließlich für den lesenden
Zugriff auf XML-Dokumente ausgelegt.
</li>
<li>
XPath unterscheidet XML-üblich zwischen Groß-
und Kleinschreibung. Daher sind Element- und
Attributnamen unbedingt in der im Dokument
gewählten Schreibweise anzugeben.
</li>
</ul>
</slide>
<slide>
<title>Lokalisierungspfade</title>
<ul>
<li>
Mit Lokalisierungspfaden wird eine Menge von
Informationsknoten in einem Dokument abstrakt
beschrieben.
</li>
<li>
Einfachster Lokalisierungspfad ist der Pfad zur
Lokalisierung des Wurzelknotens, ausgedrückt
durch
<q>
<code>/</code>
</q>
. Er liefert für jedes XML-Dokument den
Wurzelknoten.
<br />
<em>Achtung!</em>
: Der Wurzelknoten ist nicht das Wurzelelement
eines XML-Dokuments, sondern entspricht dem
Document Information Item des Information Sets.
Das Wurzelelement als erstes benanntes Element
des Dokuments wird durch ein Element Information
Item dargestellt.
</li>
<li>
Die Navigation zu den einzelnen Elementknoten,
oder Knotenmengen, wird durch einen Pfadausdruck
realisiert.
</li>
<li>
Die
<em>explizite Navigation</em>
erlaubt die Angabe aller zu traversierenden
Knoten bis hin zu den zu extrahierenden. Hierzu
werden die Knoten, von der Wurzel absteigend
durch
<q>
<code>/</code>
</q>
-Symbole separiert, notiert. Der XPath-Ausdruck
von links nach rechts gelesen spiegelt auch die
Schritte -- ausgehend vom Wurzelelement des
Dokuments -- zur Lokalisierung der gesuchten
Knotenmenge wieder.
</li>
</ul>
</slide>
<slide>
<title>Ein erstes Beispiel</title>
<p>
Grundlage für das erste Beispiel zu XPath ist eine
erweiterte Version der Projektverwaltung.
</p>
<listing src="erweiterte_projektverwaltung.xml"></listing>
<ul>
<li>
Das folgende Beispiel zeigt eine solche
Pfaddefinition am Beispiel der
Projektverwaltung. Er werden alle
<code>Vorname</code>
n selektiert, die als Kindelemente von
<code>Person</code>
in
<code>ProjektVerwaltung</code>
vorkommen.
</li>
<li>Der XPath Ausdruck</li>
<listing
src="xpath-beispiel-1.xml"
line="2">
</listing>
<li>
liefert folgendes Ergebnis
<listing
src="xpath-beispiel-1.xml"
line="3-6">
</listing>
<em>Anmerkung</em>
: Das Resultat ist in XML-Notation dargestellt,
obwohl genaugenommen eine Knotenmenge des
Information Sets als Resultat zurückgeliefert
wird. Die gewählte XML-Darstellung ist hierbei
nur eine der möglichen Varianten zur
Ergebnispräsentation.
</li>
<li>
Die Einzelknoten werden entsprechend ihrer
Auftrittsreihenfolge im Quelldokument (sog.
<em>document order</em>
) zurückgegeben.
</li>
</ul>
</slide>
<slide>
<title>Freie Lokalisierungsschritte (1/2)</title>
<ul>
<li>
Die expliziten Pfadausdrücke lassen sich in
beliebiger Länge fortsetzen, jedoch zeigen sie
fundamentale Schwächen in Puncto Flexibilität.
</li>
<li>
Wie im Beispiel der XHTML-Verwendung innerhalb
eines eigenen XML-Dokuments gesehen, kann
Information desselben Typs (d.h. umschlossen
durch denselben Tag) verschiedene Elternknoten
besitzen.
</li>
<li>
So auch in unserem Beispiel, dort ist die
<code>Qualifikation</code>
auf derselben Baumstufe sowohl unterhalb des
Elternelements
<code>em</code>
als auch
<code>u</code>
anzutreffen.
</li>
<li>
Als Lösung erlaubt XPath die Nutzung von
Platzhaltern statt der expliziten Elementnamen
innerhalb eines Lokalisierungsschrittes. So
entstehen freie Lokalisierungsschritte, die alle
Kindknoten einer im direkt vorhergehenden
Lokalisierungsschritt selektierten Knotenmenge
adressieren.
</li>
<li>
Der nachfolgende XPath-Ausdruck zeigt dies am
Beispiel des Qualifikationsprofils. Der XPath
Ausdruck
</li>
<listing
src="xpath-beispiel-2.xml"
line="2">
</listing>
<li>liefert folgendes Ergebnis</li>
<listing
src="xpath-beispiel-2.xml"
line="3-4">
</listing>
<li>
Der Pfadausdruck liefert die beiden Kindelemente
<code>Qualifikation</code>
-- unabhängig von der Benennung des
Elternknotens -- die direkt unterhalb des
Knotens
<code>Qualifikationsprofil</code>
angeordnet sind.
</li>
</ul>
</slide>
<slide>
<title>Freie Lokalisierungsschritte (2/2)</title>
<ul>
<li>
Die Ausgabe des letzten Beispiels enthält nicht
alle Knoten des Typs
<code>Qualifikation</code>
. Der gegebene Pfadausdruck gestattet lediglich
das Überspringen
<em>einer</em>
Hierarchieebene. Daher wird der hierarchisch
tieferstehende Qualifikations-Knoten mit Inhalt
Entwickler nicht lokalisiert.
</li>
<li>
Die (zunächst naheliegende) Lösung den
Pfadausdruck zu
<code>
/ProjektVerwaltung/Person/Qualifikationsprofil/*/*/Qualifikation
</code>
zu erweitern, liefert jedoch auch nicht das
gewünschte Resultat aller
<code>Qualifikation</code>
s-Knoten, sondern ausschließlich den zuvor nicht
lokalisierbaren, da der neue Ausdruck nun
zwingend
<em>zwei</em>
freie Lokalisierungsschritte vorsieht.
</li>
<li>
Zur Variierung der Tiefe der freien Schritte
sieht XPath die Schreibweise
<q>
<code>//</code>
</q>
vor. Sie erlaubt die Lokalisierung der
Kindknoten auf einer beliebigen Hierarchiestufe.
</li>
<li>
Das Beispiel zeigt die korrekte
XPath-Formulierung zur Lokation aller
Qualifikations-Knoten:
</li>
<listing
src="xpath-beispiel-3.xml"
line="2">
</listing>
<li>liefert folgendes Ergebnis</li>
<listing
src="xpath-beispiel-3.xml"
line="3-5">
</listing>
</ul>
</slide>
<slide>
<title>Definition Lokalisierungsschritt</title>
<p class="definition">
Ein
<em>Lokalisierungsschritt</em>
setzt sich aus dem Namen der
<code>Achse</code>
gefolgt von zwei Doppelpunkten und einem
<em>Knotentest</em>
, optional ergänzt um ein auszuwertendes
<em>Prädikat</em>
, zusammen.
<br />
Wird keine Achse spezifiziert, so gilt vorgabegemäß
die Achse
<code>child</code>
.
<br />
Ein Knotentest ist syntaktisch ein
<code>QName</code>
, der genau dann erfüllt ist, wenn der Knotenname
mit dem Namen des Knotentests übereinstimmt.
<br />
Das
<em>Prädikat</em>
filtert die Ergebnismenge hinsichtlich verschiedener
Charakteristika wie Existenz von Kindknoten oder
Attributen, Position in der Ergebnismenge, etc.
</p>
</slide>
<slide>
<title>Achsen in XPath (1/2)</title>
<ul>
<li>
XPath bietet das Konzept sog.
<em>Achsen</em>
an, um relativ zum aktuellen Knoten beliebige
Teilbäume zu lokalisieren. Im folgenden werden
die einzelnen durch Achsen zugänglichen
Knotenmengen anhand eines
<a href="xpathEx.xml">Beispieldokuments</a>
gezeigt.
</li>
<li>
Für die weitere Betrachtung sei
<em>Knoten 8</em>
der aktuelle Knoten, an dem wir uns befinden.
</li>
</ul>
<img
src="xppartition.gif"
style="margin : 4%">
</img>
<ul>
<li>
Ein XML-Dokument wird grob in die fünf Achsen
<code>ancestor</code>
,
<code>descendant</code>
,
<code>following</code>
,
<code>preceding</code>
und
<code>self</code>
partitioniert (unter Auslassung der Attribut-
und Namensraumknoten). Diese Knotenmengen
überschneiden sich nicht und enthalten alle
Elementknoten des Dokuments.
</li>
</ul>
</slide>
<slide>
<title>Achsen in XPath (2/2)</title>
<p>
Für die einzelnen Achsen existieren darüber hinaus
auch noch Feineinstufungen.
<br />
Die folgende Tabelle listet alle durch die
Verwendung von Achsen zugänglichen Knotenmengen
relativ zum aktuellen Knoten (Knoten 8). In der
letzten Spalte ist die Knotenmenge jeweils graphisch
dargestellt. der aktuelle Knoten ist jeweils rot
markiert.
</p>
<table
border="1"
width="90%">
<thead>
<tr>
<th
style="font-size : small ; line-height : 120%;">
Achse
</th>
<th
style="font-size : small ; line-height : 120%;">
Semantik
</th>
<th
style="font-size : small ; line-height : 120%;">
Im Beispiel selektierte Knoten
</th>
<th
style="font-size : small ; line-height : 120%;">
Graphik
</th>
</tr>
</thead>
<tbody>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>self</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert den aktuellen Knoten. Als
abkürzende Schreibweise kann der Punkt
<q>
<code>.</code>
</q>
verwendet werden.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/self::node8
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{8}</code>
</td>
<td>
<img
src="xpself.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>child</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert die (direkten) Kindknoten
des aktuellen Knotens.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>/node1/node3/node8/child::*</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{12, 13, 14}</code>
</td>
<td>
<img
src="xpchild.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>descendant</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert transitiv alle Kindknoten
des aktuellen Knotens, außer Attribut-
und Namensraumknoten.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/descendant::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{12, 13, 14, 15, 16}</code>
</td>
<td>
<img
src="xpdescendant.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>descendant-or-self</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert transitiv alle Kindknoten
des aktuellen Knotens (außer Attribut-
und Namensraumknoten), sowie den Knoten
selbst.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/descendant-or-self::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{8, 12, 13, 14, 15, 16}</code>
</td>
<td>
<img
src="xpdescendantself.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>parent</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert den Elternknoten des
aktuellen Knotes, falls existent.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/parent::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{3}</code>
</td>
<td>
<img
src="xpparent.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>ancestor</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert transitiv alle Elternknoten
des aktuellen Knotes.
<br />
Die
<code>ancestor</code>
-Achse enthält daher immer den
Wurzelknoten, außer der aktuelle Knoten
ist es selbst; in diesem Falle liefert
die Achse die leere Menge.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/ancestor::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{1, 3}</code>
</td>
<td>
<img
src="xpancestor.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>ancestor-or-self</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert transitiv alle Elternknoten
des aktuellen Knotes, sowie den
aktuellen Knoten.
<br />
Diese Achse enthält immer den
Wurzelknoten des Dokuments.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/ancestor-or-self::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{1, 3, 8}</code>
</td>
<td>
<img
src="xpancestorself.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>preceding</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert alle dem aktuellen Knoten
vorausgehenden Knoten, ohne seine
Vorfahren sowie Attribut- und
Namensraumknoten.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/preceding::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{2, 5, 6, 7}</code>
</td>
<td>
<img
src="xppreceding.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>preceding-sibling</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert die im Dokument vor dem
aktuellen Knoten auftretenden
Geschwisterknoten.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/preceding-sibling::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{7}</code>
</td>
<td>
<img
src="xpprecedingsibling.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>following</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert alle dem aktuellen Knoten
nachfolgenden Knoten ohne dessen Kind-,
Attribut und Namensraumknoten.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/following::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{9, 4, 10, 11}</code>
</td>
<td>
<img
src="xpfollowing.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>following-sibling</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert alle nachfolgenden
„Geschwister“ des aktuellen Knotens,
d.h. Knoten auf derselben
Hierarchieebene.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/following-sibling::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{9}</code>
</td>
<td>
<img
src="xpfollowingsibling.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>attribute</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert Attribut(e) eines Knotens.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/attribute::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>{Att1}</code>
</td>
<td>
<img
src="xpattribute.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
<tr>
<td
style="font-size : small ; line-height : 120%;">
<code>namespace</code>
</td>
<td
style="font-size : small ; line-height : 120%;">
Lokalisiert Namensraum-Attribute eines
Knotens.
</td>
<td
style="font-size : small ; line-height : 120%;">
<b>XPath-Ausdruck:</b>
<br />
<code>
/node1/node3/node8/namespace::*
</code>
<br />
<b>Ergebnisknotenmenge</b>
:
<code>
{xmlns:xml="http://www.w3.org/XML/1998/namespace",
xmlns:x="namespace:www.jeckle.de/vorlesung/xml"}
</code>
</td>
<td>
<img
src="xpnamespace.gif"
style="margin : 4% ;"
width="100%">
</img>
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>Filtern mit Prädikaten</title>
<ul>
<li>
Es ist möglich, eine Knotenmenge, die mit Hilfe
eines XPath ermittelt wird, durch Angabe eines
Prädikats noch weiter einzugrenzen.
</li>
<li>
Ein Prädikat wird in eckigen Klammern notiert
und kann bei jedem Lokalisierungsschritt
angegeben werden. Auf diese Weise können die
Ergebnismengen stark gefiltert werden.
</li>
<li>
Das Prädikat kann selbst ein gültiger
XPath-Ausdruck sein. Ferner können einige
vordefinierte Funktionen verwendet werden.
</li>
<li>Vorgehen</li>
<ol>
<li>
Ermittlung der zur Anfrage passenden
Knotenmenge
</li>
<li>
Reduzierung der Ergebnismenge um diejenigen
Knoten, für die das Prädikat nicht zutrifft,
also
<code>false</code>
liefert.
</li>
<li>
Befinden sich rechts vom aktuell
bearbeiteten Lokalisierungsschritt weitere
Ausdrücke, so wird die Resultatmenge als
Eingabe eines weiteren Schritts (1)
übergeben.
</li>
</ol>
</ul>
</slide>
<slide>
<title>
Filtern mit Prädikaten - ein erstes Beispiel
</title>
<p>
Wird der folgende XPath-Ausdruck auf unser Beispiel
der Projektverwaltung angewendet...
</p>
<listing
src="xpath-beispiel-4.xml"
line="2">
</listing>
<p>... so erhält man folgendes Ergebnis:</p>
<listing
src="xpath-beispiel-4.xml"
line="3">
</listing>
<p>Die einzelnen Schritte im Überblick:</p>
<ul>
<li>
Der Ausdruck wählt zunächst alle Knoten des Typs
<code>Person</code>
an beliebiger Stelle des Dokuments („//“) aus.
</li>
<li>
Diese Knotenmenge wird dann um diejenigen
Personen vermindert, zu denen kein
<code>Qualifikationsprofil</code>
angelegt ist. Positiv formuliert: es werden nur
diejenigen Knoten ausgewählt, die über einen
Kindknoten des Typs
<code>Qualifikationsprofil</code>
verfügen.
</li>
<li>
Von dieser (reduzierten) Knotenmenge (Achtung:
des Typs
<code>Person</code>
!) werden dann im zweiten Lokalisierungsschritt
die Kindknoten des Typs
<code>Nachname</code>
ausgewählt.
</li>
</ul>
<p>
<em>Anmerkung</em>
: Das Beispiel nutzt im Prädikat die abkürzende
Schreibweise zur Angabe der Vorgabeachse
<code>child</code>
. Die ausführliche Schreibweise des XPath-Ausdruckes
lautet:
<code>
//Person[child::Qualifikationsprofil]/Nachname
</code>
</p>
<!-- TODO: Dies als Beispiel - Overheadfolie - zum genau nachvollziehen -->
</slide>
<slide>
<title>
Filtern mit Prädikaten - erweitertes Beispiel
</title>
<p>
Das folgende Beispiel zeigt die Verwendung von
Prädikaten bei mehreren Lokalisierungsschritten.
Folgende Aufgabe soll gelöst werden:
<br />
Auswählen aller
<code>Vorname</code>
n als Kinder von
<code>Person</code>
en-Knoten, deren
<code>Nachname</code>
mit dem Buchstaben
<code>O</code>
beginnt. Weitere Einschränkung: die
<code>Person</code>
en-Knoten müssen ihrerseits Kinder von Knoten des
Typs
<code>Projektverwaltung</code>
sein.
</p>
<ol>
<li>
Auswählen aller Knoten des Typs
<code>Person</code>
an beliebiger Stelle des Dokuments.
</li>
<listing
src="xpath-beispiel-5.xml"
line="3">
</listing>
<listing
src="xpath-beispiel-5.xml"
line="4-6">
</listing>
<li>
Einschränken der Knotenmenge auf nur diejenigen
Personen, die Kindelemente von
<code>Projektverwaltung</code>
sind.
</li>
<listing
src="xpath-beispiel-5.xml"
line="7">
</listing>
<listing
src="xpath-beispiel-5.xml"
line="8-10">
</listing>
<li>
Auswählen aller
<code>Vorname</code>
n, die Kindelemente von
<code>Person</code>
sind.
</li>
<listing
src="xpath-beispiel-5.xml"
line="11">
</listing>
<listing
src="xpath-beispiel-5.xml"
line="12-15">
</listing>
<li>
Einschränken der Knotenmenge auf nur diejenigen
Vornamen, auf die im Dokument ein
Geschwisterelement
<code>Nachname</code>
folgt.
</li>
<listing
src="xpath-beispiel-5.xml"
line="16">
</listing>
<listing
src="xpath-beispiel-5.xml"
line="17-20">
</listing>
<li>
Verwendung der vordefinierten Funktion
<code>starts-with</code>
zur zusätzlichen Formulierung der Einschränkung,
daß der Nachname mit dem Buchstaben
<code>O</code>
beginnen muß.
</li>
<listing
src="xpath-beispiel-5.xml"
line="21">
</listing>
<listing
src="xpath-beispiel-5.xml"
line="22-23">
</listing>
</ol>
</slide>
<slide>
<title>In XPath vordefinierte Funktionen (1/5)</title>
<p>XPath-Funktionen für Knotenmengen (node-sets)</p>
<table border="1">
<thead>
<tr>
<th>Funktionsprototyp</th>
<th>Funktionalität</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>
<em>number</em>
last()
</code>
</td>
<td>
Liefert die Größe der aktuellen
Knotenmenge; damit den Index des letzten
Elements.
</td>
</tr>
<tr>
<td>
<code>
<em>number</em>
position()
</code>
</td>
<td>
Liefert die Position des aktuellen
Knotens innerhalb der Knotenmenge. Der
erste Knoten trägt die Positionsnummer
1.
</td>
</tr>
<tr>
<td>
<code>
<em>number</em>
count(
<em>node-set</em>
)
</code>
</td>
<td>
Gibt die Anzahl der Elemente der
übergebenen Knotenmenge zurück.
</td>
</tr>
<tr>
<td>
<code>
<em>node-set</em>
id(
<em>object</em>
)
</code>
</td>
<td>
Liefert denjenigen Knoten, dessen
ID-typisiertes Attribut den Argumentwert
aufweist.
<br />
Anmerkung: Zur Nutzung dieser Funktion
muß zwingend eine Dokument-Grammatik
(DTD oder Schema) zum Eingangsdokument
vorliegen.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
local-name (
<em>node-set?</em>
)
</code>
</td>
<td>
Liefert den lokalen Namen (oder die
Menge der Namen) der übergebenen
Knotenmenge. Wird keine Knotenmenge
übergeben, dann wird der aktuelle Knoten
als Argument genutzt.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
namespace-uri (
<em>node-set?</em>
)
</code>
</td>
<td>
Gibt die Namensraum-URI der übergebenen
Knotenmenge zurück. Wird keine
Knotenmenge übergeben, dann wird der
aktuelle Knoten als Argument genutzt.
<br />
Anmerkung: Handelt es sich nicht um
einen Element- oder Attributknoten, so
ist die zurückgegebene Zeichenkette
leer.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
name (
<em>node-set?</em>
)
</code>
</td>
<td>
Liefert die qualifizierten Namen
(gebildet aus Namensraumkürzel und
lokalem Namen) der übergebenen
Knotenmenge, oder des aktuellen Knotens
bei leerer Knotenmenge.
<br />
Anmerkung: Nur für Element- und
Attributknoten liefert
<code>name</code>
andere Resultate als
<code>local-name</code>
.
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>In XPath vordefinierte Funktionen (2/5)</title>
<p>XPath-Funktionen für Zeichenketten</p>
<table border="1">
<thead>
<tr>
<th>Funktionsprototyp</th>
<th>Funktionalität</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>
<em>string</em>
string (
<em>object?</em>
)
</code>
</td>
<td>
Liefert Zeichenkettenrepräsentation
einer Knotenmenge. Dabei wird der
Zeichenkettenwert des ersten Knotens in
der Dokumentreihenfolge zurückgegeben,
andernfalls die leere Zeichenkette.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
concat (
<em>string</em>
,
<em>string</em>
,
<em>string*</em>
)
</code>
</td>
<td>
Verkettet mindestens zwei Zeichenketten.
</td>
</tr>
<tr>
<td>
<code>
<em>boolean</em>
starts-with (
<em>string1</em>
,
<em>string2</em>
)
</code>
</td>
<td>
Liefert
<code>true</code>
, falls
<code>string1</code>
das zweite Argument
<code>string2</code>
als Präfix enthält; andernfalls
<code>false</code>
.
</td>
</tr>
<tr>
<td>
<code>
<em>boolean</em>
contains (
<em>string1</em>
,
<em>string2</em>
)
</code>
</td>
<td>
Liefert
<code>true</code>
falls
<code>string1</code>
die Zeichenkette aus
<code>string2</code>
enthält; andernfalls
<code>false</code>
.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
substring-before (
<em>string1</em>
,
<em>string2</em>
)
</code>
</td>
<td>
Liefert denjenigen Teil der Zeichenkette
<code>string1</code>
, der sich vor dem ersten Auftreten der
Zeichenkette
<code>string2</code>
befindet.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
substring-after (
<em>string1</em>
,
<em>string2</em>
)
</code>
</td>
<td>
Liefert denjenigen Teil der Zeichenkette
<code>string1</code>
, der sich nach dem ersten Auftreten der
Zeichenkette
<code>string2</code>
befindet.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
substring (
<em>string</em>
,
<em>number1</em>
,
<em>number2?</em>
)
</code>
</td>
<td>
Liefert eine Zeichenkette der Länge
<code>number2</code>
aus
<code>string</code>
, beginnend mit der Position
<code>number1</code>
. Fehlt das dritte Argument, so wird der
Teilstring bis zum Ende der Zeichenkette
<code>string</code>
zurückgegeben.
<br />
Anmerkung: Das erste Zeichen trägt die
Indexnummer 1, nicht 0 wie in Java und C
üblich.
</td>
</tr>
<tr>
<td>
<code>
<em>number</em>
string-length(
<em>string?</em>
)
</code>
</td>
<td>
Liefert die Länge der übergebenen
Zeichenkette. Wird kein Argument
übergeben, so wird die Länge des zuvor
in eine Zeichenkette konvertierten
aktuellen Knotens zurückgegeben.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
normalize-space (
<em>string?</em>
)
</code>
</td>
<td>
Liefert die übergebene Zeichenkette
unter Entfernung führender, schließender
und mehrfacher Leerzeichen zurück.
Ferner werden noch evtl. in der
Argumentzeichenkette enthaltenen
Entitätsreferenzen aufgelöst.
<br />
Anmerkung: Der Normalisierungsvorgang
entspricht damit der
Attributwertenormalisierung nach
<a
href="http://www.w3.org/TR/REC-xml#AVNormalize">
Abschnitt 3.3.3 der
XML-Spezifikation
</a>
.
</td>
</tr>
<tr>
<td>
<code>
<em>string</em>
translate (
<em>string1</em>
,
<em>string2</em>
,
<em>string3</em>
)
</code>
</td>
<td>
Liefert die Zeichenkette
<code>string1</code>
, wobei jedes Zeichen aus
<code>string2</code>
durch das Zeichen an derselben Position
aus
<code>string3</code>
ersetzt wurde.
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>In XPath vordefinierte Funktionen (3/5)</title>
<p>Boole'sche XPath-Funktionen</p>
<table border="1">
<thead>
<tr>
<th>Funktionsprototyp</th>
<th>Funktionalität</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>
<em>boolean</em>
boolean (
<em>object</em>
)
</code>
</td>
<td>
Liefert die Boole'sche Repräsentation
des übergebenen Arguments.
<br />
Hierbei gilt:
<br />
<ul>
<li>
Eine Zahl wird genau dann nach
<code>true</code>
konvertiert, wenn sie weder Null
(unbeachtlich ihres Vorzeichens)
noch eine nicht darstellbare
Zahl (
<code>NaN</code>
) ist.
</li>
<li>
Eine Knotenmenge ergibt
<code>true</code>
, wenn sie nicht leer ist.
</li>
<li>
Eine Zeichenkette ergibt
<code>true</code>
, wenn sie nicht leer (d.h.
Länge größer Null) ist.
</li>
<li>
Die Konvertierung anderer Typen
ist typabhängig, und nicht durch
den Standard festgelegt.
</li>
</ul>
</td>
</tr>
<tr>
<td>
<code>
<em>boolean</em>
not (
<em>boolean</em>
)
</code>
</td>
<td>Negiert das übergebene Argument.</td>
</tr>
<tr>
<td>
<code>
<em>boolean</em>
true()
</code>
</td>
<td>
Liefert statisch den Wert
<code>true</code>
.
</td>
</tr>
<tr>
<td>
<code>
<em>boolean</em>
false()
</code>
</td>
<td>
Liefert statisch den Wert
<code>false</code>
.
</td>
</tr>
<tr>
<td>
<code>
<em>boolean</em>
lang (
<em>string</em>
)
</code>
</td>
<td>
Liefert
<code>true</code>
, wenn der aktuelle Knoten ein
<code>xml:lang</code>
-Attribut gemäß der als Argument
übergebenen Sprache besitzt.
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>In XPath vordefinierte Funktionen (4/5)</title>
<p>Zahlenorientierte XPath-Funktionen</p>
<table border="1">
<thead>
<tr>
<th>Funktionsprototyp</th>
<th>Funktionalität</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>
<em>number</em>
number (
<em>object?</em>
)
</code>
</td>
<td>
Konvertiert ein Objekt in eine Zahl
gemäß folgender Regeln:
<br />
<ul>
<li>
Eine Zeichenkette wird in eine
Fließkommazahl gemäß IEEE 754
konvertiert, wenn sie aus einem
optionalen Leerzeichen, gefolgt
durch ein optionales
Minuszeichen, gefolgt von einem
optionalen Leerzeichen und einer
Ziffernfolge besteht.
</li>
<li>
Der Boole'sche Wert
<code>true</code>
wird zu
<code>1</code>
, der Wert
<code>false</code>
zu
<code>0</code>
konvertiert.
</li>
<li>
Eine Knotenmenge wird zunächst
in eine Zeichenkette übersetzt,
und dann gemäß der oben
definierten Regeln umgesetzt.
</li>
<li>
Die Konvertierung anderer Typen
erfolgt typabhängig, und ist
nicht durch den Standard
geregelt.
</li>
</ul>
Wird kein Argument übergeben, so wird
stattdessen der aktuelle Knoten als
einziges Element einer Knotenmenge
interpretiert.
</td>
</tr>
<tr>
<td>
<code>
<em>number</em>
sum (
<em>node-set</em>
)
</code>
</td>
<td>
Liefert die Summe aller Elemente der
übergebenen Knotenmenge, die zuvor in
eine Zahl konvertiert werden.
</td>
</tr>
<tr>
<td>
<code>
<em>number</em>
floor (
<em>number</em>
)
</code>
</td>
<td>
Liefert die größte ganze Zahl, die nicht
größer als das Argument ist.
<br />
Beispiele:
<code>floor(7.4)=7</code>
,
<code>floor(−5)=−5</code>
und
<code>floor(−5.4)=−6</code>
.
</td>
</tr>
<tr>
<td>
<code>
<em>number</em>
ceiling (
<em>number1</em>
)
</code>
</td>
<td>
Liefert die kleinste ganze Zahl, die
nicht kleiner als das Argument ist.
<br />
Beispiele:
<code>ceiling(7.4)=8</code>
,
<code>ceiling(−5)=−5</code>
und
<code>ceiling(−5.4)=−5</code>
.
</td>
</tr>
<tr>
<td>
<code>
<em>number</em>
round (
<em>number</em>
)
</code>
</td>
<td>
Liefert das Argument auf die nächste
ganze Zahl gerundet. Gibt es zwei solche
-- wie bei Nachkommastelle gleich
<code>0.5</code>
immer der Fall -- so wird die größere
zurückgeliefert.
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>In XPath vordefinierte Funktionen (5/5)</title>
<p>Mathematische Operatoren</p>
<table border="1">
<thead>
<tr>
<th>Funktionsprototyp</th>
<th>Funktionalität</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>+</code>
</td>
<td>Addition</td>
</tr>
<tr>
<td>
<code>-</code>
</td>
<td>
Subtraktion
<br />
Anmerkung: Weil XML in Elementnamen den
Bindestrich erlaubt, muß dieser Operator
in einem Ausdruck immer durch
Leerzeichen von den Operanden getrennt
werden, andernfalls wird der gesamte
Ausdruck als Name gewertet.
</td>
</tr>
<tr>
<td>
<code>*</code>
</td>
<td>
Multiplikation
<br />
Außer wenn innerhalb von
XPath-Ausdrücken als Knotentest
eingesetzt.
</td>
</tr>
<tr>
<td>
<code>div</code>
</td>
<td>
Division
<br />
Achtung: Das Symbol
<code>/</code>
dient ausschließlich als Trennzeichen
innerhalb Lokalisierungspfaden!
</td>
</tr>
<tr>
<td>
<code>mod</code>
</td>
<td>
Modulo
<br />
Rest einer ganzzahligen Division.
<br />
Beispiel:
<code>5 mod 2</code>
ergibt
<code>1</code>
und
<code>-5 mod 2</code>
ergibt
<code>-1</code>
.
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>Ein umfangreiches Beispiel</title>
<p>
Für das nachfolgende umfangreichere Beispiel wird
die folgende erweiterte Projektverwaltung
betrachtet:
</p>
<listing src="projektverwaltung-erweitert.xml"></listing>
</slide>
<slide>
<title>Ein umfangreiches Beispiel</title>
<p>
Folgende Aufgabe soll gelöst werden:
<br />
Welchen Knoten im Dokument lokalisiert folgender
XPath-Ausdruck:
</p>
<listing
src="xpath-beispiel-6.xml"
line="2">
</listing>
<p>
Schrittweises Nachverfolgen der einzelnen
Lokalisierungsschritte und Filterungen:
</p>
<ul>
<li>
Auswahl aller
<code>Person</code>
en an beliebiger Stelle des Dokuments:
</li>
<listing
src="xpath-beispiel-6.xml"
line="3">
</listing>
<listing
src="xpath-beispiel-6.xml"
line="4-6">
</listing>
<li>
Reduzierung auf diejenigen
<code>Person</code>
en, die genau einen Kindknoten
<code>Vorname</code>
besitzen
</li>
<listing
src="xpath-beispiel-6.xml"
line="7">
</listing>
<listing
src="xpath-beispiel-6.xml"
line="8-9">
</listing>
<li>
Navigieren zu den Kindknoten
<code>Nachname</code>
jeder ausgewählten Person
</li>
<listing
src="xpath-beispiel-6.xml"
line="10">
</listing>
<listing
src="xpath-beispiel-6.xml"
line="11-12">
</listing>
<li>
Einschränken der soeben ausgewählten Menge von
<code>Nachname</code>
n auf diejenigen, die einen nachfolgenden
Geschwisterknoten vom Typ
<code>Geburtsname</code>
besitzen.
</li>
<listing
src="xpath-beispiel-6.xml"
line="13">
</listing>
<listing
src="xpath-beispiel-6.xml"
line="14">
</listing>
<li>
Einschränken der Menge der
<code>Nachname</code>
n auf diejenigen, die einen nachfolgenden
Geschwisterknoten vom Typ
<code>Geburtsname</code>
mit einem Attribut namens
<code>value</code>
besitzt (Test auf Existenz!).
</li>
<listing
src="xpath-beispiel-6.xml"
line="15">
</listing>
<listing
src="xpath-beispiel-6.xml"
line="16">
</listing>
<li>
Ausgehend vom jedem Knoten der Menge, navigiere
zum Elternelement vom Typ
<code>Person</code>
.
</li>
<listing
src="xpath-beispiel-6.xml"
line="17">
</listing>
<listing
src="xpath-beispiel-6.xml"
line="18">
</listing>
<li>
Für jeden Knoten vom Typ
<code>Person</code>
der eben selektierten Menge, navigiere zum
Attributknoten
<code>mitarbeitInProjekt</code>
.
</li>
<listing
src="xpath-beispiel-6.xml"
line="19">
</listing>
<listing
src="xpath-beispiel-6.xml"
line="20">
</listing>
</ul>
<p>
Der XPath-Ausdruck lokalisiert den Attributknoten
<code>mitarbeitInProjekt</code>
von Person 3 mit dem Wert
<code>Prj02</code>
.
</p>
</slide>
<slide>
<title>XPath - Übungen</title>
<p>
Welches Ergebnis liefern folgende XPath-Ausdrücke?
</p>
<listing
src="xpath-uebungen.xml"
line="2">
</listing>
<note>
<listing
src="xpath-uebungen.xml"
line="3-5">
</listing>
</note>
<listing
src="xpath-uebungen.xml"
line="6">
</listing>
<note>
<listing
src="xpath-uebungen.xml"
line="7">
</listing>
</note>
<listing
src="xpath-uebungen.xml"
line="8">
</listing>
<note>
<listing
src="xpath-uebungen.xml"
line="9">
</listing>
</note>
</slide>
<slide>
<title>
Anwendungsbeispiel: Integritätsbedingungen in
XML-Schema (1/4)
</title>
<ul>
<li>
Die bei der Diskussion des
Referenzierungsmechanismus für DTDs
<a
href="file:///F:/bsz/webseite/onlineversion/vorlesung/dtd.html#(16)">
geäußerte Kritik
</a>
gilt prinzipiell auch für die Verwendung von
XML-Schema, da die Bedeutung der
<code>ID</code>
und
<code>IDREF</code>
,
<code>IDREFS</code>
-Konstrukte aus der DTD in Schema übernommen
wurden (Gültigkeit von Referenzen auf das
aktuelle Dokument beschränkt, damit sind
dokumentweit eindeutige Bezeichner notwendig).
</li>
<li>
Allerdings bietet XML-Schema eine Möglichkeit,
eindeutige Wertbelegungen zu definieren: das
<code>unique</code>
-Element.
</li>
<li>
Dieser Mechanismus verwendet XPath-Ausdrücke zur
Festlegung der Knotenmenge, auf die sich die
Einschränkung bezieht (
<code>selector</code>
), und zur Angabe der eingeschränkten Knoten (
<code>field</code>
) selbst.
</li>
<listing
src="schema-unique.xml"
line="2-6">
</listing>
<li>
Einschränkung für das
<code>selector</code>
-Element: es sind hier nur Ausdrücke erlaubt,
die Kindelemente des Knotens liefern, in dessen
Kontext die Einschränkung mittels des
<code>unique</code>
-Elements angegeben wird.
</li>
<li>
Die Lokationsausdrücke in den
<code>field</code>
-Elementen werden relativ zum Pfad des
<code>selector</code>
-Knotens interpretiert.
</li>
<li>
Hintereinandergesetzt muß der Pfad eines
<code>selector</code>
-Elements, gefolgt von einem Pfad eines
<code>field</code>
-Elements, einen gültigen Lokationsausdruck
ergeben, der genau einen Knoten oder genau ein
Attribut in der Ergebnismenge liefert.
</li>
<li>
Sind mehrere
<code>field</code>
-Elemente zu einem
<code>selector</code>
-Element gegeben, so werden diese als durch
logisches und verknüpft interpretiert.
</li>
</ul>
</slide>
<slide>
<title>
Anwendungsbeispiel XML-Schema: Unique-Einschränkung
(2/4)
</title>
<p>
Im folgenden Beispiel wird das
<code>unique</code>
-Element verwendet, um zu formulieren, daß das
Attribut
<code>PersID</code>
des Elements
<code>Person</code>
eindeutig sein muß (dies entspricht -- noch -- der
bisherigen ID-Typisierung).
</p>
<listing src="XSDUniqueness.xsd"></listing>
<ul>
<li>
Der Pfad
<code>/Person</code>
wählt zunächst alle Knoten des gleichnamigen
Typs aus.
</li>
<li>
Das
<code>field</code>
-Element wendet die Eindeutigkeitsbedingung auf
alle Attribut-Kindnoten des Typs
<code>PersID</code>
der Knoten in der selektierten Knotenmenge (
<code>/Person</code>
) an.
</li>
</ul>
</slide>
<slide>
<title>
Anwendungsbeispiel XML-Schema: Zusammengesetzter
Schlüssel innerhalb eines unique-Elements (3/4)
</title>
<p>
Das nächste Beispiel zeigt die Verwendung
<u>mehrerer</u>
<code>field</code>
-
<u>Elemente</u>
zur Realisierung zusammengesetzter Schlüssel.
</p>
<listing src="concatKey.xsd"></listing>
<ul>
<li>
Die Kombination aus dem Inhalt des
<code>Nachname</code>
n- und des
<code>Vorname</code>
n-Elements zusammen wird als eindeutig
deklariert.
</li>
</ul>
</slide>
<slide>
<title>
Anwendungsbeispiel XML-Schema: Referenzierung,
Einschränkung der Referenzmenge (4/4)
</title>
<p>
Mit Hilfe der XML-Schema-Elemente
<code>key</code>
und
<code>keyref</code>
ist es möglich, Referenzen auf bestimmte
Referenzmengen einzuschränken. Hiermit kann
sichergestellt werden, daß als Werte eines Attributs
<code>mitarbeitInProjekt</code>
auch wirklich nur auf Schlüssel verwiesen werden
kann, die für ein Projekt definiert wurden. Damit
ist es im Gegensatz zu DTDs nicht mehr möglich, an
dieser Stelle auf IDs von Personen zu verweisen.
</p>
<listing src="keybasedRef.xml"></listing>
<ul>
<li>
Der mit
<code>projectKey</code>
benannte Schlüssel (
<code>key</code>
) definiert die Referenzmenge als das Ergebnis
der XPath-Ausdruckes
<code>Projekt/@ID</code>
</li>
<li>
Hierauf nimmt die Referenz namens
<code>projectReference</code>
mittels
<code>refer="projectKey"</code>
Bezug. In einer durch
<code>keyref</code>
lokalisierten Knotenmenge dürfen ausschließlich
Elemente der Referenzmenge enthalten sein.
</li>
</ul>
</slide>
<slide>
<title>
Vorteile gegenüber
<code>ID/IDREF</code>
</title>
<p>
Zusammenfassend lassen sich folgende Vorteile
gegenüber dem
<code>ID/IDREF</code>
-Mechanismus festhalten:
</p>
<ul>
<li>Zusammengesetzte Schlüssel möglich.</li>
<li>
Neben Attributen können auch Elemente und ihre
Inhalte Beschränkungen unterworfen werden.
</li>
<li>
Eindeutigkeitsbeschränkungen sind auf
Gültigkeitsbereich des definierenden Elements
beschränkt.
</li>
<li>
Schlüsselbestandteile müssen im XML-Dokument
zwingend mit Werten (ungleich nil) belegt sein.
</li>
<li>Einschränkung der Referenzmenge möglich.</li>
</ul>
</slide>
</part>
</presentation>
<!-- Ende XPath -->
<!-- Uebungsaufgaben zu XPath -->
<presentation id="uebungsaufgabenXPath">
<title short="uebungsaufgabenXPath">
Übungsaufgaben zum Thema XPath.
</title>
<date>2008-12-08</date>
<toc id="resources" />
<toc id="abstract">Übungsaufgaben zum Thema XPath.</toc>
<part>
<title>Übungsaufgaben zu XPath</title>
<slide>
<title>XPath Übungsaufgabe 1: XMLBooks</title>
<p>
Formulieren Sie zu untenstehendem XML-Dokument
XPath-Anfragen, die die geforderten Knotenmengen aus
dem Dokument extrahieren.
<br />
Sie benötigen hierzu die XPath-Funktionen
<code>boolean: contains(value,substring)</code>
und
<code>number : count(nodeset)</code>
</p>
<ol>
<li>
Geben Sie den XPath-Ausdruck an, der alle Bücher
die im Vereinigten Königreich (UK) erschienen
sind, lokalisiert.
</li>
<li>
Geben Sie einen XPath-Ausdruck an, der die Titel
aller Bücher lokalisiert, die durch mehr als
einen Autor geschrieben wurden.
</li>
<li>
Welche(n) Knoten lokalisiert der Ausdruck
<code>
/XMLBooks/book[(position() div 2) = 1]
</code>
?
</li>
<li>
Welche(n) Knoten lokalisiert der Ausdruck
<code>
//book[authors/author[.='W. Scott
Means']]/title
</code>
?
</li>
</ol>
<listing src="XMLBooks.xml" />
</slide>
<slide>
<title>XPath Übungsaufgabe 2: Stammbaum</title>
<p>
Formulieren Sie zu untenstehendem XML-Dokument
XPath-Anfragen, die die geforderten Knotenmengen aus
dem Dokument extrahieren.
<br />
Sie benötigen hierzu die XPath-Funktionen
<code>substring(string,start,end)</code>
.
<br />
<code>string</code>
entspricht der zu verarbeitenden Zeichenkette,
<code>start</code>
der Startposition und
<code>end</code>
der Endposition.
</p>
<ol>
<li>
Lokalisieren Sie den Namen desjenigen
Herrschers, der ab 1509 regierte.
</li>
<li>
Extrahieren Sie die Sterbejahre aller Herrscher
namens Heinrich (verwenden Sie hierzu die
<code>substring</code>
-Funktion).
</li>
<li>
Lokalisieren Sie den Personen-Knoten derjenigen
Herrscher, die zwischen 1550 und 1640 gekrönt
wurden und die gleichzeitig Nachfahren Heinrich
VIII. sind.
</li>
</ol>
<listing src="Stammbaum.xml" />
</slide>
<slide>
<title>XPath Übungsaufgabe 3: Stammbaum v2</title>
<p>
Formulieren Sie zu untenstehendem XML-Dokument
XPath-Anfragen, die die geforderten Knotenmengen aus
dem Dokument extrahieren.
</p>
<ol>
<li>
Lokalisieren Sie die erfaßten Kinder von
Friedrich Wilhelm I.
</li>
<li>
Extrahieren Sie die Namen der drei Herrscher des
„Dreikaiserjahres“ 1888.
</li>
</ol>
<listing src="Stammbaum2.xml" />
</slide>
</part>
</presentation>
<!-- Ende Übungen zu XPath-->
<!-- Web Services -->
<presentation id="soa-webservices">
<title short="soa-webservices">
Web Services / Service-orientierte Architekturen
</title>
<date>2008-12-22</date>
<toc id="resources">
<a href="http://www.w3.org/2002/ws/">
W3C Webseite zu Web Services
</a>
</toc>
<toc id="abstract">
Unter einem Web-Service versteht man zunächst eine
Dienstleistung im klassischen Sinne (mit Merkmalen wie
Immaterialität und damit nicht-Lagerfähigkeit,
standortunabhängiger Produktion und der mangelnden
Entkopplung von Erzeugung und Konsumption), die über das
World Wide Web erbracht wird.
<br />
Die einzigen hierbei verbindlich benötigten Standards sind
die namensgebenden Web-Techniken. Hierzu gehören in erster
Linie die physischen Hardwareinfrastrukturen sowie die
benötigten Internet-Protokolle, z.B. TCP/IP.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract"></toc>
</p>
</slide>
<slide>
<title>Einige Definitionsversuche</title>
<ul>
<li>
<b>IBM und Unisys</b>
<br />
Web Services are a new, standards-based approach to
build integrated applications that run across an
intranet, extranet, or the Internet. The approach
represents a major evolution in how systems connect
and interact with each other.
<br />
Quelle:
<em>
CWM Web Services Specification, OMG-Dokument
ad/2001-10-07
</em>
</li>
<li>
<b>Frankfurter Allgemeine Zeitung</b>
<br />
Web Services sind Softwarebausteine, die Programme,
die auf unterschiedlichen Netzwerkrechnern laufen,
über das Internet zu einer Anwendung miteinenader
verknüpfen.
<br />
Quelle:
<em>F.A.Z. vom 14. Oktober 2003, S. 18</em>
</li>
<li>
<b>Java Web Services</b>
<br />
A Web Service is a piece of business logic, located
somewhere on the Internet, that is accessible
through standard-based Internet protocols such as
SMTP or HTTP.
<br />
Quelle:
<em>
<a
href="http://www.oreilly.com/catalog/javawebserv/">
Java Web Services
</a>
, S. 1
</em>
</li>
<li>
<b>
Loosely Coupled - The Missing Pieces of Web
Services
</b>
<br />
A Web Service is nothing more than an application
which other applications can communicate via a
network, most often using XML.
<br />
Quelle:
<em>
<a
href="http://www.rds.com/books/looselyCoupled/index.html">
Loosely Coupled
</a>
, S. 26
</em>
</li>
<li>
<b>
World Wide Web Consortium (Web Service
Architecture Working Group)
</b>
<br />
A Web service is a software system designed to
support interoperable machine-to-machine interaction
over a network. It has an interface described in a
machine-processable format (specifically WSDL).
Other systems interact with the Web service in a
manner prescribed by its description using SOAP
messages, typically conveyed using HTTP with an XML
serialization in conjunction with other Web-related
standards.
<br />
Quelle:
<em>
<a
href="http://www.w3.org/TR/2004/NOTE-ws-arch-20040211/">
Web Services Architecture (W3C Working Group
Note, 11 February 2004)
</a>
</em>
</li>
<li>
<b>Wrox Press: Professional Web Services</b>
<br />
Web Services are modular, self-describing
applications that can be published, located and
invoked from just about anywhere on the Web or a
local network. The provider and the consumer of the
XML Web service do not have to worry about operating
system, language, environment, or component model
used to create or access the XML Web service, as
they are based on ubiquitous and open Internet
standards, such as XML, HTTP, and SMTP.
</li>
<li>
<b>IBM</b>
<br />
Web services are technologies that allow
applications to communicate with each other in a
platform- and programming language-independent
manner. A Web service is a software interface that
describes a collection of operations that can be
accessed over the network through standardized XML
messaging. It uses protocols based on the XML
language to describe an operation to execute or data
to exchange with another Web service. A group of Web
services interacting together in this manner defines
a particular Web service application in a
Service-Oriented Architecture (SOA).
<br />
Quelle:
<em>
<a
href="http://www.alphaworks.ibm.com/webservices/newto">
New to SOA and Web services
</a>
</em>
</li>
<li>
<b>SUN</b>
<br />
A Web service is, simply put, application
functionality made available on the World Wide Web.
A Web service consists of a network-accessible
service, plus a formal description of how to connect
to and use the service. The language for formal
description of a Web service is an application of
XML. A Web service description defines a contract
for how another system can access the service for
data, or in order to get something done. Development
tools, or even autonomous software agents, can
automatically discover and bind existing Web
services into new applications, based on the
description of the service.
</li>
<li>
<b>Microsoft</b>
<br />
A Web Service is a unit of application logic
providing data and services to other applications.
Applications access Web Services via ubiquitous Web
protocols and data formats such as HTTP, XML, and
SOAP, with no need to worry about how each Web
Service is implemented. Web Services combine the
best aspects of component-based development and the
Web, and are a cornerstone of the Microsoft .NET
programming model.
</li>
<li>
<b>Gartner Group</b>
<br />
Web services are loosely coupled software components
delivered over Internet standard technologies. A Web
service represents a business function or a business
service and can be accessed by another application -
e.g., a client, a server or another Web service -
over public networks using generally available
protocols and transport, i.e., SOAP over HTTP. It
can also be accessed directly by a user through a
client interface. This business service can be
implemented as a stand-alone application or as a
series of applications linked together by an
application integration infrastructure. From the
point of view of the calling application, the Web
service is a modular entity that delivers services
on demand through a well-defined programmatic
interface. In effect, Web services comprise the
overall capability of finding and running programs
across the Internet - much in the way that software
programs run on a PC. As such, Web services will
eventually act as a quasi-Internet "operating
system" and use protocols to link and manage an
array of Internet-connected servers, PCs, appliances
and wireless devices. The underlying business goal
of Web services is to enable enterprises to focus on
their core competencies while outsourcing all other
functions. Web services would be the "tap" to turn
on to access, deploy and manage such essential
outsourced functions as credit authorization,
just-in-time productivity applications and
quality-of-service monitoring. Recent e-business
trends have included a movement toward outsourcing
applications and hosting systems through service
providers. Web services allow the delivery of core
business competencies in the form of software
processes accessible in a given value chain. This
allows each member of the chain to produce and
consume business services without the need for an
intermediary such as an application service provider
(ASP). In essence, each enterprises takes on the
task of being both a service consumer and a service
producer. Through 2004, the primary competitive
value derived from Web services will be the delivery
of core business competencies directly into trading
communities rather than through an intermediate
service provider (0.7 probability).
</li>
</ul>
</slide>
<slide>
<title>Was ist ein Web-Service?</title>
<img
style="margin : 4% ; width : 40% ; "
src="WsDef.gif" />
<ul>
<li>
<em>über das Web erbrachte Dienstleistungen</em>
<br />
Ein Webservice ist eine Dienstleistung im
klassischen Sinne (Immateriell, nicht lagerfähig,
standortunabhängige Produktion), die über das World
Wide Web erbracht wird.
<br />
Web-Techniken sind hierbei verbindlich benötigte
Standards (z.B. TCP/IP).
</li>
<li>
Darauf aufsetzende Stufen erhöhen Schritt für
Schritt die Interoperabilität Hiermit wird
Austauschbarkeit eines Dienstes für den Verbraucher
hergestellt.
</li>
<li>
XML ermöglicht interoperable, vereinheitlichte
Darstellung
<ul>
<li>des Inhalts einer Dienstleistung</li>
<li>
der Formulierung einer Dienstanforderung
</li>
<li>der Rückübermittlung eines Ergebnisses</li>
</ul>
</li>
<li>
<em>
Abgestimmte Inhalte in einem abgestimmten Format
</em>
<br />
Eine vereinheitlichte Inhaltsdarstellungen ist auch
mit anderen Formaten, wie etwa ASN.1 oder EDI (siehe
Graphik) erreichbar. Allerdings liegt der
XML-Einsatz von XML nahe, da es weit verbreitet ist
und damit durch Werkzeuge und Tools breit
unterstützt wird.
</li>
<li>
<em>Standardisierte Kommunikationsmechanismen</em>
<br />
Zusätzlich zu den Inhalten liegt es nahe, daß auch
der Kommunikationsprozesses, also der Ablauf der
daran beteiligten Interaktionen, standardisiert
wird. Eine Möglichkeit hierzu sind die bekannten
Remote Procedure Calls (RPC). Wird XML als
Inhaltsformat gewählt, liegen Ansätze wie XML-RPC
und dessen Weiterentwicklung, SOAP, auf der Hand.
</li>
<li>
<em>
Beschreibung der Natur der angebotenen Leistung
</em>
<br />
Beschreibungssprachen wie die Web Service
Description Language (WSDL) helfen hier ab. Damit
wird es Nutzern ermöglicht, sich über das Angebot
von Diensten und ihrer Abwicklungsmodalitäten wie
etwa Aufrufkonventionen oder zu übergebende
Parameter zu informieren.
</li>
<li>
<em>Auffinden von interessanten Diensten</em>
<br />
Universal Service Description, Discovery, and
Integration (UDDI) stellt einen Verzeichnisdienst
zur Verfügung, mit dem Nutzer für sie interessante
Dienste finden könnnen. In Anlehnung an die Gelben
Seiten werden Dienste klassifiziert und durch
verschiedene Zugriffsroutinen angeboten..
</li>
</ul>
<img
style="margin : 4% ; width : 40% ; "
src="WSArch.gif" />
</slide>
<slide>
<title>Definition</title>
<p class="definition">
Ein Web-Service ist eine über das Web erbrachte
Dienstleistung, die abgestimmte Inhalte in einem
abgestimmten Format über standardisierte
Kommunikationsmechanismen zur Verfügung stellt. Er ist
über ein offenes, im Internet verwendetes Protokoll
zugreifbar.
<br />
Darüber hinaus existieren Beschreibungen über die Natur
der angebotenen Leistung, seine Schnittstelle ist
<em>veröffentlicht</em>
.
<br />
Optional existieren Verzeichnisse, die das Auffinden von
für einen Verbraucher interessanten Diensten
ermöglichen.
<br />
In der technischen Umsetzung einer
Web-Service-Architektur sind nicht alle Protokolle,
Sprach- und Beschreibungsebenen zwingend zu realisieren.
</p>
<img
style="margin : 4% ; width : 40% ; "
src="Triangle.png" />
</slide>
<slide>
<title>SOAP am Beispiel</title>
<p>
Das hier vorgestellte Beispiel wurde für die SOAP
Infrastruktur Apache Axis (in Apache Tomcat) entwickelt.
Als Einstiegsbeispiel soll hier ein Zahlenaddier-Dienst
dienen, der die hochkomplexe Aufgabe hat, zwei Zahlen
miteinander zu addieren ;). Die Serverkomponente dieses
Beispiels führt die Rechenoperation durch, die
Clientkomponente greift darauf zu.
</p>
<p>
<em>
<b>Serverkomponente</b>
</em>
</p>
<listing src="Add.java" />
<p>
<em>
<b>
Einbinden der Serverkomponente in einen
Application Server, hier: Tomcat
</b>
</em>
</p>
<p>
Nach dem Compilieren muß die resultierende Java Klasse (
<code>Add.class</code>
) innerhalb des Tomcat Verzeichnisbaumes in ein
bestimmtes Unterverzeichnis des Tomcat Verzeichnisbaumes
kopiert werden (z.B.
<code>webapps/axis/WEB-INF/classes/</code>
).
<br />
Zusätzlich dazu benötigt man für jeden Service einen
Deployment Descriptor, der als Datei vorliegt. Für unser
Beispiel ist dies die Datei
<code>DeploymentDescriptor.wsdd</code>
mit folgendem Inhalt:
</p>
<listing src="DeploymentDescriptor.wsdd" />
<p>
Mit dem Parameter
<code>allowedMethods</code>
kann der Zugriff auf Methoden gesteuert werden, *
bedeutet, daß der Zugriff auf alle Methoden der Klasse
erlaubt ist.
</p>
<p>
Abschließend muß mit folgendem Befehl der Service in
Tomcat eingebunden werden:
</p>
<p>
<code>
java org.apache.axis.client.AdminClient
DeploymentDescriptor.wsdd
</code>
</p>
<p>
<em>
<b>Clientkomponente</b>
</em>
</p>
<listing src="AddClient.java" />
<p>
Nach dem Kompilieren kann man die Clientkomponente mit
folgendem Befehl zum Aufruf der Serverkomponente
benutzen:
</p>
<p>
<code>
java AddClient 3 29
http://localhost/axis/services/NumberAdder
</code>
</p>
<p>
<em>
<b>Netzverkehr</b>
</em>
</p>
<p>
Und so sieht der SOAP Aufruf aus, der bei obigem
Beispiel zwischen Client und Server übertragen wird:
</p>
<listing src="ExampleSoapCall.txt" />
</slide>
<slide>
<title>Beispiel einer WSDL-Beschreibung</title>
<p>
Zur SOAP-Anfrage des vorhergehenden Beispiels soll hier
eine diesen Dienst beschreibende WSDL-Datei vorgestellt
werden.
</p>
<listing
src="ExampleSoapCall.txt"
line="11-22" />
<listing src="ExampleSoapCall.wsdl" />
</slide>
<slide>
<title>Beispiel UDDI</title>
<p>
<a href="http://uddi.xml.org/specification">
Universal Description, Discovery, and Integration
(UDDI)
</a>
ist eine Spezifikation, der einen Verzeichnisdienst für
Web Services zur Verfügung stellt und verschiedene
XML-Vokabulare zur Kommunikation zwischen Verbrauchern
und einem UDDI-Server zur Verfügung stellt.
</p>
<p>
Nachfolgendes Beispiel zeigt eine typische Anfrage, die
nach Firmen sucht, die WSDL-Basierte Web Services für
beliebige Transportgüter zur Verfügung stellt (Suche
nach
<em>
<a href="http://www.unspsc.org/">
United Nations Standard Products & Services
Code
</a>
</em>
mit der ID
<code>78NNNNNN</code>
, Transportation and Storage and Mail Services). Die
Firmen, die gefunden werden, sollen dann absteigend
sortiert zurückgeliefert werden.
<br />
(UDDI unterstützt neben der Suche nach
<code>UNSPSC</code>
Codes noch weitere (international und national)
standardisierte numerische Kategorien:
<code>NAICS</code>
,
<code>D-U-N-S</code>
,
<code>ISO 3166</code>
und
<code>SIC</code>
)
</p>
<listing src="UddiFindBusiness.xml" />
<p>
Ein mögliches Ergebnis einer solchen Anfrage könnte etwa
lauten:
</p>
<listing src="UddiBusinessEntity.xml" />
</slide>
<slide>
<title>Web-Services - Orchestrierung</title>
<img
style="margin : 4% ; width : 40% ; "
src="WSExample.gif" />
<p>
Das Beispiel zeigt verschiedene Web-Services, die
zusammen den Dienst der wechselseitigen Umrechnung von
Geldbeträgen des europäischen Währungsraumes erbringen.
Die Verwendungsbeziehungen sind als gerichtete Kanten
ausgehend vom nutzenden Dienst hin zum benutzten
dargestellt. Die Dienste sind auch eigenständig nutzbar.
</p>
<p>
Insgesamt wird das durch die Europäische Zentralbank
vorgegebene Verfahren der Berechnung, die
<q>Zwischen-Nutzung</q>
des Euros (sog. Triangulation), benutzt. Dabei wird
zunächst die Ursprungslandeswährung in das
Euro-Äquivalent überführt, welches dann in die
gewünschte Zielwährung umgerechnet wird.
</p>
<p>Die Verteilung der Aufgaben ist hierbei wie folgt:</p>
<ul>
<li>
<code>ExchangeRates</code>
liefert auf Anfrage mit dem amtlichen Währungskürzel
den entsprechenden, durch die Europäische
Zentralbank festgelegten, Umrechnungskurs.
</li>
<li>
<code>EuroConverter</code>
rechnet einen Betrag der Landeswährung in die
Eurosumme um, bzw. umgekehrt. Zur Berechnung wird
der durch ExchangeRates bereitgestellte Wechselkurs
benötigt.
</li>
<li>
<code>CurrencyConvert</code>
erlaubt die Umrechnung zwischen allen Währungen des
europäischen Währungsraumes. Gemäß der Festlegung
durch die Europäische Zentralbank darf dieser
Vorgang ausschließlich durch Umrechnung in Euro
ausgeführt werden (Triangulation). Daher muß
zunächst der Ursprungsbetrag nach Euro, anschließend
dieser Wert in die Zielwährung konvertiert werden.
Zur Realisierung nutzt
<code>CurrencyConvert</code>
die durch
<code>EuroConverter</code>
angebotenen Funktionen.
</li>
</ul>
</slide>
</presentation>
<!-- Ende Web Services -->
<!-- RDF und RSS -->
<presentation id="rdf-rss">
<title short="rdf-rss">RDF und RSS</title>
<date>2008-12-22</date>
<toc id="resources">
<a href="http://www.w3.org/RDF/index.html">
W3C Webseite zu RDF
</a>
,
<a href="http://www.rssboard.org/">
Webseite des RSS Advisory Board
</a>
</toc>
<toc id="abstract">
RDF (Resource Description Framework) bietet ein
leichtgewichtiges System an Ontologien, um den Austausch von
Wissen über das Web zu ermöglichen.
<br />
RSS (Really Simple Syndication) ist XML-Format, das der
Syndikatisierung von Inhalten des WWW dient.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract"></toc>
</p>
</slide>
<part>
<slide>
<title>RDF</title>
<p class="definition">
Das
<em>Resource Description Framework (RDF)</em>
dient dazu, beispielsweise Informationen aus
Büchereikatalogen und anderen Verzeichnissen zu
<em>syndikatisieren</em>
und Nachrichten, Software sowie anderen Inhalt zu
persönlichen Sammlungen wie beispielsweise Musik,
Photos und anderen Ereignissen zu versammeln /
aggregieren. Dabei dient XML als Austauschformat.
RDF selbst bietet ein leichtgewichtiges System an
Ontologien, um den Austausch von Wissen über das Web
zu ermöglichen.
</p>
</slide>
<slide>
<title>
Begriff
<em>Ontologie</em>
</title>
<p class="definition">
Unter einer
<em>Ontologie</em>
versteht man die
<em>
<q>Lehre vom Sein, vom Seienden</q>
</em>
(Duden, Deutsches Universalwörterbuch, 4. Auflage,
2001), bzw. die
<em>
<q>
Lehre von den Ordnungs-, Begriffs- und
Wesensbestimmungen des Seienden
</q>
</em>
(Duden, Das große Fremdwörterbuch, 2. Auflage,
2000).
</p>
<li></li>
</slide>
<slide>
<title>Verwendung von RDF</title>
<p>
RDF beschreibt Information über Ressourcen im World
Wide Web. Insbesondere werden dadurch Metadaten über
Ressourcen ausgedrückt, wie z.B.:
</p>
<ul>
<li>Titel einer Webseite</li>
<li>Autor</li>
<li>letzte Änderungsdatum</li>
<li>Copyright-Informationen</li>
<li>Lizensierungsbedingungen</li>
<li>zeitliche Verfügbarkeit einer Ressource</li>
</ul>
<p>
RDF wird jedoch auch dafür verwendet, Information
über Dinge auszudrücken, die nicht direkt über das
Web zugreifbar sind, sondern ausschließlich mit
Hilfe von Web-Techniken identifizierbar sind (URIs):
</p>
<ul>
<li>
Informationen über Ware von Online-Märkten (
Beschreibung, Preise, Verfügbarkeit)
</li>
<li>
Beschreibung von Nutzervorlieben (Art und Weise
der Informationsnutzung)
</li>
</ul>
<p>
RDF wird hierbei vor allem dann verwendet, wenn
diese Informationen durch Softwaresysteme
verarbeitet werden sollen. Es erlaubt den Austausch
dieser Information zwischen Applikationen, ohne daß
Information dabei verloren geht. Für Benutzer /
Programmiere ist es vorteilhaft, daß Frameworks
(Tools, Parser, Prozessoren) verfügbar sind und
verwendet werden können.
</p>
</slide>
<slide>
<title>RDF - Identifizierung von Ressourcen</title>
<p>
RDF identifiziert Dinge mit Hilfe von UDIs und
beschreibt Ressourcen durch einfache Eigenschaften
und Eigenschaftswerte. Auf diese Weise können
einfache Aussagen über Ressourcen getätigt werden.
Abstrakt entspricht dies einem Graphen aus Knoten
und Kanten, der die Ressourcen selbst sowie ihre
Eigenschaften und Werte darstellt.
</p>
<img
style="margin : 4% ; width : 60% ;"
src="RDFGraph.png" />
<p>
Obige Grafik (Quelle:
<a
href="http://www.w3.org/TR/rdf-primer/index.html">
RDF Primer
</a>
) erläutert dies am Beispiel von folgenden
Informationen über eine Person:
</p>
<ul>
<li>
Es gibt eine Person, die durch die URI
<code>
http://www.w3.org/People/EM/contact#me
</code>
identifiziert wird.
</li>
<li>Der Name dieser Person ist Eric Miller.</li>
<li>
Die E-Mail-Adresse von Herrn Miller ist
<code>em@w3.org</code>
.
</li>
<li>
Sein akademischer Titel ist
<code>Dr.</code>
</li>
</ul>
</slide>
<slide>
<title>RDF: Identifizierung mit URIs</title>
<img
style="margin : 4% ; width : 60% ; "
src="RDFGraph.png" />
<p>
Im vorherigen Beispiel identifiziert RDF folgende
Dinge
</p>
<ul>
<li>
Individuen, z.B. Eric Miller (
<code>
http://www.w3.org/People/EM/contact#me
</code>
)
</li>
<li>
Klassen von Dingen, z.B. Personen (
<code>
http://www.w3.org/2000/10/swap/pim/contact#Person
</code>
)
</li>
<li>
Eigenschaften dieser Dinge, z.B. Mailbox (
<code>
http://www.w3.org/2000/10/swap/pim/contact#mailbox
</code>
)
</li>
<li>
Werte dieser Eigenschaften, z.B.
<code>mailto:em@w3.org</code>
als Wert der Mailbox-Eigenschaft (RDF nutzt
hierbei auch Zeichenketten wie bspw. "Eric
Miller", und Werte anderer Datentypen wie z.B.
Integer)
</li>
</ul>
</slide>
<slide>
<title>RDF XML-Syntax</title>
<p>
Zum Austausch dieser Graphen bietet RDF eine
XML-basierte Syntax namens
<em>RDF/XML</em>
. Die im Beispiel dargestellte Information
entspricht der folgenden XML-Darstellung:
</p>
<listing src="RDFExample.xml" />
<p>
Auch hier sind die URIs, ebenso wie die
Eigenschaften wie
<code>mailbox</code>
und
<code>fullName</code>
sowie deren Werte wie
<code>em@w3.org</code>
und
<code>Eric Miller</code>
enthalten.
</p>
</slide>
<slide>
<title>RDF Eigenschaften</title>
<ul>
<li>
Wie HTML ist RDF/XML automatisch durch Software
verarbeitbar.
</li>
<li>
Durch die Verwendung von URIs können
Informationen im Web miteinander verbunden
werden.
</li>
<li>
URIs werden analog ihrer XML-Verwendung als
Möglichkeit zur Identifizierung verwendet.
Hiermit können auch Dinge identifiziert werden,
die nicht direkt im Web Zugreifbar sind (wie
etwa die Person aus dem Beispiel).
</li>
<li>
RDF kann damit nicht nur Webseiten beschreiben,
sondern auch Autos, Firmen, Menschen,
Nachrichten, Ereignisse, Veranstaltungen, etc.
</li>
<li>
Überdies können RDF Eigenschaften selbst URIs
haben, damit können die Beziehungen zwischen den
einzelnen Dingen eindeutig identifiziert werden.
</li>
</ul>
</slide>
<slide>
<title>RDF - Grundlegende Konzepte</title>
<ul>
<li>
Mit RDF können
<em>Aussagen</em>
über Dinge gemacht werden.
</li>
<li>
Demnach muß es möglich sein, folgende Dinge zu
benennen oder zu identifizieren:
</li>
<ul>
<li>
Das Ding, über das die Aussage getroffen
wird.
</li>
<li>
Eine bestimmte Eigenschaft dieses Dinges (zu
Beisiel der Ersteller einer Webseite).
</li>
<li>
Den Wert dieser Eigenschaft (z.B: den Namen
des Webseitenerstellers)
</li>
</ul>
<li>
Beispiel: In der Aussage
<br />
<q>
http://www.barbara-zengler.de/ hat einen
Ersteller, dessen Wert Barbara Zengler ist.
</q>
<br />
dient die URL der Identifikation der Webseite.
Zusätzlich dazu identifiziert das Wort
<q>Ersteller</q>
die Eigenschaft sowie die zwei Wörter
<q>Barbara Zengler</q>
den Wert dieser Eigenschaft.
</li>
<li>
RDF verwendet zur Bezeichning dieser Dinge eine
Begriffswelt, die sich an der Begriffswelt der
Grammatiken orientiert:
</li>
<ul>
<li>
Der Gegenstand der Betrachtung wird
<em>Subjekt</em>
genannt.
</li>
<li>
Die Eigenschaft des Subjekts, die Gegenstand
der Aussage ist, wird als
<em>Prädikat</em>
bezeichnet.
</li>
<li>
Der Wert der Eigenschaft stellt entsprechend
das
<em>Objekt</em>
dar.
</li>
</ul>
<li>Angewendet auf obiges Beispiel:</li>
<ul>
<li>
Das Subjekt entspricht der URL
<code>http://www.barbara-zengler.de/</code>
</li>
<li>
Das Wort
<q>Ersteller</q>
stellt das Prädikat dar.
</li>
<li>
Das Objekt wird durch den Ausdruck
<q>Barbara Zengler</q>
gebildet.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Das RDF-Modell</title>
<p>
Wenn man das Konzept der Verwendung von URIS auf das
Beispiel anwendet, dann könnte eine RDF-Aussage zu
obigem Beispiel in etwa folgende Anteile besitzen:
</p>
<ul>
<li>
Ein Subjekt
<code>http://www.barbara-zengler.de/</code>
</li>
<li>
Ein Prädikat
<code>
http://purl.org/dc/elements/1.1/creator
</code>
</li>
<li>
Ein Objekt
<code>
http://www.example.org/mitarbeiterID/12345
</code>
</li>
</ul>
<p>
Das RDF-Modell stellt diese Information als Knoten
und Kanten in einem Graphen dar. Entsprechend würde
</p>
<ul>
<li>Ein Knoten für das Subjekt,</li>
<li>ein Knoten für das Objekt und</li>
<li>
eine gerichtete kante vom Subjekt hin zum Objekt
</li>
</ul>
<p>modelliert.</p>
<img
style="margin : 4% ; width : 60% ; "
src="RDFModel.png" />
</slide>
<slide>
<title>RDF - Gruppierung</title>
<p>
Werden mehrere Aussagen über ein Subjekt oder Objekt
getroffen, so werden diese bei den entsprechenden
Knoten gruppiert. Beispielsweise würden die
folgenden zwei zusätzlichen Aussagen ....
</p>
<listing
src="RDFStatements.txt"
line="1-2" />
<p>
..., die über das Subjekt unseres Beispiels
getroffen werden, zu folgendem RDF-Modell führen:
</p>
<img
style="margin : 4% ; width : 60% ; "
src="RDFModel2.png" />
<ul>
<li>
Objekte in RDF können durch URIs (dargestellt in
Ellipsen) oder Literale (dargestellt in
Vierecken) bezeichnet werden.
</li>
<li>
Subjekte und Prädikate können hingegen nicht
durch Literale bezeichnet werden.
</li>
</ul>
</slide>
<slide>
<title>RDF - Darstellung in Textform als Tripel</title>
<ul>
<li>Alternative Form der Darstellung: Textform</li>
<li>
Subjekt, Prädikat und Objekt werden durch
Leerzeichen getrennt als
<em>Tripel</em>
hintereinander in dieser Reihenfolge notiert.
</li>
<li>
Jedes Tripel entspricht einem Kanten des Graphs,
mit Start- und Endknoten.
</li>
<li>
Wichtig in RDF ist das Modell des Graphen. Seine
Repräsentation, sei es grafisch, im XML-Format
oder in Textform, ist weniger wichtig.
</li>
</ul>
<p>
Die Information aus unserem Beispiel als Tripel
notiert:
</p>
<listing
src="RDFStatements.txt"
line="4-6" />
<p>
Achtung: es handelt sich hierbei um KEINE
XML-Notation!
</p>
<ul>
<li>
Es besteht die Möglichkeit zur Abkürzung durch
die Verwendung der aus den XML-Namensräumen
bekannten
<em>Präfix-Notation</em>
</li>
<listing
src="RDFStatements.txt"
line="8-13" />
</ul>
</slide>
<slide>
<title>
RDF - Darstellungsweisen in der Zusammenschau
</title>
<img
style="margin : 4% ; width : 60% ; "
src="RDFModel2.png" />
<listing
src="RDFStatements.txt"
line="4-6" />
<listing
src="RDFStatements.txt"
line="16-26" />
<p>
Die oben gezeigte XML-Darstellung ist eine Abkürzung
für folgende Schreibweise:
</p>
<listing
src="RDFStatements.txt"
line="31-49" />
<p>
Die RDF-Information in beiden XML-Dokumenten ist
dieselbe.
</p>
</slide>
</part>
<part>
<slide>
<title>RSS</title>
<p class="definition">
<em>Really Simple Syndication (RSS)</em>
ist XML-Format, das der Syndikatisierung
(Verbreitung) von Inhalten des WWW dient. Ziel ist
die einfache Weiterveröffentlichung der so
beschriebenen Inhalte auf anderen Seiten und / oder
die periodische Aktualisierung und Darstellung der
Inhalte für den Verbraucher.
</p>
</slide>
<slide>
<title>RSS - Geschichte</title>
<img
style="margin : 4% ; width : 60% ; "
src="RDFModel2.png" />
<ul>
<li>
RSS wurde ursprünglich von
<em>Netscape</em>
entwickelt, am 15. März 1999 wurde die
Spezifikation
<em>RDF Site Summary (RSS)</em>
0.90 veröffentlicht.
</li>
<li>
Direkt nach der Veröffentlichung dieser ersten
Version divergierte die Weiterentwicklung des
Standards in zwei Richtungen:
</li>
<ul>
<li>
Im Juli 1999 veröffentlichte Netscape die
RDF Site Summary (RSS) Version 0.91
</li>
<li>
Im Juni 2000 veröffentlichte
<a href="http://www.userland.com/">
UserLand Software
</a>
die RSS Version 0.91
</li>
</ul>
<li>
Hauptunterschied dieser Versionen: Konformität
zu RDF durch die RSS-Variante von Netscape. RDF
Site Summary wurde im Jahr 2000 in der
<a href="http://web.resource.org/rss/1.0/">
Version 1.0
</a>
veröffentlicht, seither wird daran jedoch nicht
mehr weiterentwickelt.
</li>
<li>
Im weiteren Verlauf wurde die Variante von
UserLand kontinuierlich weiterentwickelt,
wohingegen Netscape die Entwicklung an der
eigenen RSS Variante einstellte.
</li>
<li>
Die Spezifikation wird heute vom sog.
<em>RSS Advisory Board</em>
gepflegt.
</li>
<li>
Netscape übergabe seine Spezifikation
schließlich am an das RSS Advisory Board, das
heute als einzige Quelle für RSS gilt.
</li>
<li>
Derzeit aktuelle Version:
<a
href="http://www.rssboard.org/rss-specification">
RSS 2.0 (version 2.0.10)
</a>
vom 15. Oktober 2007.
</li>
</ul>
</slide>
<slide>
<title>RSS - Verwendung</title>
<ul>
<li>RSS findet heute sehr breite Verwendung.</li>
<li>
Eine Google-Suche nach RSS findet derzeit etwa
3.790.000.000 Treffer für den Suchbegriff RSS.
</li>
<li>
Der Einsatz von sogenannten RSS-Feeds erfolgt
hauptsächlich auf Webseiten, die
Nachrichteninhalte zur Verfügung stellen, sowie
auf Blogs.
</li>
<li>
RSS ist auch Grundlage für die sog.
<em>Podcasts</em>
, also das Anbieten von einer Reihe von
Mediendateien wie MP3 in einer Sammlung (
<em>Feed</em>
) über das Internet.
</li>
<li>
Eine Übersicht über eine Vielzahl in Deutschlang
angebotener RSS-
<em>Feeds</em>
findet sich auf der Webseite
<a href="http://www.rss-verzeichnis.de/">
RSS-Verzeichnis.de
</a>
oder
<a href="http://www.rss-nachrichten.de/">
RSS-Nachrichten.de
</a>
</li>
<li>
Für das Format existiert eine Vielzahl von
<em>Readern</em>
, eine Übersicht ist etwa auf der dortigen
<a
href="http://www.rss-verzeichnis.de/rss-reader.php">
RSS-Reader Webseite
</a>
zusammengestellt.
</li>
<li>
Auch aktuelle Browser (wie z.B. der
<a href="http://www.lunascape.tv/">Lunascape</a>
Web Browser) bringen umfangreiche Unterstützung
für das Format mit.
</li>
<li>
Das RSS Advisory Board bietet einen
<a
href="http://www.rssboard.org/rss-validator">
Validator-Service
</a>
für RSS-Dateien an.
</li>
</ul>
</slide>
<slide>
<title>RSS - ein Beispiel</title>
<listing src="RSS-Example.xml" />
<ul>
<li>
Alle in RSS definierten Elemente müssen reinen
Text als Inhalt haben und dürfen nicht mehr
weiter strukturiert sein (keine Kindelement!).
<br />
Einzige Ausnahme: das Element
<code>description</code>
, das aus HTML-Inhalt bestehen kann.
</li>
<li>
Die einzelnen Einträge des Feeds werden in Form
von
<code>item</code>
-Elementen verwaltet.
</li>
</ul>
</slide>
<slide>
<title>RSS - Beispiel</title>
<ul>
<li>
Eine RSS-Datei hat einen festen Aufbau. Die
gesamte Information ist im Wurzelelement
<code>rss</code>
versammelt. Das Wurzelelement beinhaltet als
Attribut die verwendete RSS-Version. Es muß
genau ein Kindelement
<code>channel</code>
besitzen.
</li>
<listing
src="RSS-tagesschau.xml"
line="3-14" />
<li>
Das
<code>channel</code>
Element muß mindestens aus folgenden drei
Kindelementen bestehen:
<ul>
<li>
<code>title</code>
: Der Name des angebotenen Channels.
</li>
<li>
<code>link</code>
: Eine URL, die auf die zum Channel
gehörende Webseite verweist.
</li>
<li>
<code>description</code>
: Beschreibung des Channels.
</li>
</ul>
<listing
src="RSS-tagesschau.xml"
line="1-17" />
Des weiteren kann es
<a
href="http://www.rssboard.org/rss-specification#optionalChannelElements">
weitere optionale Elemente
</a>
beinhalten, die weitere Informationen zum
angebotenen Feed beherbergen.
<listing
src="RSS-tagesschau.xml"
line="18-21" />
</li>
<li>
Ein
<code>item</code>
-Eintrag entspricht etwa einer Nachricht /
Schlagzeile einer Zeitung. Seine Beschreibung (
<code>description</code>
ist eine Zusammenfassung des Geschehnisses oder
der komplette Text in HTML. Das Kindelement
<code>link</code>
verweist auf eine ausführliche Beschreibung.
<br />
Alle Kindelemente von
<code>item</code>
sind optional. Mindestens Titel oder
Beschreibung müssen jedoch vorhanden sein.
<br />
Weitere mögliche Kindelemente:
<code>author</code>
(E-Mail-Adresse),
<code>category</code>
,
<code>comments</code>
,
<code>enclosure</code>
(verbundenes Medienobjekt),
<code>guid</code>
(Eindeutiger Bezeichner),
<code>pubDate</code>
, und
<code>source</code>
(Quell-RSS-Channel).
<listing
src="RSS-tagesschau.xml"
line="22-44" />
</li>
</ul>
</slide>
<slide>
<title>RSS - komplettes "Tagesschau"-Beispiel</title>
<listing src="RSS-Tagesschau.xml" />
</slide>
</part>
</presentation>
<!-- Ende RDF und RSS -->
<!-- XSLT -->
<presentation id="xslt">
<title short="XSLT">
Transformation von XML-Dokumenten: XSL Transformations
</title>
<date>2009-01-12</date>
<toc id="resources">
<a href="http://www.w3.org/Style/XSL/">
W3C Webseite zu XSL
</a>
,
<a href="http://www.w3.org/TR/xslt20/">
XSLT Spezifikation
</a>
</toc>
<toc id="abstract">
Weil eine XML-Sprache ein bestimmtes Vokabular
repräsentiert, kommt oft der Wunsch auf, verschiedene
Vokabulare in etwas anderes zu transformieren. Dies kann
entweder ein anderes XML-Vokabular sein (zum Beispiel beim
Datenaustausch), oder beispielsweise auch HTML (zum
Publizieren von Daten im Web). Mit
<em>XSL Transformations (XSLT)</em>
können solche Abbildungen leicht erstellt werden. XSLT macht
sich die Mächtigkeit von XPath zunutze und setzt es in der
recht einfach zu verwendenden Programmiersprache ein. Die
Programme in XSLT werden oft auch
<em>Stylesheets</em>
genannt. Einfache Aufgaben können mit XSLT ohne viel
Programmierarbeit erledigt werden. Es wird ausschließlich
spezifiziert, wie die Bestandteile einer Ausgangssprache in
die Bestandteile einer Zielsprache abgebildet werden sollen.
Dennoch stellt XSLT eine Turing-vollständige
Programmiersprache dar.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract"></toc>
</p>
</slide>
<part>
<title>XSLT</title>
<slide>
<title>XSLT - eine Übersicht</title>
<ul>
<li>
XSLT ist eine funktionale Programmiersprache.
</li>
<li>XSLT verwendet XML Syntax.</li>
<li>XSLT ist eine schwach typisierte Sprache.</li>
<li>
XSLT wurde nicht dafür entworfen, große
Programmieraufgaben damit durchzuführen.
</li>
<li>
XSLT ist
<em>die</em>
Sprache, um XML in XML zu transformieren.
</li>
<li>XSLT ist ziemlich einfach.</li>
</ul>
</slide>
<slide>
<title>
XSLT - eine funktionale Programmiersprache
</title>
<p>
Man unterscheidet üblicherweise zwei
Programmierparadigmen.
</p>
<ul>
<li>
Imperative Programmierung: Ein Computerprogramm
besitzt / befindet sich in einem bestimmten
<em>Zustand</em>
, der sich aus der Belegung von Variablen
(Speicherbereich) und einem Programmzähler
zusammensetzt. Dieser Zustand wird durch
<em>Befehle</em>
verändert. Die Reihenfolge der Befehle steuert
die zeitliche Abfolge des Programms.
</li>
<li>
Deklarative Programmierung: Basis für die
deklarative Programmierung sind mathematische
Theorien und Konzepte. Eine Lösung wird
ausschließlich beschrieben. Es wird keine Angabe
darüber gemacht, wie die Lösung berechnet werden
soll.
</li>
</ul>
<p>
Die
<em>objektorientierte Programmierung</em>
läßt sich nicht in diese Klassifizierung einordnen,
sie ist hierzu orthogonal (vgl.
<a
href="https://www.informatik.uni-stuttgart.de/fmi/szs/teaching/ws0506/info3/einfuehrung-2x2.pdf">
Einführung in die Informatik von Barbara König
</a>
). Es gibt sowohl imperative objektorientierte
Sprachen (z.B. Java, C++) als auch deklarative
objektorientierte Sprachen (z.B. OCaml).
</p>
<p>
Die
<em>funktionale Programmierung</em>
ist der deklarativen Programmierung zuzuordnen.
<br />
Als Grundlage dient der Begriff der
<em>Funktion</em>
, der stark auf dem Funktionsbegriff der Mathematik
basiert. Eine Funktion besitzt einen
Definitionsbereich, einen Wertebereich, sowie eine
Abbildungsvorschrift (Aufzählung von Wertepaaren
oder Funktionsgleichung). Eine Funktionsgleichung
besitzt auf der linken Seite Variablen, die mit
Werten aus dem Definitionsbereich belegt werden
können. Auf der rechten Seite steht ein Ausdruck mit
Konstanten (z.B. e, Pi) und Funktionen. Beispiel:
<code>
K(r) = pi * r
<sup>2</sup>
</code>
. In einer funktionalen Programmiersprache kann
diese Funktion auf die gleiche Art und Weise
definiert und benutzt werden wie in der Mathematik.
(Quelle: Martin Erwig: Grundlagen funktionaler
Programmierung, Oldenbourg Verlag, ISBN
3-486-25100-7)
</p>
</slide>
<slide>
<title>
XSLT - eine funktionale Programmiersprache
</title>
<p>Eigenschaften funktionaler Programmiersprachen</p>
<ul>
<li>
Es gilt die
<em>referenzielle Transparenz</em>
: Ein und dieselbe Variable bezeichnet (an
verschiedenen Stellen ihres Geltungsbereichs)
immer den gleichen Wert.
</li>
<li>
In imperativen Programmiersprachen ist dieses
Prinzip verletzt.
<br />
Beispiel:
<code>i=i+1</code>
. Mathematisch eine nicht erfüllbare Aussage,
steht in imperativen Programmiersprachen das
<code>i</code>
links des Gleichheitszeichens etwa für eine
<code>8</code>
, das
<code>i</code>
rechts des Gleichheitszeichens hingegen für eine
<code>7</code>
.
</li>
<li>
In funktionalen Programmiersprachen gibt es
keine Zuweisungen an Variablen.
</li>
<li>
Funktionale Programme bestehen aus Werte- und
Funktionsdefinitionen.
</li>
<li>
Es gibt in funktionalen Programmiersprachen
keine Schleifen wie
<code>while</code>
oder
<code>for</code>
.
</li>
<li>
Dafür gibt es
<code>if-then-else</code>
.
</li>
<li>
Das wichtigste Kontrollinstrument ist die
Rekursion.
</li>
<li>
Nebeneffekte / Seiteneffekte kommen in
funktionalen Programmiersprachen nicht vor.
</li>
</ul>
</slide>
<slide>
<title>XSLT - Verarbeitungsmodell</title>
<img
style="margin : 4% ; width : 90% ; "
src="xslt-model.png">
</img>
<p>
Quelle:
<a href="http://dret.net/lectures/xml-fall07/">
XML-Vorlesung
</a>
von
<a href="http://dret.net/netdret/">Erik Wilde</a>
</p>
</slide>
<slide>
<title>Ein erstes XSLT-Programm</title>
<listing src="first-xslt.xml"></listing>
<ul>
<li>Beobachtungen</li>
<ul>
<li>
Es handelt sich zweifelsfrei um ein
XML-Dokument.
</li>
<li>
Der
<a
href="http://www.w3.org/TR/xslt20/#xslt-namespace">
XSLT-Namensraum
</a>
wird verwendet.
</li>
<li>
Es besteht ausschließlich aus dem
Wurzelelement.
</li>
<li>
Es sind keine weiteren Anweisungen darin
vorhanden.
</li>
<li>
Wenn es ausgeführt wird, liefert es ein
Ergebnis [sic!].
</li>
</ul>
</ul>
</slide>
<slide>
<title>Ein erstes XSLT-Programm - Ausführen</title>
<ul>
<li>Ausführen des Programms</li>
<ul>
<li>
Benötigt wird ein XSLT Prozessor. Empfohlen
wird
<a href="http://saxon.sourceforge.net/">
Saxon-B
</a>
(von
<a href="http://www.saxonica.com/">
Michael Kay
</a>
).
</li>
<li>
Außerdem benötigen Sie eine Java-Umgebung
(Der Saxon-Autor empfieht JDK 1.5).
</li>
<li>
Zur Transformation brauchen Sie noch ein
XML-Quelldokument sowie ein Stylesheet
(beispielsweise unser eben erarbeitetes XSLT
Stylesheet).
</li>
<li>
Saxon kann auf verschiedene Art und Weise
gestartet werden, unter anderem von der
Kommandozeile aus. Der Befehl hierfür lautet
(für Saxon-B Version 8):
</li>
<listing
src="saxon-command.txt"
line="1">
</listing>
<li>
Möchte man das eben erarbeitete erste
Stylesheetdokument auf unsere erweiterte
Projektverwaltung anwenden, lautet der
Befehl folgendermaßen:
</li>
<listing
src="saxon-command.txt"
line="2">
</listing>
</ul>
</ul>
</slide>
<slide>
<title>Ein erstes XSLT-Programm - Das Ergebnis</title>
<ul>
<li>
Nach Anwendung des Stylesheets erhalten wir ein
Ergebnis. (
<a href="transformationsergebnis.txt">
Download des Transformationsergebnisses
</a>
)
</li>
<li>
Der
<q>Text</q>
des Dokuments erscheint im Ergebnisdokument.
</li>
<li>
Wie funktioniert das, wo doch im
Beispiel-Stylesheet keinerlei
Transformationsregeln angegeben sind?
</li>
<li>
XSLT hat eingebaute
<q>
<a
href="http://www.w3.org/TR/xslt20/#built-in-rule">
Vorgaberegeln
</a>
</q>
.
</li>
<ul>
<li>Es traversiert den Dokumentbaum.</li>
<li>Dabei kopiert es alle Textknoten.</li>
<li>
Der Dokumentbaum wird rekursiv
durchschritten.
</li>
</ul>
<li>
Es ist möglich, komplexe Transformationen für
ein Eingabedokument durchzuführen, indem diese
Vorgaben überschrieben und eigene Regeln
definiert werden.
</li>
</ul>
</slide>
<slide>
<title>XSLT - Transformationsschablonen</title>
<img
style="margin : 4%"
src="xsltTemplate.gif">
</img>
<ul>
<li>
Üblicherweise besteht ein XSLT-Programm aus
verschiedenen Transformationsschablonen.
</li>
<li>
Eine solche Schablone besteht aus einem
<em>Lokalisierungspfad</em>
und einem
<em>Ersetzungsmuster</em>
.
</li>
<li>
Der Lokalisierungspfad wird durch eine
eingeschränkte Variante von XPath gebildet.
Ergebnis ist eine Knotenmenge.
</li>
<li>
Im Rumpf der Schablone legt das Ersetzungsmuster
diejenige Zeichenfolge fest, die statt jedem
Element der gefundenen Knotenmenge ausgegeben
werden soll.
</li>
</ul>
</slide>
<slide>
<title>Ein zweites XSLT-Programm</title>
<listing src="zweites-xslt.xsl"></listing>
<ul>
<li>
Der XSLT-Prozesor durchläuft den Dokumentbaum
rekursiv und
<q>findet</q>
automatisch die richtigen Knoten. Die Ausführung
des Codes wird durch den XSLT-Prozessor
kontrolliert, er wendet die
<q>Regeln</q>
an.
</li>
<li>
Ausgabe von Text statt XML-Strukturen (
<code>xsl:text</code>
)
</li>
<li>
Wendet man dieses Stylesheet auf das
Projektverwaltungsbeispiel an, so erhält man
dreimal die Ausgabe
<code>Person gefunden!</code>
; für jedes Auftreten des Knotens Person in der
Eingabe. (
<a href="transformationsergebnis.2-txt">
Download des Transformationsergebnisses
</a>
)
</li>
<listing src="transformationsergebnis-2.txt"></listing>
</ul>
</slide>
<slide>
<title>XSLT - Anweisungen</title>
<ul>
<li>
XSLT hat eine übersichtliche Anzahl von
Anweisungen (vgl.
<a
href="http://www.w3.org/TR/xslt20/#element-syntax-summary">
Zusammenfassung aller XSLT-Anweisungen
</a>
)
</li>
<li>
Es wurde für einen bestimmten Zweck entwickelt.
</li>
<li>
XPath zeichet für einen Großteil der Mächtigkeit
von XSLT verantwortlich.
</li>
<li>
XSLT kann über Knotenmengen iterieren, andere
Probleme müssen rekursiv gelöst werden.
</li>
<li>
XSLT hat auch konditionale Anweisungen (
<code>xsl:if</code>
und
<code>xsl:choose</code>
). Diese sollten jedoch nur für einfache
Bedingungen verwendet werden. Tiefe
Schachtelungen und lange Bedingungen werden
schnell zum Problem (Lesbarkeit, Performance).
</li>
<li>
Alles in allem ist XSLT eine einfache
Programmiersprache.
</li>
<li>
XPath ist esentiell und muß von einem
XSLT-Programmierer beherrscht werden.
</li>
<li>
Wie in jeder anderen Programmiersprache gilt:
Übung macht den Meister!
</li>
</ul>
</slide>
<slide>
<title>Ein drittes XSLT-Programm</title>
<listing src="drittes-xslt.xsl"></listing>
<ul>
<li>
Verwenden des
<code>xsl:stylesheet</code>
-Elements anstatt des
<code>xsl:transform</code>
-Elements. Die beiden Elemente sind synonym -
beiden können gleichsinnig verwendet werden.
</li>
<li>
Wiederum Ausgabe von Text. (
<a href="transformationsergebnis-3.txt">
Download des Transformationsergebnisses
</a>
)
</li>
<li>Erste Schablone:</li>
<ul>
<li>
Der Lokalisierungspfad trifft zum einen auf
das Document-Element (
<code>/</code>
) zu, zum anderen auf beliebige Elemente
innerhalb eines Dokuments (
<code>*</code>
).
</li>
<li>
Das Ersetzungsmuster gibt den Text
<code>
( Element
<em>Elementname</em>
</code>
) aus. Anschließend wird der Prozessor
veranlaßt, Attribute und Kindelemente zu
verarbeiten.
</li>
</ul>
<li>Zweite Schablone:</li>
<ul>
<li>
Der Lokalisierungspfad der zweiten Schablone
trifft auf alle Attribute zu (
<code>@*</code>
).
</li>
<li>
Ausgegeben wird der Text
<code>Attribute:</code>
gefolgt vom Namen des Attributs
</li>
</ul>
<li>
Das Durchlaufen des Quelldokumentbaumes ist
leicht durch Rekursion (
<code>xsl:apply-templates</code>
) zu bewerkstelligen, die meiste Arbeit
übernimmt der XSLT-Prozessor selbst.
</li>
<ul>
<li>
Versuchen Sie nicht, dieses
Verarbeitungsmuster mit Gewalt zu
durchbrechen oder zu umgehen (XSLT gibt
Ihnen die Mittel hierfür durchaus an die
Hand)!
</li>
<li>
Dies rächt sich mit undurchschaubarem
Spaghetticode.
</li>
<li>Auch die Performanz leidet erheblich!</li>
</ul>
<li>Transformationsergebnis:</li>
<listing src="transformationsergebnis-3.txt"></listing>
</ul>
</slide>
<slide>
<title>Eine Variante des dritten XSLT-Programms</title>
<listing src="drittes-xslt-v2.xsl"></listing>
<ul>
<li>
In diesem Beispiel sehen Sie eine alternative
Möglichkeit zur Ausgabe von Text angewendet.
</li>
<li>
Text kann nicht nur durch das Element
<code>xsl:text</code>
ausgegeben werden, sondern einfach dadurch, daß
der gewünschte Text in die Elementschablone
hineingeschrieben wird.
</li>
<li>
(
<a href="transformationsergebnis-3-v2.txt">
Download des Transformationsergebnisses
</a>
)
</li>
<listing src="transformationsergebnis-3-v2.txt"></listing>
</ul>
</slide>
<slide>
<title>XSLT - Erzeugen einer XML-Ausgabe</title>
<listing src="viertes-xslt.xsl"></listing>
<ul>
<li>
Im obigen Beispiel wird jedes Element des Typs
<code>Person</code>
durch ein leeres
<code>Mitarbeiter</code>
-Element ersetzt.
</li>
<li>
Üblicherweise werden in XSLT-Programmen alle
XSLT-Elemente durch Namensraumpräfix
qualifiziert. Würde der Vorgabenamensraum mit
der Namensraum-URI der XSL-Transformations
belegt, so befände sich auch jedes XML-Element
und -Attribut innerhalb des Ersetzungsmusters in
diesem Namensraum. Als Konsequenz würde der
XSLT-Prozessor die Transformation wegen des
Auftretens ungültiger (d.h. nicht in der
XSLT-Sprache enthaltener) Elemente ablehnen.
</li>
<li>
Das Ergebnis der obigen Transformation ist
dreifach das leere Element
<code>Mitarbeiter</code>
anstelle der
<code>Person</code>
en-Elemente der Eingabe. (
<a href="transformationsergebnis-4.txt">
Download des Transformationsergebnisses
</a>
)
</li>
<li>
Achtung: Für das Ersetzungsmuster gilt lediglich
die Regel, daß alle Elemente geschlossen werden
müssen und eine korrekte Schachtelung der
Elemente vorliegen muß. Das Ergebnisdokument im
Beispiel ist
<em>kein</em>
wohlgeformtes XML-Dokument, da ihm das
Wurzelelement fehlt. Der Programmierer des
Stylesheets trägt die Verantwortung dafür, für
eine XML-Ausgabe wohlgeformte XML-Dokumente zu
erzeugen.
</li>
<listing src="transformationsergebnis-4.txt"></listing>
</ul>
</slide>
<slide>
<title>
XSLT - Übernehmen von textuellen Werten aus dem
Quelldokument (
<code>xsl:value-of</code>
)
</title>
<listing src="fuenftes-xslt.xsl"></listing>
<ul>
<li>
Oft sollen bei einer Transformation textuelle
Werte aus der Eingabe in die Ausgabe übernommen
werden.
</li>
<li>
Die XSLT-Anweisung
<code>xsl:value-of</code>
erlaubt dies.
</li>
<ul>
<li>
Die Textknoten, die in die Ausgabe
übernommen werden sollen, werden durch den
XPath-Ausdruck des
<code>select</code>
-Attributs ausgewählt.
</li>
</ul>
<li>
Im Ergebnisdokument liegen alle
<b>Textknoten</b>
vor, die innerhalb des durch den XPath
ausgewählten Knotens vorkommen. Dies schließt
auch Text aus dessen Kindelementen mit ein. (
<a href="transformationsergebnis-5.txt">
Download des Transformationsergebnisses
</a>
)
</li>
<listing src="transformationsergebnis-5.txt"></listing>
</ul>
</slide>
<slide>
<title>
XSLT - Übernehmen vollständiger Elemente aus dem
Quelldokument (
<code>xsl:copy-of</code>
)
</title>
<listing src="sechstes-xslt.xsl"></listing>
<ul>
<li>
Das obige Beispiel benennt aller Elemente des
Types
<code>Person</code>
in
<code>Mitarbeiter</code>
um.
</li>
<li>
Im
<code>select</code>
-Ausdruck der Schablone ist in diesem Beispiel
die in XSLT optionale
<code>descendant</code>
-Achse (
<code>//</code>
) mit angegeben.
</li>
<li>
<code>copy-of</code>
übernimmt ein vollständiges Element
einschließlich der Auszeichnungssymbole
unverändert in die Ausgabe.
</li>
<li>
Des weiteren wird im
<code>select</code>
-Attribut des
<code>copy-of</code>
-Elements die
<code>child</code>
-Achse verwendet.
</li>
<ul>
<li>
Die Schablone erstellt eine Knotenmenge mit
Personen-Knoten.
</li>
<li>
Würde die
<code>child</code>
-Achse nicht angegeben und stattdessen die
<code>self</code>
-Achse verwendet, würden auch die
Personen-Knoten selbst in die Ausgabe
übernommen werden.
</li>
</ul>
<li>
(
<a href="transformationsergebnis-6.txt">
Download des Transformationsergebnisses)
</a>
</li>
</ul>
</slide>
<slide>
<title>Wie funktionieren Abbildungen?</title>
<ul>
<li>
Alle XSLT-Elemente (
<code>xsl:......</code>
) in der Schablone stellen Anweisungen dar.
</li>
<ul>
<li>
Sie werden ausgeführt und haben ein
bestimmtes Verhalten.
</li>
<li>
Ihre Ergebnisse werden in den Ergebnisbaum
übernommen.
</li>
<li>
<code>apply-templates</code>
hat eine Sonderrolle - es wählt Knoten aus,
die verarbeitet werden sollen.
</li>
</ul>
<li>
Alle nicht-XSLT-Elemente werden als sogenannte
<em>Literale Ergebniselemente</em>
betrachtet.
</li>
<ul>
<li>
Sie werden als Elementknoten in den
Ergebnisbaum übernommen.
</li>
<li>
Ihr Inhalt wird vom XSLT-Prozessor weiter
verarbeitet.
</li>
<li>
Sie können XSLT-Elemente oder
nicht-XSLT-Elemente beinhalten.
</li>
</ul>
<li>
Ein XSLT-Programm besteht aus mehreren
Schablonen.
</li>
<ul>
<li>
Die einzelnen Schablonen bilden jeweils
Teilbäume des Quelldokuments ab.
</li>
<li>
Das
<code>match</code>
-Attribute definiert, welche Knoten des
Quelldokuments durch ein Template bearbeitet
werden. Für jeden Knoten, der so ausgewählt
wird, wird die Schablone ausgeführt /
angewendet. Der jeweils ausgewählte Knoten
stellt den Kontext für die Ausführung der
Schablone dar (d.h. XPath-Ausdrücke
innerhalb der Schablone werden relativ zu
diesem Knoten ausgewertet).
</li>
<li>
Der Abbildungsprozess wird im Prinzip durch
das Quelldokument gesteuert.
</li>
<li>
Dies benötigt eine gewisse Einarbeitungszeit
des Programmierers.
</li>
</ul>
</ul>
</slide>
<slide>
<title>Schablonenauswahl</title>
<ul>
<li>
Schablonen können durch folgende Ausdrücke
miteinander verbunden werden
</li>
<ul>
<li>
<code>xsl:apply-templates</code>
wählt zunächst die Knoten aus, die
verarbeitet werden sollen.
</li>
<li>
Der XSLT Prozessor wählt die
<q>am besten geeignete</q>
Schablone und führt sie aus.
</li>
<li>
Wenn es keine explizite Schablone gibt wird
stattdessen eine der vordefinierten
Schablonen verwendet.
</li>
<ul>
<li>
Für Elemente wird der
zeichenketten-artige Elementinhalt als
Text in die Ausgabe übernommen.
</li>
<li>
Für Attribute wird der normalisierte
Attributwert als Text in die Ausgabe
übernommen.
</li>
<li>
Textknoten werden als Text in die
Ausgabe übernommen (vgl. erstes Beispiel
zu XSLT).
</li>
<li>
Processing-Instructions, Kommentare und
Namensraumknoten werden ignoriert.
</li>
</ul>
<li>
XSLT unterstützt inkrementelle Entwicklung.
</li>
<ul>
<li>
Es ist immer möglich, dem Programm
spezialisiertere Schablonen
hinzuzufügen.
</li>
<li>
Die anderen Schablonen müssen dazu nicht
geändert werden.
</li>
</ul>
</ul>
</ul>
</slide>
<slide>
<title>Konfliktauflösung (1/5)</title>
<ul>
<li>
Konflikte zwischen den Schablonen sind
Bestandteil der Sprache
</li>
<ul>
<li>
Jede anwenderdefinierte Schablone steht im
Wettbewerb zu einer vordefinierten
Schablone.
</li>
<li>
Konfliktauflösung ist ein grundlegendes
Konzept in XSLT.
</li>
</ul>
<li>Wenn mehrere Schablonen zutreffen...</li>
<ul>
<li>
... dann wird in vielen Fällen die
<q>spezifischste</q>
Schablone ausgewählt. (Daumenregel)
</li>
<li>Die Transformation</li>
<listing src="siebtes-xslt.xsl"></listing>
<li>liefert folgendes Ergebnis:</li>
<listing src="ergebnis-konfliktloesung.xml"></listing>
</ul>
</ul>
</slide>
<slide>
<title>Konfliktauflösung (2/5)</title>
<ul>
<li>
Grundlage für diese Auswahl ist die Berechnung
einer internen Priorität für jede Schablone.
</li>
<li>
Die Schablone mit der höchsten Priorität
gewinnt.
</li>
<li>
Für die Berechnung der Priorität gelten unter
anderem folgende
<a
href="http://www.w3.org/TR/xslt20/#conflict">
Regeln
</a>
.
</li>
<ul>
<li>
Mit
<code>oder</code>
verknüpfte XPath-Ausdrücke im
<code>match</code>
-Attribut werden als verschiedene
unterschiedliche Schablonen behandelt.
</li>
<li>
Der Wildcard-Ausdrück
<code>*</code>
erhält die Priorität
<code>-0.5</code>
</li>
<li>
Qualifizierte Namen und Processing
Instructions erhalten die Priorität
<code>0</code>
.
</li>
<li>
Schablonen mit XPath Ausdrücken, die nach
Elementnamen und -typen auswählen, erhalten
die Priorität
<code>0.25</code>
.
</li>
<li>
Spezifischere Ausdrücke (z.B. Ausdrücke mit
Prädikaten sowie Ausdrücke, die Vorfahren
beinhalten) erhalten die Priorität
<code>0.5</code>
</li>
</ul>
</ul>
</slide>
<slide>
<title>Konfliktauflösung (3/5)</title>
<ul>
<li>
Desweiteren haben aus anderen Stylesheets
importierte Schablonen einen niedrigere
Priorität als die im aktuellen Stylesheet
definierten.
</li>
<img
src="xslt-import-precedence.png"
style="margin : 4% ; width : 90% ; ">
</img>
<p>
Quelle:
<a
href="http://dret.net/lectures/xml-fall07/">
XML-Vorlesung
</a>
von
<a href="http://dret.net/netdret/">
Erik Wilde
</a>
</p>
</ul>
</slide>
<slide>
<title>Konfliktauflösung (4/5)- Beispiel</title>
<ul>
<li>Gegeben sei folgendes Eingabedokument</li>
</ul>
<listing src="conflict-resolution.xml"></listing>
<ul>
<li>
Wendet man hierauf die folgende Transformation
an...
</li>
</ul>
<listing src="conflict-resolution.xsl"></listing>
<ul>
<li>
...so erhält man vom XSLT-Prozessor folgende
Fehlermeldung:
</li>
</ul>
<listing
src="fehler-bei-konflikt.txt"
line="3-7">
</listing>
</slide>
<slide>
<title>
Konfliktauflösung (5/5)- manuelle Angabe von
Prioritäten
</title>
<ul>
<li>
In den seltenen Fällen, in denen der Prozessor
Konflike nicht selbst auflösen kann, ist
manuelles Eingreifen nötig.
</li>
<li>
Zu diesem Zweck können für Schablonen explizit
Prioritäten angegeben werden.
</li>
<li>
<code>
<xsl:template match="..."
priority="1">
</code>
</li>
<li>
Folgendes Listing ist leicht abgeändert zum
vorherigen Beispiel. Es gibt auf der
Kommandozeile (
<code>xsl:message</code>
) aus, welche Schablone für die Transformation
verwendet wurde.
</li>
<listing src="conflict-resolution-priority.xsl"></listing>
<li>Der Aufruf des Templates...</li>
<listing
src="conflict-resolution-ausgabe-mit-message.xml"
line="3">
</listing>
<li>
...erzeugt folgende Ausgabe auf der
Kommandozeile:
</li>
<listing
src="conflict-resolution-ausgabe-mit-message.xml"
line="4">
</listing>
</ul>
</slide>
<slide>
<title>Tracing-Information</title>
<ul>
<li>
Eine andere Möglichkeit, die einzelnen Schritte
des XSLT Prozessors Saxon nachzuverfolgen, ist
es, mit dem Schalter
<code>-T</code>
die Ausgabe von Tracing-Information zu
aktivieren.
</li>
<li>Der Aufruf...</li>
<listing
src="conflict-resolution-trace.xml"
line="2-3">
</listing>
<li>
...erzeugt folgende Ausgabe auf der
Kommandozeile:
</li>
<listing
src="conflict-resolution-trace.xml"
line="4-15">
</listing>
</ul>
</slide>
<slide>
<title>
<em>shallow copy</em>
von Elementen
</title>
<ul>
<li>
Folgendes Beispiel erweitert die letzten
Transformation der Projektverwaltung um zwei
weitere Schablonen.
</li>
<listing src="achtes-xslt.xsl"></listing>
<li>
Eine Schablone für alle
<code>Qualifikationsprofil</code>
-Knoten, ohne Ersetzungsmuster. In der
Konsequenz wird dieses Element sowie der
Teilbaum darunter nicht in die Ausgabe
übernommen.
</li>
<li>
Eine Schablone für alle anderen Knoten. Sie
trifft auf alle Knoten außer dem Wurzelknoten zu
(
<code>node()</code>
-Funktion) sowie auf alle Attributeknoten (
<code>attribute::*</code>
).
</li>
<li>
Die zweite Schablone verwendet das Element
<code>xsl:copy</code>
. Es übernimmt das aktuelle Element in das
Ergebnis und läßt dabei eventuelle Kindelemente
außer acht. Dies wird auch als
<em>shallow copy</em>
bezeichnet
</li>
</ul>
</slide>
<slide>
<title>
Steuerung der Transformationsreihenfolge durch
<code>apply-templates</code>
</title>
<ul>
<li>
Standardmäßig durchläuft ein XSLT-Prozessor den
aus dem Eingabedokument erzeugten Baum ausgehend
vom Wurzelknoten in
<em>preorder</em>
Reihenfolge und sucht die geeigneten Schablonen
aus.
</li>
<li>
Es ist möglich, mit Hilfe des Befehls
<code>xsl:apply-templates</code>
darauf Einfluß zu nehmen.
</li>
<li>
Trifft der Prozessor auf diesen Befehl, versucht
er, weitere passende Schablonen zu den
angegebenen XPath-Ausdrüken zu finden. Diese
werden an der gegebenen Stelle ausgewertet
(=Substitution).
</li>
<listing src="achtes-xslt.xsl"></listing>
<li>
Nachdem ein
<code>Person</code>
en-Knoten in der Eingabe gefunden wurde und das
öffnende Tag
<code>Mitarbeiter</code>
ausgegeben wurde, wird nach weiteren Knoten im
Eingabedokument gesucht, auf die Schablonen im
XSLT-Programm zutreffen.
</li>
<li>
Dies ist für alle Attribute und Kindknoten von
Person der Fall, da sie durch den
Lokalisierungspfad
<code>attribute::*|node()</code>
zugänglich sind.
</li>
<li>
So wird innerhalb des neu erzeugten Elements
Mitarbeiter des Ausgabestroms das
Ersetzungsmuster ausgeführt, das die Elemente
und Attribute mit ihren Inhalten unverändert
übernimmt.
</li>
<li>
Als Besonderheit nutzt das
<code>apply-templates</code>
-Element im „allgemeinen“ (dritten) Template das
Attribut
<code>select</code>
. Es erlaubt dem Programmierer, die Knoten
auszuwählen, für die nach weiteren passenden
Schablonen gesucht werden soll.
</li>
<li>
<a href="transformationsergebnis-8.txt">
Download des Transformationsergebnisses
</a>
</li>
<listing src="transformationsergebnis-8.txt"></listing>
</ul>
</slide>
<slide>
<title>
Benannte Ersetzungsschablonen und Parameterübergabe
</title>
<ul>
<li>
Es ist in XSLT auch möglich, benannte Schablonen
ohne
<code>match</code>
-Attribut zu definieren.
</li>
<li>
Diese werden vom Prozessor nicht automatisch
aufgerufen, sondern müssen explizit durch den
Befehl
<code>xsl:call-template</code>
aufgerufen werden.
</li>
<li>
Dies entspricht Funktionsaufrufen in anderen
Programmiersprachen.
</li>
<li>
Die Definition benannter Schablonen beinhaltet
statt des
<code>match</code>
-Attributs einen eindeutigen Namen.
</li>
<listing
src="benannte-schablonen.xsl"
line="3-4">
</listing>
<li>
Des weiteren können Parameter an (benannte und
unbenannte) Schablonen übergeben werden.
</li>
<li>
Als Parameter können beliebige
Dokumentbestandteile als Knotenmenge, Ergebnisse
von Funktionsausdrücken oder Konstanten
übergeben werden.
</li>
<li>
Eine Parameterrückgabe ist nicht möglich, sie
wird durch den Anteil der Schablone an der
Ausgabe realisiert.
</li>
<listing
src="benannte-schablonen.xsl"
line="8-10">
</listing>
</ul>
</slide>
<slide>
<title>Beispiel Parameterübergabe</title>
<ul>
<li>
Das folgende Beispiel definiert eine Schablone
für einen numerierten Block. Der Parameter gibt
das Format der Numerierung an.
</li>
<listing
src="benannte-schablonen.xsl"
line="12-24">
</listing>
<li>
Der Elementinhalt
<code>1.</code>
des Elements
<code>xsl:param</code>
innerhalb der Schablone namens
<code>numbered-block</code>
dient als
<em>Vorgabewert</em>
für den
<code>format</code>
-Parameter. Wird in der Parameterübergabe kein
Wert definiert, dann wird dieser Vorgabewert
verwendet.
</li>
<li>
In unserem Fall wird in der ersten Schablone
jedoch der Wert
<code>a.</code>
übergeben, als Inhalt des
<code>format</code>
-Parameters
<code>xsl:with-param</code>
. Der übergebene Wert
<q>sticht</q>
den vorgegebenen Wert.
</li>
</ul>
</slide>
<slide>
<title>
Bedingte Verarbeitung (1/2) -
<code>xsl:if</code>
</title>
<ul>
<li>
Mit Hilfe der
<code>xsl:if</code>
-Anweisung ist es möglich, bedingte Anweisungen
in XSLT-Programmen zu nutzen.
</li>
<li>
Der Inhalt der
<code>xsl:if</code>
-Anweisung wird nur dann vom Prozessor
bearbeitet, wenn die im
<code>test</code>
-Attribut formulierte Boole'sche Bedingung wahr
ist
</li>
<li>Die Syntax ist wie folgt:</li>
<listing
src="xsl-if.xsl"
line="3">
</listing>
<li>
Nachfolgendes Beispiel zeigt, wie die Anweisung
angewendet werden kann. Für
<code>Person</code>
en, die mehr als einen
<code>Vorname</code>
n haben, wird auf der Kommandozeile der
angegebene Text (unter Auswertung des Inhalts
von
<code>Nachname</code>
) ausgegeben.
<br />
Besonderheit: Der Vergleichs-Operator
<code>></code>
wird durch die Zeichenfolge
<code>&gt;</code>
ersetzt, da Auszeichnunssymbole in
Attributwerten in XML bekanntermaßen nicht
erlaubt sind.
</li>
<listing src="xsl-if-2.xsl"></listing>
<li>
Die Ausgabe auf der Kommandozeile ist wie folgt:
</li>
<listing
src="ergebnis-xsl-if-2-kommandozeile.txt"
line="3-4">
</listing>
<li>
Angewendet auf die Projektverwaltung erhält man
folgendes Ergebnis (unverändert zum
<a href="xslt.html#(27)">vorherigen Beispiel</a>
):
</li>
<listing src="ergebnis-xsl-if-2.txt"></listing>
</ul>
</slide>
<slide>
<title>
Bedingte Verarbeitung (2/2) -
<code>xsl:choose</code>
</title>
<ul>
<li>
Mit Hilfe der
<code>xsl:choose</code>
-Anweisung wird Mehrfachselektion möglich.
</li>
<li>
Außerdem kann damit eine einfache
<code>if-then-else</code>
-Struktur abgebildet werden.
</li>
<li>Die Syntax ist wie folgt:</li>
<listing
src="xsl-choose.xsl"
line="3-11">
</listing>
<li>
Ein Beispiel: Gegeben sei folgendes
Quelldokument, das die Bevölkerungszahl der
europäischen Länder in Millionen Einwohner
versammelt:
</li>
<listing src="europe-nations.xml"></listing>
<li>
Folgende Transformation verwendet die
<code>xsl:choose</code>
-Anweisung um abhängig von der Bevölkerungszahl
des jeweiligen Landes den Namen des Landes
auszugeben oder den Text
<code>(-- zu klein --)</code>
.
</li>
<listing src="europe-nations.xsl"></listing>
<li>
Die Transformation liefert folgendes Ergebnis:
</li>
<listing src="ergebnis-nations.txt"></listing>
<li>
Quelle:
<a
href="http://europa.eu/abc/keyfigures/sizeandpopulation/howmany/index_de.htm">
Webseite der Europäischen Union
</a>
</li>
<li>
Beispiel angelehnt an
<a
href="http://www.oreilly.com/catalog/learnxslt/">
<em>Fitzgerald, Michael</em>
: Learning XSLT, A Hands-On Introduction to
XSLT and XPath, O-Reilly-Verlag, 2004, S.
212ff.
</a>
</li>
</ul>
</slide>
<slide>
<title>
Ein umfangreiches Beispiel - Erzeugen eines
XHTML-Reports aus der erweiterten Projektverwaltung
</title>
<ul>
<li>
Das Beispiel wird nachfolgend Schritt für
Schritt aufgebaut und erklärt.
</li>
<li>
Als erstes wird der XHTML-Dokumentrahmen bei
Auftreten des Dokumentknotens (Suchmuster
<code>/</code>
) erzeugt.
</li>
<li>
Nach dem öffnenden XHTML-Rumpfelement
<code>body</code>
werden innerhalb des Quelldokuments beliebige
weitere Knoten gesucht, die auf eines der
angegebenen Suchmuster passen (
<code>xsl:apply-templates</code>
).
</li>
<listing
src="projektverwaltung_v2.xsl"
line="1-16">
</listing>
<li>
Die nächste Schablone erzeugt beim Auftreten des
Knotens
<code>ProjektVerwaltung</code>
ein paar Überschriftszeilen und der Kopf einer
XHTML-Tabelle.
</li>
<li>
Die Tabelle besteht aus den Elementen
<code>table</code>
und der Kopfzeile (eingeschlossen durch
<code>tr</code>
)
</li>
<li>
Den Rumpf der Tabelle schreibt ein anderes
Template. Dieses wird jedoch nicht direkt
aufgerufen, sondern der Prozeß der Ermittlung
neuer „passender“ Knoten neu initiiert; jedoch
auf Knoten vom Typ
<code>Projekt</code>
beschränkt (
<code>select</code>
-Attribut des
<code>apply-templates</code>
-Elements).
</li>
<listing
src="projektverwaltung_v2.xsl"
line="18-28">
</listing>
<li>
Die Schablone für
<code>Projekt</code>
speichert zunächst den Inhalt des Attributs
<code>Projektleiter</code>
in einer Variable namens
<code>prjLeiter</code>
.
</li>
<li>
Anschließend wird die in der
<code>Projektverwaltung</code>
geöffnete Tabelle befüllt.
</li>
<li>
Hierzu wird in die erste Spalte der Tabelle (mit
dem Titel
<code>Projektnummer</code>
) die
<code>ID</code>
des jeweiligen Projektes geschrieben. Sie wird
in einen Anker (
<code>a</code>
) eingebettet, dessen
<code>name</code>
-Attribut ebenfalls die
<code>ID</code>
des Projektes als Wert erhält. Dies dient einer
späteren Verlinkung.
</li>
<li>
In die zweite Spalte der Tabelle (mit dem Titel
<code>Projektleiter</code>
) wird der
<code>Nachname</code>
derjenigen
<code>Person</code>
geschrieben, deren ID (Wert des Attributs
<code>PersID</code>
) mit dem Wert der zuvor angelegten Variablen
<code>prjLeiter</code>
übereinstimmt.
</li>
<li>
Dies ist in einen Hyperlink eingebettet,
seinSprungziel ist ein aus dem Nachnamen durch
die Funktion
<code>generate-id()</code>
generierter eindeutiger ID-Wert.
</li>
<listing
src="projektverwaltung_v2.xsl"
line="40-56">
</listing>
<li>
Der zweite Teil der Schablone der
<code>ProjektVerwaltung</code>
erzeugt eine Tabelle für die Personen der
Projektverwaltung.
</li>
<li>
Nach einer weiteren Überschrift wieder wieder
der Kopf einer Tabelle erzeugt.
</li>
<li>
Der Rumpf wird wie oben durch ein anderes
Template befüllt, diesmal auf Knoten vom Typ
<code>Person</code>
beschränkt.
</li>
<listing
src="projektverwaltung_v2.xsl"
line="30-37">
</listing>
<li>
Die Ersetzungsregel für
<code>Person</code>
speichert zunächst den Inhalt des Attributs
<code>PersID</code>
in einer Variable.
</li>
<li>
Dann wird wieder die in der
<code>Projektverwaltung</code>
geöffnete Tabelle befüllt.
</li>
<li>
Hierzu werden für die erste Spalte der Tabelle
nacheinander die Schablonen für Knoten des Typs
<code>Vorname</code>
bzw.
<code>Nachname</code>
aktiviert.
</li>
<li>
Die zweite Spalte der Tabelle enthält einen
XHTML-Hyperlink zu den durch den Mitarbeiter
bearbeiteten
<code>Projekt</code>
en. Als Sprungziel wird hierbei der Inhalt des
Attributs
<code>mitarbeitInProjekt</code>
eingetragen.
</li>
<listing
src="projektverwaltung_v2.xsl"
line="58-70">
</listing>
<li>
Die Schablonen für die Knoten
<code>Vorname</code>
und
<code>Nachname</code>
geben im Wesentlichen den Wert des Knotens aus,
der zweite Vorname fügt ein Leerzeichen vor der
Textausgabe ein. Für
<code>Nachname</code>
wird ein Anker mit der automatisch generierten
ID für den Wert des Knotens generiert (das
Sprungziel des in der Schablone für
<code>Projekt</code>
generierten Hyperlinks).
</li>
<listing
src="projektverwaltung_v2.xsl"
line="72-85">
</listing>
</ul>
</slide>
<slide>
<title>
Ein umfangreiches Beispiel - komplettes Listing
</title>
<ul>
<li>
Nachfolgend sind das komplette XSLT-Programm und
das Ergebnis aufgeführt.
</li>
<listing src="projektverwaltung_v2.xsl"></listing>
<listing src="projektverwaltung.htm"></listing>
</ul>
</slide>
<slide>
<title>XSLT und XSL-FO</title>
<ul>
<li>
XSLT ist eine XML-basierte Programmiersprache,
um beliebiges XML in beliebiges XML zu
transformieren.
</li>
<li>
XSL-FO ist eine XML-Sprache, die Formatierungen
für Dokumente beschreibt.
</li>
<li>Gehen wir von folgendem XML-Dokument aus</li>
<listing
src="xslt-and-xslfo.xml"
line="2-13">
</listing>
<li>
Gewünscht ist nun eine Transformation nach
XSL-FO. Dies wird mit Hilfe von XSLT
bewerkstelligt. Ein Auszug aus einem
entsprechenden XSLT-Programm könnte so aussehen:
</li>
<listing
src="xslt-and-xslfo.xml"
line="15-28">
</listing>
<li>
(Quelle:
<a
href="http://www.w3.org/Style/XSL/WhatIsXSL.html">
What is XSL
</a>
-Webseite des W3C)
</li>
<li>
XSL-FO ist also ein mögliches
<b>Ausgabeformat</b>
, das mit Hilfe von XSLT erzeugt werden kann.
</li>
<li>
Ein weiteres mögliches Ausgabeformat wäre XHTML.
</li>
<li>
Es sind aber beliebige XML-Vokabulare mit XSLT
erzeugbar.
</li>
<li>
Das nachfolgende Bild verdeutlicht nochmals den
Zusammenhang.
</li>
<img
src="xslt-und-xslfo.png"
style="margin : 4% ; width : 90% ; ">
</img>
</ul>
</slide>
</part>
</presentation>
<!-- XSLT -->
<!-- XFORMS -->
<presentation id="xforms">
<title short="xforms">XForms</title>
<date>2009-01-12</date>
<toc id="resources">
<a
href="file:///C:/downloads/w3.org/www.w3.org/TR/2006/REC-xforms-20060314/index.html">
W3C XForms Spezifikation
</a>
<a href="https://addons.mozilla.org/de/firefox/addon/824">
XForms Plugin für Firefox
</a>
</toc>
<toc id="abstract">
Mit XForms entwickelt das W3C die nächste Generation von
Web-Formularen. Ziel dabei ist es, die Komplexität
beherrschbar zu machen, die notwendige Dynamik zu
unterstützen, multimodale Interaktion zu unterstützen und
Geräteunabhängigkeit zu garantieren.
</toc>
<slide>
<title>Abstract</title>
<p class="abstract">
<toc id="abstract"></toc>
</p>
</slide>
<slide>
<title>XForms</title>
<p class="definition">
Formulare im Web werden hinsichtlich der immer weiter
getriebenen Entwicklung von interaktiven
Web-Applikationen immer wichtiger.
<br />
<em>XForms</em>
sind eine Weiterentwicklung der für HTML definierten
Formulare, sie basieren auf XML. Der Begriff
<em>XForms</em>
versammelt zunächst zwei Teilbereiche unter sich,
nämlich das
<em>XForms-Modell</em>
sowie das
<em>XForms User Interface</em>
. Dadurch wird, im Gegensatz zu den hergebrachten HTML
Web-Formularen, die Trennung von Inhalt und Präsentation
des Formulars ermöglicht. Modell und User-Interface
gehen dabei Hand in Hand.
</p>
</slide>
<slide>
<title>
XForms - Zusammenspiel mit verschiedenen
Benutzerschnittstellen
</title>
<img
style="margin : 4% ; width : 30% ; "
src="xforms-arch-1.png" />
<p>
Ein Formularmodell, das durch ein
<em>XForms Modell</em>
beschrieben ist, kann mit unterschiedlichen
Benutzerschnittstellen zusammenarbeiten.
</p>
<ul>
<li>
<em>XForms User Interface</em>
:
<br />
eine Menge von Kontrollelementen, die direkt in
XHTML- und andere XML-Dokumente (z.B: SVG)
eingebunden werden können. Sie sollen die
hergebrachten XHTML Formularkontrollelemente
ersetzen.
</li>
<li>
<em>XHTML Formularelemente</em>
</li>
<li>
<em>WML-Formularelemente</em>
:
<br />
analog zur HTML existieren Formularelemente auch in
der sogenannten
<em>Wireless Markup Language</em>
, einer Auszeichnungssprache, die auf die
Darstellung von Web-Inhalten auf mobilen Endgeräten
abzielt.
</li>
</ul>
</slide>
<slide>
<title>XForms - Datenhaltung</title>
<img
style="margin : 4% ; width : 30% ; "
src="xforms-arch-2.png" />
<p>
Ein XForms-Formular sammelt in erster Linie Daten. Diese
Daten werden in Form von XML gehalten (sog.
<em>Instanzdaten</em>
). Die Struktur dieser Daten wird durch das
XForms-Modell beschrieben.
</p>
<ul>
<li>Strukturierter Datenaustausch</li>
<li>
Unterstützung von (vordefinierten) Arbeitsabläufen
</li>
<li>Automatische Vervollständigung von Daten</li>
<li>Vorbefüllung von Formularfeldern</li>
</ul>
<p>
Datenaustausch der Instanzdaten zum und vom
XForms-Prozessor über
<em>XForms Submit Protocol</em>
: definiert, wie XForms Daten senden und empfangen.
<br />
Vervollständigung eines Formulars kann angehalten und
wieder aufgenommen werden.
</p>
</slide>
<slide>
<title>XForms - Motivation</title>
<p>
Die Entwicklung von
<em>XForms</em>
als Weiterentwicklung der HTML Formulare versuchte
mehrere Defizite der HTML-Formulare zu beheben:
</p>
<ul>
<li>
Wiederverwendung von Formularen: Trennung der im
Formular gesammelten Daten von den
Kontrollelementen, die diese Daten sammeln. Das
Formular ist nicht länger untrennbar mit der Seite,
in der es verwendet wird, verbunden.
</li>
<li>
Unabhängigkeit in der Verwendung: XForms nicht
ausschließlich an (X)HTML gebunden, sondern auch in
anderen Sprachen verwendbar.
</li>
<li>
Starke Typisierung: Die in den Formularen
übertragenene Daten sind stark typisiert und können
somit bereits bei der Eingabe auf Clientseite leicht
geprüft werden, sie müssen zur Validierung nicht
erst zum Server übertragen werden.
</li>
<li>
Übertragung in Form von XML: Daten können direkt vom
Server an die Backend-Applikationen weitergereicht
werden, ein evtl. Zeischenformat zur Übertragung an
die Applikation kann entfallen.
</li>
<li>
Verbesserte Zugreifbarkeit: separierte
Kontrollelemente kapseln alle wichtigen Metadaten
wie Formular
<q>labels</q>
. Die Realisierung verschiedener
Eingabemöglichkeiten wird hiermit erleichtert.
</li>
<li>
Unterstützung vielfältiger Endgeräte: Beschreibung
der Kontrollelemente auf hoher Abstraktionsebene
erleichtert Benutzung der Formulare auf
verschiedenenen Endgeräten (z.B. Spracheingabe).
</li>
</ul>
</slide>
<slide>
<title>XForms - ein Beispiel (1/5)</title>
<p>
XForms-Formulare bestehen zunächst aus einem Teil, der
das Formular selbst beschreibt: das XForms-Modell. In
einem anderen Teil wird beschrieben, wie das Formular
dargestellt wird.
</p>
<p>
Wir wollen uns anhand eines einfachen
e-Commerce-Formulars den Aufbau erarbeiten. Das Formular
soll ermitteln, ob per Vorkasse oder mit Kreditkarte
bezahlt werden soll. Falls mit Kreditkarte bezahlt wird,
soll die Kreditkartennummer und das Gültigkeitsdatum
eingegeben werden.
</p>
<p>
Ein derartiges Formular könnte etwa wie folgt in einem
XForms
<code>model</code>
Element modelliert werden:
</p>
<listing src="xforms-example1.xml" />
<p>
Aussage: Im Formular werden drei Informationen
gesammelt. Diese Informationen werden an die URL, die
als Wert des
<code>action</code>
-Attributs angegeben ist, übermittelt.
</p>
<p>
Achtung: Über die Datentypen im Formular wurden noch
keine Aussagen getroffen!
</p>
<p>
Hinweis: in XHTML findet sich
<code>model</code>
-Information zumeist innerhalb des
<code>head</code>
-Elements.
</p>
<p>
Hinweis: Der Großteil der hier
besprochenen Beispiele entstammt
der
<a href="http://www.w3.org/TR/2006/REC-xforms-20060314/index.html">XForms Spezifikation des W3C</a>.
</p>
</slide>
<slide>
<title>XForms - ein Beispiel (2/5)</title>
<p>
In einem zweiten Schritt werden die Kontrollelemente im
Formular vorgesehen und mit dem Modell verbunden. Die
Verknüpfung mit dem Modell geschieht über den
sogenannten
<em>Bindemechanismus</em>
. In diesem einfachen Fall wird mit Hilfe des
<code>ref</code>
-Attributs der Kontrollelemente auf die jeweilige
Modellelemente referenziert.
</p>
<listing src="xforms-example2.xml" />
<p>
Die in XForms definierten Kontrollelemente zeichnen sich
durch ihre Geräte- und Plattformunabhängigeit aus.
</p>
<p>
Hinweis: in XHTML findet sich diese Information
innerhalb des
<code>body</code>
-Elements.
</p>
</slide>
<slide>
<title>XForms - ein Beispiel (3/5)</title>
<p>Eigenschaften dieses Formularentwurfs:</p>
<ul>
<li>
In der Benutzerschnittstelle werden nicht
zwingenderweise
<em>Radio Buttons</em>
verwendet. Andere Geräte (wie z.B. sprachbasierte
Browser) können selbst entscheiden, wie sie das
Konzept
<q>select one</q>
darstellen.
</li>
<li>
Kontrollelemente haben immer
<q>Labels</q>
als Kindelemente. So wird die Zugreifbarkeit
verbessert.
</li>
<li>
Im Gegensatz zur HTML gibt es keine Notwendigkeit,
Formulare in
<code>form</code>
-Elemente einzubetten.
</li>
<li>
Im Vergleich zur HTML wurde das Markup für
Kontrollfelder deutlich vereinfacht.
</li>
<li>
Die Art und Weise der Bindung von Kontrollfeldern an
das Modell vereinfacht die Integration von XForms in
andere Sprachen.
</li>
</ul>
</slide>
<slide>
<title>XForms - ein Beispiel (4/5)</title>
<p>
Dargestellt in einem Web Browser, könnte das soeben
modellierte Formular folgendermaßen aussehen:
</p>
<img
style="margin : 4% ; width : 30% ; "
src="xforms-arch-3.png" />
<p>
Für Firefox existiert ein Plugin, mit dem
XForms-Formulare angezeigt werden können:
<a
href="https://addons.mozilla.org/de/firefox/addon/824">
Mozilla XForms Plugin
</a>
</p>
<p>
Wenn Sie dieses Plugin installiert haben, können Sie auf
der hier verlinkten Seite sehen, wie das Formular in
Firefox dargestellt wird:
<a href="xforms-example.xhtml">
XHTML-Beispielseite mit einfachem XForms-Formular
</a>
</p>
</slide>
<slide>
<title>XForms - ein Beispiel (5/5)</title>
<p>
Nehmen wir an, das soeben modellierte Formular ist
Bestandteil einer Webseite und wurde von einem Benutzer
ausgefüllt.
<br />
Das zugehörige Instanzdokument, das dann vom
XForms-Prozessor übertragen wird, kann folgendermaßen
aussehen:
</p>
<listing src="xforms-example3.xml" />
</slide>
<slide>
<title>
XForms - Statusinformation des Instanzdokuments
</title>
<p>
Mit Hilfe der Instanzdaten verfolgt ein XForms Prozessor
den Zustand des Formulars, während es befüllt wird. Das
Element
<code>instance</code>
beinhaltet dabei im Wesentlichen ein
<q>Skelettdokument</q>
, das aktualisiert wird, während der Benutzer das
Formular ausfüllt. Wenn das Formular übermittelt wird,
werden die Instanzdaten als XML-Dokument geschrieben
(serialisiert).
</p>
<p>Eine leichte Abwandlung des vorherigen Beispiels:</p>
<listing src="xforms-example4.xml" />
<p>könnte folgendermaßen übertragen werden:</p>
<listing src="xforms-example5.xml" />
<p>Folgende Eigenschaften fallen auf:</p>
<ul>
<li>
Die leeren Elemente
<code>number</code>
und
<code>expiry</code>
dienen als
<q>Platzhalter</q>
in der XML Struktur. Sie werden mit den Daten, die
der Benutzer im Formular angibt, befüllt.
</li>
<li>
In den Instanzdokumenten können sämtliche
Strukturierungselemente der XML verwendet werden,
inkl. Attribute und Namensräume.
</li>
<li>
Der Wert
<q>cc</q>
wird mit Hilfe des Attributs
<code>method</code>
in den Instanzdaten vorbefüllt. Wenn der Benutzer
den Wert im Formular ändert, wird dieser Vorgabewert
im übermittelten XML-Dokument durch den angegebenen
Wert ersetzt.
</li>
</ul>
<p>
Die Verknüpfung dieser Instanzdaten mit den
Kontrollelementen erfolgt wieder mit Hilfe der
sogenannten
<em>Binding Expressions</em>
, die auf XPath basieren (vgl. Verwendung des
<code>@</code>
-Zeichens zum Zugriff auf Attribute).
</p>
<listing src="xforms-example6.xml" />
</slide>
<slide>
<title>
XForms - komplettes Beispiel mit vorbefüllten Werten
</title>
<listing src="xforms-example-2.xhtml" />
</slide>
<slide>
<title>XForms - Werte begrenzen</title>
<p>
Mit XForms können Daten bereits auf Gültigkeit geprüft
werden, sobald sie in das Formular eingegeben werden.
</p>
<p>
Wenn keine Information über die Datentypen im Formular
vorliegen, wird für alle Felder der Datentyp
<em>String</em>
angenommen.
</p>
<p>
Es ist jedoch möglich, den Werten in den Instanzdaten
Typen zuzuweisen.
</p>
<p>
Im folgenden Beispiel sollen folgende Bechränkungen für
unser Beispielformular implementiert werden:
</p>
<ul>
<li>
Die Kontrollelemente für die Kreditkarten sind nur
dann relevant, wenn im Formular diese Zahlweise
ausgewählt wurde. Dann sind sie aber zwingend
auszufüllen.
</li>
<li>
In
<code>number</code>
sollen nur nur Zahlen als Eingabe erlaubt sein,
diese dürfen zwischen 14 und 18 Ziffern lang sein.
</li>
<li>
<code>expiry</code>
soll nur gültige Kombinationen aus Monat und Datum
enthalten
</li>
</ul>
<p>
<em>Model Item Properties</em>
erlauben es dem Autor eines Formulars, solche
beschreibende Information, mit deren Hilfe die
Gültigkeit eines Wertes bestimmt werden kann, anzugeben:
</p>
<ul>
<li>
Information aus XML-Schema (Fragment), das in das
Formular eingebettet ist oder extern verfügbar sein
kann
</li>
<li>
XForms-Spezifische Eigenschaften für
<code>bind</code>
-Elemente, wie z.B.
<code>relevant</code>
.
</li>
</ul>
<listing src="xforms-example-7.xml" />
</slide>
<slide>
<title>
XForms - komplettes Beispiel mit Wertebegrenzung und
-überprüfung
</title>
<listing src="xforms-example-3.xhtml" />
</slide>
<slide>
<title>
XForms - Verwendung mehrerer Formulare in einem Dokument
</title>
<p>
In einem Dokument kann eine uneingeschränkte Anzahl von
einzelnen Formularen nebeneinander definiert sein.
</p>
<p>
Jedes dieser Formulare benötigt lediglich ein eigenes
<code>model</code>
-Element mit einem
<code>id</code>
-Attribut. So kann es von jeder Stelle des Dokuments aus
referenziert werden.
</p>
<p>
Die Kontrollelemente müssen zusätzlich Information
enthalten, welches
<code>model</code>
-Element die Instanzdaten beinhaltet, mit denen das
Kontrollelement verknüpft wird. Hierfür existiert ein
<code>model</code>
- Attribut für das
<code>binding</code>
-Element.
<br />
Ist kein
<code>model</code>
-Attribut angegeben, so wird das Modell verwendet, das
bei einem (dem nächstgelegenen) Vorfahr im Dokument
angegeben ist, andernfalls das erste Modell des gesamten
Dokuments.
</p>
<p>
Für unser Beispielformular soll nun zusätzlich ein
Formular angegeben werden, das eine Meinungsumfrage
beinhaltet. Dazu wird das Modell des Formulars zunächst
folgendermaßen erweitert:
</p>
<listing src="xforms-example-8.xml" />
<p>Außerdem werden folgende Kontrollelemente benötigt:</p>
<listing src="xforms-example-9.xml" />
<ul>
<li>
Verwendung des
<code>model</code>
-Attributs zur Referenzierung auf das
Formularmodell, mit dem die Kontrollelemente
verknüpft sind
</li>
</ul>
</slide>
<slide>
<title>XForms - XHTML-Seite mit mehreren Formularen</title>
<listing src="xforms-example-4.xhtml" />
</slide>
<slide>
<title>XForms - Dokumentstruktur</title>
<p>Allgemeine Bedingungen für XForms-Dokumente</p>
<ul>
<li>
Alle XForms-Elemente eines Dokuments müssen sich im
Namensraum
<code>http://www.w3.org/2002/xforms</code>
befinden.
</li>
<li>
Verlinkung mit entfernten Ressourcen erfolgt mit
Hilfe des
<code>src</code>
-Attributs. Es wird angenommen, daß die so
angegebenen Ressourcen zugreifbar sind.
</li>
<li>
Verknüpfungen werden mit Hilfe der Attribute
<code>ref</code>
(XPath-Ausdruck),
<code>model</code>
(ID eines Modells) und
<code>bind</code>
(Verweis auf ein
<code>bind</code>
-Element) ausgedrückt.
</li>
</ul>
<p>
Ein XForms-Formular besteht aus folgenden
Strukturelementen:
</p>
<ul>
<li>
<code>model</code>
: kann die Kindelemente
<code>instance</code>
,
<code>schema</code>
,
<code>submission</code>
,
<code>bind</code>
sowie Kindelemente der Elementmenge
<em>Action</em>
enthalten
</li>
<li>
<code>instance</code>
mit beliebigen Kindelementen
</li>
<li>
<code>submission</code>
mit Kindelementen aus
<em>Action</em>
</li>
<li>
<code>bind</code>
mit beliebigen Kindelementen
</li>
</ul>
</slide>
<slide>
<title>
Das
<code>model</code>
-Element
</title>
<p>
<code>model</code>
entspricht einer Formulardefinition. Innerhalb dieses
Elements werden die Elemente aufgezählt, die das
XForms-Modell definieren. Es können beliebig viele
<code>model</code>
-Elemente in einem Dokument enthalten sein.
</p>
<p>Erlaubte Attribute:</p>
<ul>
<li>
<code>ID</code>
: ID des Modells zur Referenzierung
</li>
<li>
<code>schema</code>
: Link auf XML-Schema-Dokumente, die sich außerhalb
des aktuellen
<code>model</code>
-Elements befinden.
</li>
</ul>
<listing
src="xforms-example-4.xhtml"
line="16-63" />
</slide>
<slide>
<title>
Das
<code>instance</code>
-Element
</title>
<p>
Das Element enthält oder referenziert erste Instanzdaten
des Formulars mit eventuellen Vorbefüllungen für
Formularwerte. Wenn sowohl eine Referenz auf
Instanzdaten existiert und gleichzeitig Instanzdaten als
Kindelemente des Elements angegeben sind, so sind die
referenzierten Daten höherprior und werden verwendet.
</p>
<p>Erlaubte Attribute:</p>
<ul>
<li>
<code>src</code>
: referenziert eine XML-Datei mit Instanzdaten
</li>
</ul>
<listing
src="xforms-example-5.xhtml"
line="16-47" />
</slide>
<slide>
<title>Der Submit-Prozess</title>
<p>
Für die Übertragung eines Formular(teil)s darf immer nur
genau ein Submit-Prozess aktiv sein. Bei einer
Übertragung laufen folgende Schritte ab:
</p>
<ol>
<li>
Ein Knoten aus den Instanzdaten, der übertragen
werden soll (vgl.
<code></code>
, wird ausgewählt. Er und all seine Nachkommen sind
für den nachfolgenden Prozess relevant.
</li>
<li>
Die relevanten Knoten werden auf Gültigkeit
überprüft (Schema, evtl vorhandene Constraints)
Leere und ungültige Knoten halten den
Übertragungsprozess an und werfen ein
Fehler-Ereignis.
</li>
<li>Die gewählten Instanzdaten werden serialisiert.</li>
<li>
Die serialisierten Instanzdaten werden übertragen.
</li>
<li>
Die Antwort wird entgegengenommen und wie folgt
verarbeitet:
</li>
<ul>
<li>
Bei einer erfolgreichen Übertragung und Erhalt
einer Antwort mit einem Dokument-
<code>body</code>
wird der gesamte Dokumentinhalt durch den
erhaltenen
<code>body</code>
ersetzt. Voraussetzung: das
<code>replace</code>
-Attribut des
<code>submission</code>
-Elements hat den Wert
<code>all</code>
.
</li>
<li>
Bei einer erfolgreichen Übertragung und Erhalt
einer Antwort mit einem
<code>body</code>
eines XML-Medientyps wird die Antwort als XML
geparst. Voraussetzung: Das
<code>replace</code>
-Attributs des Elements
<code>submission</code>
hat den Wert
<code>instance</code>
. Die Instanzdaten werden durch die
Ergebnisdaten ersetzt.
</li>
<li>
Bei einer erfolgreichen Übertragung und Erhalt
eines
<code>body</code>
eines nicht auf XML basierenden Medientypen wird
nichts ersetzt.
</li>
<li>
Bei einer erfolgreichen Übertragung und Erhalt
eines Body wird nichts ersetzt, wenn der Wert
des
<code>replace</code>
-Attributs
<code>none</code>
beträgt.
</li>
<li>
Bei einer erfolgreichen Übertragung und einem
Ergebnis, das keinen Body enthält, wird nichts
ersetzt.
</li>
<li>
Andere Attributwerte von
<code>replace</code>
sind nicht definiert.
</li>
<li>
Bei einer fehlerhaften Übertragung wird nichts
im Dokument ersetzt.
</li>
</ul>
</ol>
</slide>
<slide>
<title>
Das
<code>submission</code>
-Element
</title>
<p>
Das Element enthält beschreibende Informationen darüber,
was wie übertragen werden soll.
</p>
<p>Erlaubte Attribute:</p>
<ul>
<li>
<code>bind</code>
: optional, Verweis auf ein
<code>bind</code>
-Rlement. Die Referenz, die durch dieses Attribut
definiert ist, ist höherprior als eine evtl.
Referenz durch ein
<code>ref</code>
-Attribut.
</li>
<li>
<code>ref</code>
: optional, ermöglicht die Auswahl einer Teilmenge
der Instanzdaten. Der ausgewählte Knoten wird samt
seiner Nachfolger für die Übertragung ausgewählt.
Der Vorgabewert ist
<q>/</q>
.
</li>
<li>
<code>action</code>
: zwingend anzugeben, enthält die URI, an die die
Instanzdaten übermittelt werden. Das angegebene
URI-Schema hat Einfluß auf das
Übertragungsprotokoll.
</li>
<li>
<code>method</code>
: zwingend anzugeben, gibt indirekt die
Serialisierung an an, mit der die Instanzdaten
übertragen werden. Zulässige Werte sind:
<code>post</code>
,
<code>get</code>
,
<code>put</code>
,
<code>multipart-post</code>
,
<code>form-data-post</code>
,
<code>urlencoded-post</code>
(veraltet),
</li>
<li>
<code>version</code>
: optional, gibt die XML-Version an, die für die
Serialisierung des Dokuments verwendet werden soll.
</li>
<li>
<code>indent</code>
: optional, gibt an, ob während des
Serialisierungsprozesses zusätzliche Leerzeichen in
das Dokument eingefügt werden sollen, um die
Lesbarkeit zu erhöhen.
</li>
<li>
<code>mediatype</code>
: optional, gibt den Medientyp für die
Serialisierung der Instanzdaten an. Der angegebene
Typ sollte mit
<code>application/xml</code>
kompatibel sein.
</li>
<li>
<code>encoding</code>
: optional, gibt die Kodierung für die
Serialisierung an.
</li>
<li>
<code>omit-xml-declaration</code>
: optional, gibt an, ob die XML-Deklaration
serialisiert werden soll oder nicht.
</li>
<li>
<code>standalone</code>
: optional, gibt an, ob eine Standalone-Deklaration
in das Ergebnisdokument eingefügt werden soll.
</li>
<li>
<code>replace</code>
: optional, gibt an wie die erhaltene Antwort auf
das Instanzdokument angewendet wird. Fehlt das
Attribut, gilt der Vorgabewert
<code>all</code>
.
</li>
<li>
<code>instance</code>
: optional, gibt die Instanz an, die ersetzt werden
soll, wenn der Wert des
<code>replace</code>
-Attributs mit
<code>instance</code>
angegeben ist. Fehlt das Attribut, so wird als
Vorgabe die Instanz angenommen, die die zu
übertragenden Daten enthält.
</li>
<li>
<code>separator</code>
: optional, gibt das Trennzeichen an, das bei der
URL Codierung als Trennzeichen zwischen
Name-Wert-Paaren verwendet wird. Vorgabewert ist
<q>;</q>
.
</li>
<li>
<code>includenamespaceprefixes</code>
: optional, erlaubt die Kontrolle über die
Serialisierung der Namensräume. Fehlt das Attribut,
werden alle Namensräume serialisiert, unabhängig
davon, ob sie verwendet werden oder nicht. Ist das
Attribut vorhanden und leer, so werden nur die
verwendeten Namensräume serialisiert. Es kann eine
Liste von Namensraumpräfixen angegeben werden, die
zusätzlich zu den verwendeten Namensräumen
serialisiert werden sollen.
</li>
</ul>
</slide>
<slide>
<title>
Kompatibilitätsmatrix URI-Schema, Protokoll und
Serialisierung
</title>
<p>
Die folgende Tabelle gibt eine Übersicht über die
zulässigen Wertekombinationen
</p>
<table border="1">
<thead>
<tr>
<th>URI Schema</th>
<th>
<code>method</code>
</th>
<th>Serialisierung</th>
<th>Übertragungsprotokoll</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>http</code>
,
<code>https</code>
,
<code>mailto</code>
</td>
<td>
<code>post</code>
</td>
<td>
<code>application/xml</code>
</td>
<td>
<code>HTTP POST</code>
oder kompatibel
</td>
</tr>
<tr>
<td>
<code>http</code>
,
<code>https</code>
,
<code>file</code>
</td>
<td>
<code>get</code>
</td>
<td>
<code>
application/x-www-form-urlencoded
</code>
</td>
<td>
<code>HTTP GET</code>
oder kompatibel
</td>
</tr>
<tr>
<td>
<code>http</code>
,
<code>https</code>
,
<code>file</code>
</td>
<td>
<code>put</code>
</td>
<td>
<code>application/xml</code>
</td>
<td>
<code>HTTP PUT</code>
oder kompatibel
</td>
</tr>
<tr>
<td>
<code>http</code>
,
<code>https</code>
,
<code>mailto</code>
</td>
<td>
<code>multipart-post</code>
</td>
<td>
<code>multipart/related</code>
</td>
<td>
<code>HTTP POST</code>
oder kompatibel
</td>
</tr>
<tr>
<td>
<code>http</code>
,
<code>https</code>
,
<code>mailto</code>
</td>
<td>
<code>form-data-post</code>
</td>
<td>
<code>multipart/form-data</code>
</td>
<td>
<code>HTTP POST</code>
oder kompatibel
</td>
</tr>
<tr>
<td>
<code>http</code>
,
<code>https</code>
,
<code>mailto</code>
</td>
<td>
<code>urlencoded-post</code>
</td>
<td>
<code>
application/x-www-form-urlencoded
</code>
</td>
<td>
<code>HTTP POST</code>
oder kompatibel
</td>
</tr>
</tbody>
</table>
</slide>
<slide>
<title>
Das
<code>bind</code>
-Element
</title>
<p>
Das Element wählt über das Attribute
<code>nodeset</code>
eine Knotenmenge aus den Instanzdaten aus. Für diese
Knotenmenge kann dann zum Beispiel mit dem Attribut
<code>type</code>
ein Datentyp definiert werden. Allgemein gesprochen wird
eine Modelleigenschaft
</p>
<ul>
<li>
<code>type</code>
</li>
<li>
<code>readonly</code>
</li>
<li>
<code>required</code>
</li>
<li>
<code>relevant</code>
</li>
<li>
<code>calculate</code>
</li>
<li>
<code>constraint</code>
</li>
<li>
<code>p3ptype</code>
</li>
</ul>
<p>auf die Knoten der Knotenmenge angewendet.</p>
<p>Weitere Attribute:</p>
<ul>
<li>
<code>nodeset</code>
: Auswahl der Knotenmenge, für die die angegebene
Eigenschaft gelten soll.
</li>
</ul>
</slide>
<slide>
<title>XForms-Kontrollelemente</title>
<p>
XForms definiert folgende Kontrollelemente für
Formulare:
</p>
<ul>
<li>
<code>input</code>
: freies Eingabefeld. Kann je nach Datentyp des
Instanzknotens unterschiedlich angezeigt werden.
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="1-8" />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-input.png" />
<br />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-calendar-picker-closed.png" />
<br />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-calendar-picker-open.png" />
<br />
<ul>
<li>
<code>secret</code>
: Die Eingabe ist geheim und soll für dritte
Personen verborgen bleiben (z.B. Paßwort)
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="9-12" />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-secret-with-hint.png" />
<br />
<ul>
<li>
<code>textarea</code>
: Freie Eingabe in Form von mehrzeiligem Inhalt,
z.B. Inhalt einer E-Mail.
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="13-16" />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-textarea.png" />
<br />
<ul>
<li>
<code>output</code>
: Zeigt einen Wert aus den Instanzdaten an, bietet
keine Möglichkeit zur Dateneingabe.
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="17-19" />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-output.png" />
<br />
<ul>
<li>
<code>upload</code>
: Mit diesem Kontrollelement kann eine Datei des
lokalen Dateisystems auf einen Server geladen
werden. Ebenso kann hiermit die Dateneingabe über
verschiedene Eingabegeräte wie Mikrophone, Stifte
und Digitalkameras ermötlicht werden.
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="20-24" />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-upload.png" />
<br />
<ul>
<li>
<code>range</code>
: Auswahl von Werten aus einem Wertebereich
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="25-27" />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-range.png" />
<br />
<ul>
<li>
<code>trigger</code>
: Ähnlich zu einem Button. Erlaubt Aktionen, die
durch den Benutzer initiiert werden.
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="28-30" />
<br />
<ul>
<li>
<code>submit</code>
: Stößt die Übertragung der Instanzdaten an, mit
denen es verknüpft wurde.
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="31-33" />
<br />
<ul>
<li>
<code>select</code>
: Ermöglicht Mehrfachauswahl aus einer
Menge vorgegebener Werte.
Steuerung der Darstellung durch
CSS oder Attribut <code>appearance</code>
(zulässige Werte: <code>full</code>, <code>compact</code>
und <code>minimal</code>)
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="34-50" />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-selectMany-checkbox.png" />
<br/>
<img
style="margin : 4% ; width : 30% ; "
src="xforms-selectMany-listbox.png" />
<br/>
<img
style="margin : 4% ; width : 30% ; "
src="xforms-menu.png" />
<br/>
<ul>
<li>
<code>select1</code>
: Ermöglicht Einfachauswahl aus einer
Menge vorgegebener Werte.
Steuerung der Darstellung durch
CSS oder Attribut <code>appearance</code>
(zulässige Werte: <code>full</code>, <code>compact</code>
und <code>minimal</code>)
</li>
</ul>
<listing
src="xforms-kontrollelemente.xml"
line="51-65" />
<img
style="margin : 4% ; width : 30% ; "
src="xforms-selectOne-radio.png" />
<br/>
<img
style="margin : 4% ; width : 30% ; "
src="xforms-selectOne-listbox.png" />
<br/>
<img
style="margin : 4% ; width : 30% ; "
src="xforms-selectOne-pulldown.png" />
<br/>
</slide>
<slide>
<title>XForms - weiterführende Konzepte</title>
<p>
XForms verfügt des weiteren über weiterführende Konzepte
wie hierarchische Gruppierungen von Formularelementen,
die Möglichkeit zu konditionaler Anzeige mit
<code>switch</code> - <code>case</code>-Anweisungen sowie
die Möglichkeit zur einfachen Erstellung sich
wiederholender Strukturen (man denke an Preislisten, etc.).
Einsatzmöglichkeiten dieser Elemente sind nachzulesen in
<a href="http://www.w3.org/TR/2006/REC-xforms-20060314/slice9.html">
Kapitel 9 der XForms-Spezifikation
</a>. Sie werden in dieser
Vorlesung nicht weiter besprochen.
</p>
<p>
Auch auf die zahlreichen Events und die damit verbundenen
Elemente wird hier nicht weiter eingegangen.
</p>
</slide>
<slide>
<title>XForms - abschließendes Beispiel (mit Flußkontrolle)</title>
<listing src="xforms-final-example.xhtml"/>
</slide>
</presentation>
<!-- Ende XForms -->
</xslidy>

foo
nach
bar
. Alle anderen Elemente, Attribute und
Zeichenketten-artigen Elementinhalte werden
unverändert kopiert.
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.FileReader;
import org.xml.sax.InputSource;
public class SAXExample9 extends DefaultHandler {
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
if (qName == "foo") {
System.out.print("<bar");
} //if
else
System.out.print("<" + qName);
for (int i = 0; i < atts.getLength(); i++) {
System.out.print(" " + atts.getQName(i) + "=\"" + atts.getValue(i) + "\"");
} //for
System.out.println(">");
} //startElement()
public void endElement(String namespaceURI, String localName, String qName) {
if (qName == "foo") {
System.out.println("</bar>");
} //if
else
System.out.println("</" + qName + ">");
} //endElement()
public void characters(char[] ch, int start, int length) {
for (int i = start; i < start + length; i++)
System.out.print(ch[i]);
} //characters()
public static void main(String args[]) throws Exception {
XMLReader xr = XMLReaderFactory.createXMLReader();
SAXExample9 handler = new SAXExample9();
xr.setContentHandler(handler);
xr.setErrorHandler(handler);
FileReader r = new FileReader(args[0]);
xr.parse(new InputSource(r));
} //main()
}//class SAXExample9<?xml version="1.0"?>
<?myPI this is a test?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg">
<head>
<title>Testpage</title>
</head>
<body>
<p>This is a <a href="http://www.jeckle.de">link</a>
<foo>
sfdgsfdgsfg
</foo>
</p>
</body>
</html><html>
<head>
<title>
Testpage</title>
</head>
<body>
<p>
This is a <a href="http://www.jeckle.de">
link</a>
<bar>
sfdgsfdgsfg
</bar>
</p>
</body>
</html>
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.FileReader;
import org.xml.sax.InputSource;
import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
public class TreeViewer extends JFrame {
public static void main(String argv[]) {
JFrame frame = new TreeViewer(argv[0]);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
} //main()
public TreeViewer(String XMLFile) {
super("SAX-based XML Viewer");
try {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("DOCUMENT: " + XMLFile);
JTree tree = new JTree(root);
JScrollPane treeView = new JScrollPane(tree);
getContentPane().add(new JScrollPane(treeView), BorderLayout.CENTER);
//add elements to root
XMLReader xr = XMLReaderFactory.createXMLReader();
xr.setFeature("http://xml.org/sax/features/namespaces", true);
xr.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
Consumer handler = new Consumer(root);
xr.setContentHandler(handler);
xr.setErrorHandler(handler);
FileReader r = new FileReader(XMLFile);
xr.parse(new InputSource(r));
} catch (HeadlessException e) {
System.out.println("EXCEPTION CAUGHT: " + e.getClass().getName());
e.printStackTrace();
} catch (FactoryConfigurationError factoryConfigurationError) {
System.out.println("EXCEPTION CAUGHT: " + factoryConfigurationError.getClass().getName());
factoryConfigurationError.printStackTrace();
} catch (SAXException e) {
System.out.println("EXCEPTION CAUGHT: " + e.getClass().getName());
e.printStackTrace();
} catch (IOException e) {
System.out.println("EXCEPTION CAUGHT: " + e.getClass().getName());
e.printStackTrace();
}
}
} //class TreeViewer
class Consumer extends DefaultHandler {
private DefaultMutableTreeNode current;
public Consumer(DefaultMutableTreeNode root) {
current = root;
}
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
for (int i = 0; i < atts.getLength(); i++) {
current.add(new DefaultMutableTreeNode("ATTRIBUTE: " + atts.getQName(i) + "=" + atts.getValue(i)));
}
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("ELEMENT: " + localName);
current.add(newNode);
current = newNode;
}
public void endElement(String namespaceURI, String localName, String qName) {
current = (DefaultMutableTreeNode) current.getParent();
}
public void processingInstruction(String target, String data) {
current.add(new DefaultMutableTreeNode("PROCESSING INSTRUCTION: " + target));
}
public void characters(char[] ch, int start, int length) {
current.add(new DefaultMutableTreeNode("CHARACTERS: " + new String(ch, start, length)));
}
} //class ConsumerstartElement
,
processingInstruction
und
characters
. All diese Methoden fügen einen neuen Kindknoten
zum aktuell bearbeiteten Baumknoten zu. Zusätzlich
wird innerhalb der Behandlung des
startElement
-Ereignisses der neu erzeugte Kindknoten für die
weitere Verarbeitung als Aktueller definiert und
damit eine zusätzliche Baumstufe eröffnet.
endElement
) statt.
