Definition von XML und wichtige Schlagworte

Aus m-wiki
Version vom 19. September 2016, 22:31 Uhr von Snoopy78 (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Hat keine vordefinierte DTD, sondern ist nur eine Untermenge von SGML. Daher ist die Sprache nicht abgeschlossen sondern erweiterbar. Mit der entsprechenden DT…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Hat keine vordefinierte DTD, sondern ist nur eine Untermenge von SGML. Daher ist die Sprache nicht abgeschlossen sondern erweiterbar. Mit der entsprechenden DTD werden konkrete Sprachen definiert wie:\

Sprache Beschreibung Adresse\
CML Chemische Strukturen darstellen http://www.xml-cml.org\
MathML Darstellung mathematischer Strukturen http://www.w3org/Math\
SVG Grafikobjekte (auch bewegt) http://www.w3org/Graphics/SVG\
WML Datenübertragung über WAP (veraltet) http://xml.coverpages.org/wap-wml.html\
XHTML HTML 4.0 auf Basis von XML http://www.w3org/TR/xhtml1\
XLink Extensible Linking Language. Hyperlinks in XML-Dokumenten. Baut auf XPointer auf. -\
XPath Extensible Path Language. Damit können Teile eines XML-Dokuments adressiert werden. Kann von XSLT und XPointer verwendet werden. -\
XPointer Extensible Pointer Language. Beschreibt, wie Adressen in XLink-Ausdrücken verwendet werden sollen. -\
XQL Extensible Query Language ist eine Abfragesprache, welche XML als Datenmodell verwendet. -\
XSL Extensible Stylesheet Language. Beschreibt, wie die XML-Daten dem Benutzer angezeigt werden. Dient daher dem Erstellen von Stylesheets -\
XSLT Extensible Stylesheet Transformation Language. Transformiert XML-Dokumente in andere XML-Dokumente oder andere Sprachen. Die Sprache definiert, wie die Dokumente schlussendlich umgewandelt werden. -\

\

\ == XHTML 1.1 ==\ Dateien müssen wohl geformt sein. Das heisst, sie dürfen keine syntaktischen Fehler aufweisen.\

  • Tags werden immer komplett klein geschrieben <klein></klein>\
  • Jedes Tag muss beendet werden. Ist dies nicht möglich, so wird dieses in sich abgeschlossen: <ende></ende> oder <anfang />\
  • Verschachtelte Tags müssen korrekt gegliedert sein <aussen><innen></innen></aussen>\
  • Inline-Tags dürfen keine Blockelemente umschliessen, da sie in einen Block hineingehören <block-p><inline-span></inline-span></block-p>\
  • Falsche Kombinationen wie ein Button, der ein Select enthält, sind verboten\
  • Alle Attribute müssen einen Wert besitzen und in Anführungszeichen stehen <tag selected = "selected" height = "99%" />\
  • Eine Referenzierung über den Namen ist veraltet und sollte von der id abgelöst werden, da das Attribut name auch entfallen kann, die id aber zur Referenzierung enthalten sein muss <tag id = "23" />\
  • Das Attribut "lang" entfällt und wird zentral als Attribut "xml:lang" festgelegt\
  • Die Angabe des Doctyps und des Zeichensatzes (falls nicht im Header) ist zwingend. Dazu muss der Namensraum beim html-Tag mitgegeben werden.\
\
<!DOCTYPE html\
  PUBLIC "-//W3C/DTD XHTML 1.1//EN"\
  "http://www.w3org/TR/xhtml1/DTD/xhtml11.dtd">\
\
<html xmlns = "http://www.w3.org/1999/xhtml">\
  <head>\
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\
    <title></title>\
  </head>\
\
  <body>\
  </body>\
</html>\

\

Javascript und Stylesheets werden am Besten extern eingebunden. Möchte man diese trotzdem inline verwenden, müssen diese als CDATA erfasst werden, damit der Parser diese überspringt. Der Ort der Einbindung ist egal. Am Besten im Header, so dass diese im Body zur Verfügung stehen.\

\
<style type="text/css">\
  <![CDATA[\
    ... Hier kommen die Style-Definitionen\
  ]]>\
</style>\
\
<style type="text/javascript">\
  <![CDATA[\
    ... Hier kommen die JavaScript-Anweisungen\
  ]]>\
</style>\

\

\ == XML-Dokument Aufbau ==\ Es gelten ähnliche Regeln wie bei XHTML, doch die Elemente sind nicht festgelegt. Folgendes muss man aber einhalten:\ \

  • Es braucht am Anfang immer den Header\
  • Zum parsen braucht es eine DTD, auf die verwiesen werden muss\
  • Man kann die Elemente (Tags) auch gross schreiben, sollte sich aber auf ein Prinzip festlegen (am Besten alles klein)\
  • die erlaubten Attribute muss man selber definieren\
  • Der Zeichensatz muss angegeben werden, wenn man sich nicht auf ASCII beschränken will\
  • Um Spezialzeichen wie < > " ' und & auch verwenden zu können, müssen sie durch ihre Entities ersetzt werden: &lt &gt &quot &apos und &amp jeweils mit ; am Ende.\
  • Das Dokument darf nur ein Hauptelement enthalten. Die weitere Gliederstruktur ist der DTD zu entnehmen.\
  • Attribute können mit "" oder umschlossen werden\
  • Namensräume werden über eine (fiktive) URL vergeben, welche auch von einzelnen Elementen eingebunden werden können (falls man in einem Dokument mehrere Namensräume braucht). Wird hier aber nicht gezeigt.\

\

\
<?xml version = "1.0" encoding = "UTF-8"?>\
\
<doku xmlns = "http://virtuelleURI.XML">\
  <testelement>Hallölchen mit "!</testelement>\
\
  <!-- Kommentare sind auch möglich -->\
\
  <autor photo = "image/ich.jpeg">\
    <vor land = "CH">Vorname</vor>\
    <nach>Nachname</nach>\
    <bild quelle = "test.jpeg" />\
    <bild extern = "pngdatei" />\
    &text1;\
  </autor>\
</doku>\

\

\ == DTD für XML erstellen ==\ Damit das obige Dokument geparst werden kann, braucht es eine entsprechende DTD, welche dann mit dem entsprechenden Link ins XML eingebunden wird. Sie beschreibt den strukturellen Aufbau der Dokumente. Im Header einer HTML-Datei wird die entsprechende dtd meist angegeben. Im Link sollte diese dann abrufbar sein (z.B.: http://www.w3.org/TR/REC-html40/strict.dtd). Folgendes wird festgelegt:\

  • Welche Tags verwendet werden können\
  • Welche Attribute angewendet werden müssen\
  • Welche optionalen Attribute es gibt\

Bei HTML kommt noch js und css dazu.\ \ === Elemente definieren ===\

  • !ELEMENT steht vor jedem Element, welches im XML verwendet wird\
  • In Klammern stehen alle Unterelemente. Will man aus einer Liste auswählen, so kann man diese mit Klammern und | auflisten -> element1, (element2 | element3) -> bedeutet: e1 muss eingegeben werden. Dann kann man entweder e2 oder e3 wählen.\
  • Tags, welche keine Unterelemente mehr enthalten, werden mit #PCDATA gefüllt\
  • Folgende Zeichen regeln, wie oft ein Element vorkommen darf, wenn es in der DTD definiert wurde: ? = 0 oder 1 Mal, * = beliebig oft, auch 0 Mal, + = beliebig oft, doch mindestens 1 Mal, kein Zeichen = genau einmal.\
  • Will man alle Elemente einer Gruppe gleich behandeln, kann man diese auch in Klammern setzen und das Zeichen ausserhalb verwenden (test1, test2)+\
  • Enthält ein Element keinen Inhalt (wie etwa br oder img), so wird es mit EMPTY festgelegt\
\
<!ELEMENT doku (testelement+, autor)>\
<!ELEMENT testelement (#PCDATA)>\
<!ELEMENT autor (vor+, nach, bild?)>\

\

\ === Attribute definieren ===\

  • !ATTLIST startet einen Attributeintrag -> <!ATTLIST Element AttributName (AttributTyp)>\
  • Man kann für den Typ folgende Gruppen festlegen: Eine beliebige Zeichenkette, welche mit CDATA angezeigt wird (bild -> src), Eine Aufzählung, welche man direkt eingibt (bild -> align) und Schlüsselwörter, welche definiert sind (autor -> ID)\
  • Als Schlüsselwörter gelten: \
    • ID für die Kennzeichnung\
    • IDREF für einen Verweis auf die ID\
    • IDREFS für Verweise auf mehrere IDs (autor -> kennt -> die ID-Liste, welche hier mitgegeben werden kann, zeigt, welcher autor welche anderen Autoren kennt an Hand ihrer ID)\
    • NMTOKEN schränkt die Auswahl auf Buchstaben und "." ":" "-" "_" ein\
    • NMTOKENS kann mehrere Eigenschaften festlegen\
    • NOTATION verweist auf ein externes Dokument, welches dann von einem Programm verarbeitet werden kann (autor -> photo)\
  • Gibt es für ein Attribut eine Auswahlliste, wird diese in Klammern angegeben. Der Vorgabewert kommt anschliessend in Anführungszeichen dahinter (bild -> align)\
  • Man kann angeben, ob ein Attribut angegeben werden muss (#REQUIRED) oder ob man darf (#IMPLIED). Ohne Angabe gilt #IMPLIED. \
  • Zusätzlich existiert noch #FIXED. Hier muss der Wert in der DTD angegeben werden und anschliessend ist nur dieser Wert als Angabe erlaubt und wird auch übernommen, wenn man nichts mitgibt.\
  • Die Attribute können an beliebiger Stelle in der DTD stehen. Der Übersicht halber aber am Besten direkt hinter dem Element\
  • Bei mehreren Deklarationen des gleichen Attributes für ein Element wird nur das Erste ausgewertet\
\
<!ELEMENT autor (vor+, nach, bild?)>\
<!ATTLIST autor \
  kennung     ID             #REQUIRED   -- Eindeutige Kennzeichnung\
  kennt       IDREFS         #IMPLIED    -- Verweis auf die IDs\
  photo       NOTATION                   -- Externe Quelle (z.B. image/max.jpeg)\
>\
<!ELEMENT bild EMPTY>\
<!ATTLIST bild \
  src         CDATA          #REQUIRED   -- Beliebige Zeichenkette ist erlaubt. \
  quelle      %URI;          #REQUIRED   -- URI prüft hier, ob Auswahl gültig -> Auswahl über Entity definiert\
  align       (left|center|right) "left" -- Aufzählungsliste, rechts die Standardvorgabe, wenn nichts ausgewählt wurde\
  extern      ENTITY                     -- extern ist eine Entity, welche im XML eingebunden wird\
>\

\

\ === Entity definieren ===\ ENTITY verweist auf Dateien oder andere Objekte. Dazu müssen gewisse Sonderzeichen je nachdem als Entity eingegeben werden (&lt ; <- ohne Abstand). Allgemein handelt es sich um eine Ersetzung von langen Ausdrücken.\ Es wird zwischen Allgemeinen Entities unterschieden, welche mit & eingebunden werden und Parameter Entities, welche man mit % einsetzt. Eine Entity kann auch in einer Attributliste selbst definiert werden, doch hier wird nur das eigenständige Entity angegeben. Da die Entities auch in der DTD selber verwendet werden können, sollte man dies der Übersicht halber, gleich am Anfang definieren.\

  • Eigenständig: &y; -> (text1)\
  • Parameter: %x; -> (URI)\
  • Extern, nicht interpretierbar: SYSTEM, NDATA\
\
<!ENTITY text1 "Dies ist ein langer Text, welcher ersetzt werden kann"> -- Allgemeines Entity\
<!ENTITY %URI "URI (file:// | http:// | ftp://) #REQUIRED"> -- Parameter Entity\
<!ENTITY pngdatei SYSTEM "bilder/test.png" NDATA png> -- Externe Entity\

\

\ === Notation definieren ===\ Verweist auf externe Programme zur Verarbeitung von Entities.\

\
<!NOTATION tif SYSTEM "file://tiefviewer.exe"> -- Externes Programm\
<!ELEMENT IMG IMPTY>\
<!ATTLIST IMG\
   typ NOTATION (tif) #IMPLIED\
   quelle CDATA #IMPLIED\
>\

\

XML-Anweisung, bei welcher dann das externe Programm automatisch aufgerufen werden kann:\

\
<IMG typ = "tif" quelle = "images/bild.tif" />\

\

\ === Beispiel DTD aus obigen Angaben ===\

\
<!ENTITY text1 "Dies ist ein langer Text, welcher ersetzt werden kann"> -- Allgemeines Entity\
<!ENTITY %URI "URI (file:// | http:// | ftp://) #REQUIRED"> -- Parameter Entity\
<!ENTITY pngdatei SYSTEM "bilder/test.png" NDATA png> -- Externe Entity\
\
\
<!ELEMENT doku (testelement+, autor)>\
<!ELEMENT testelement (#PCDATA)>\
\
<!ELEMENT autor (vor+, nach, bild?)>\
<!ATTLIST autor \
  kennung     ID             #REQUIRED   -- Eindeutige Kennzeichnung\
  kennt       IDREFS         #IMPLIED    -- Verweis auf die IDs\
  photo       NOTATION                   -- Externe Quelle (z.B. image/max.jpeg)\
>\
\
<!ELEMENT vor (#PCDATA)>\
<!ELEMENT nach (#PCDATA)>\
\
<!ELEMENT bild EMPTY>\
<!ATTLIST bild \
  src         CDATA          #REQUIRED   -- Beliebige Zeichenkette ist erlaubt. \
  quelle      %URI;          #REQUIRED   -- URI prüft hier, ob Auswahl gültig -> Auswahl über Entity definiert\
  align       (left|center|right) "left" -- Aufzählungsliste, rechts die Standardvorgabe, wenn nichts ausgewählt wurde\
  extern      ENTITY                     -- extern ist eine Entity, welche im XML eingebunden wird\
>\
\

\

\ Damit diese Datei vom XML-Dokument gefunden werden kann, wird dort der Link folgendermassen eingebunden:\

\
<!DOCTYPE name SYSTEM "datei.dtd">\

\

"name" muss mit dem ersten Element (Hauptelement) der Doctype übereinstimmen. Die Datei kann lokal oder mittels URI auf einem anderen Server liegen. Dazu sollte beim xml Tag die Angabe standalone = "no" angegeben werden, damit die dtd auch sicher extern gesucht wird.\ \ Wie man sieht, gibt es hier keine Attribute für den Vornamen. Will man dieses aber trotzdem verwenden und kann die DTD nicht anpassen, so muss man im XML einen eigenen Namensraum für dieses Element definieren und auf diesen verweisen.\ \ Hier daher ein Beispiel aus einer DTD für XHTML1.1 für das Element img (Bild).\

\
<!--=================== Images ===========================================-->\
\
<!-- Length defined in strict DTD for cellpadding/cellspacing -->\
<!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length -->\
<!ENTITY % MultiLength "CDATA" -- pixel, percentage, or relative -->\
\
<![ %HTML.Frameset; [\
<!ENTITY % MultiLengths "CDATA" -- comma-separated list of MultiLength -->\
]]>\
\
<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->\
\
\
<!-- To avoid problems with text-only UAs as well as \
   to make image content understandable and navigable \
   to users of non-visual UAs, you need to provide\
   a description with ALT, and avoid server-side image maps -->\
<!ELEMENT IMG - O EMPTY                -- Embedded image -->\
<!ATTLIST IMG\
  %attrs;                              -- %coreattrs, %i18n, %events --\
  src         %URI;          #REQUIRED -- URI of image to embed --\
  alt         %Text;         #REQUIRED -- short description --\
  longdesc    %URI;          #IMPLIED  -- link to long description\
                                          (complements alt) --\
  name        CDATA          #IMPLIED  -- name of image for scripting --\
  height      %Length;       #IMPLIED  -- override height --\
  width       %Length;       #IMPLIED  -- override width --\
  usemap      %URI;          #IMPLIED  -- use client-side image map --\
  ismap       (ismap)        #IMPLIED  -- use server-side image map --\
  >\
\
<!-- USEMAP points to a MAP element which may be in this document\
  or an external document, although the latter is not widely supported -->\

\

\ === Eigenen Namensraum definieren, wenn DTD nicht anpassbar ===\ Es soll das oben selbst definierte Beispiel verwendet und angepasst werden, damit ein XML-Dokument mit zusätzlichen Angaben trotzdem gültig ist, auch wenn die DTD dies im Original nicht vorsieht. Dies ermöglicht die Erweiterung der Dokumente, ohne Anpassung der DTD, auf die man nicht in jedem Fall Zugriff hat.\

\
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>\
<!DOCTYPE doku PUBLIC "//Meine DTD" "test.dtd" [\
  <!ATTLIST autor xmlns:extra CDATA #FIXED "http://www.virtuelleURI.XML">\
  <!ATTLIST vor extra:land (CH|DE|FR) #IMPLIED>\
]> <!-- in test.dtd muss obige dtd auffindbar sein. -->\
\
<doku xmlns = "http://virtuelleURI.XML">\
  <testelement>Hallölchen mit "!</testelement>\
 \
  <autor xmls:extra = "http://www.virtuelleURI.XML">\
    <vor extra:land = "CH">Vorname</vor>\
    <nach>Nachname</nach>\
    <bild quelle = "test.jpeg" />\
  </autor>\
</doku>\

\

\ Wie man sieht, wird hier im Dokument definiert, dass das Attribut lang möglich, doch nicht notwendig ist und auch, welche Werte es enthalten darf.\ \ == XML Schema (Erweiterung von DTD) ==\ Die DTD ist in gewissen Bereichen eingeschränkt, wie etwa beim festlegen von Wertebereichen und vordefinierten Datentypen. Daher wurde als Erweiterung XML Schema vom W3C entwickelt: http://www.w3.org/XML/Schema\ Folgende zusätzliche Angaben sind nun zusätzlich zur DTD machbar:\

  • Reihenfolge der Elemente\
  • Anzahl möglicher Elemente\
  • Datantyp der Elemente\
  • Datentyp der Attribute\
  • eigene Datentypen\

Die Verwendung der DTD ist aber weiterhin möglich, da es sehr einfach ist, wenn man einmal die DTD erstellt hat und genaue Werte nicht kritisch sind. Das XML Schema wird vor allem dann verwendet, wenn die Datentypen und der Wertebereich nicht extern überprüft werden kann und daher kritisch ist.\ === Unterschied DTD und XML Schema ===\ folgendes XML sei gegeben:\

\
<?xml version = "1.0" encoding = "UTF-8"?>\
<adresse xmlns = "http://virtuelleURI.XML">\
    <name>Max Müller</name>\
    <strasse>Srassenweg 11</strasse>\
    <ort>Stadt</ort>\
    <plz>1234</plz>\
</adresse>\

\

\ Die entsprechende DTD:\

\
<!ELEMENT adresse (name, strasse, ort, plz)>\
<!ELEMENT name (#PCDATA)>\
<!ELEMENT strasse (#PCDATA)>\
<!ELEMENT ort (#PCDATA)>\
<!ELEMENT plz (#PCDATA)>\

\

\ Und nun das XML Schema. Die Datei wird als xsd gespeichert (adresse.xsd) und ist auch eine XML Datei:\

\
<?xml version = "1.0" encoding = "UTF-8"?>\
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"\
    targetNamespace = "http://www.ZielNamespace.url"\
    xmlns = "http://www.ZielNamespace.url"\
    elementFormDefault = "qualified">\
  <xs:element name = "adresse">\
    <xs:complexType>\
      <xs:sequence>\
        <xs:element name = "name"     type = "xs:string" />\
        <xs:element name = "strasse"  type = "xs:string" />\
        <xs:element name = "ort"      type = "xs:string" />\
        <xs:element name = "plz"      type = "xs:string" />\
      </xs:sequence>\
    </xs:complexType>\
  </xs:element>\
</xs:schema>\

\

Zuerst kommt der Header, danach das Element Adresse, welches complex ist, da es weitere Elemente enthält. Die Unterelemente werden als reine Textelemente erfasst.\ \ === Attribute des Elementes Schema ===\ Das Element schema hat folgende Attribute:\

  • xmlns:xs -> Die Elemente entstammen dem nachfolgenden Namensraum der angegebenen Adresse (XMLSchema).
    Zusätzlich wird festgelegt, dass die Elemente mit dem Präfix xs beginnen müssen (dieses kann frei gewählt werden)\
  • xmlns -> legt den standardmässigen Namespace fest (Phantasie-URL)\
  • targetNamespace gibt an, in welchem Namespace sich die Elemente befinden müssen, damit die Definition auf sie angewendet wird\
  • elementFormDefault mit qualified erzwingt das Präfix vor jedem Element. Standardmässig ist es ausgeschaltet\
  • attributeFormDefault macht das Gleiche mit den Attributen\

\ === XML mit Schema verknüpfen ===\ Damit das korrekte Schema verwendet wird, muss folgende Angabe in der xml-Datei gemacht werden:\

\
xmlns = "URI"\
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"\
xsi:schemaLocation = "Namensraum Schema-Datei"\

\

Der Parser kann nun die Schema Datei am Ort des Namensraumes suchen, ist aber nicht an die Datei dort gebunden.\ sonst:\

\
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"\
xsi:noNamespaceSchemaLocation = "Schema-Datei"\

\

Hier sucht nun der Parser die entsprechende Datei (relativ oder direkt angegeben).\ \ === Schema Parser (Validieren) ===\ Es gibt freie Parser im Internet (http://www.corefiling.com/opensource/schemaValidate.html), welche an Hand des Schemas und einer XML-Datei prüfen können, ob ein Fehler vorliegt. über die MSXML kann man auch lokal über eine Schnittstelle mit dem IE und Active-X die Dateien prüfen lassen. Daher hier ein Beispiel für den IE mit Javascript:\

\
<script language = "JavaScript">\
  function validate() {\
    var xmlSchema = new ActiveXObject("MSXML2.XMLSchemaCache.4.0");\
    xmlSchema.add("", document.schemaTest.schemaURI.value);\
\
    var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.4.0");\
    xmlDoc.schemas = XMLSchema;\
    xmlDoc.async = false;\
    xmlDoc.load(document.schemaTest.documentURI.value);\
\
    if (xmlDoc.parseError.errorCode != 0) {\
      alert("FEHLERCODE: \\n" + xmlDoc.parseError.errorCode + "\\n\\nGrund: \\n" + xmlCode.parseError.reason);\
    } // end if\
    else {\
      alert("Kein Fehler gefunden.");\
    } // end else\
  } // end function validate()\
</script>\

\

Die Datei muss noch um das Formular erweitert werden, mit dem man die zwei Dateien hochladen und dann der Routine übergeben kann. Leider findet sich die Seite nicht in den Dokumenten zum Buch. Falls erweitert, abspeichern und mit dem IE ausführen.\ \ === XML Schema Attribute ===\ Um die ganze Vielfalt der Attribute zu zeigen, wird die XML-Datei erweitert und das entsprechende Schema auch.\

\
<?xml version = "1.0" encoding = "UTF-8"?>\
\
<Bestellung bestelldatum = "2003-05-26">\
  <Adresse>\
    <Name>Max Müller</Name>\
    <Strasse>Srassenweg 11</Strasse>\
    <Ort>Stadt</Ort>\
    <PLZ>1234</PLZ>\
  </Adresse>\
  <Ware>\
    <Buch BestellNr = "0123456789">\
      <Titel>Die Bibel</Titel>\
      <Autor>Gott></Autor>\
      <Anzahl>12</Anzahl>\
      <Preis Währung = "CHF">9.90<Preis>\
    </Buch>\
  </Ware>\
</Bestellung>\

\

\

\
<?xml version = "1.0" encoding = "UTF-8"?>\
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">\
\
  <xs:element name = "Bestellung">\
    <xs:complexType>\
      <xs:sequence>\
        <xs:element name = "Adresse" type = "BestellAdresse" />\
        <xs:element name = Ware type = "WarenTyp" />\
      </xs:sequence>\
      <xs:attribute name = "bestelldatum" type = "xs:date" />\
    </xs:complexType>\
  <xs:element>\
\
  <xs:complexType name = "BestellAdresse">\
    <xs:sequence>\
      <xs:element name = "Name"     type = "xs:string" />\
      <xs:element name = "Strasse"  type = "xs:string" />\
      <xs:element name = "Ort"      type = "xs:string" />\
      <xs:element name = "PLZ"      type = "PLZTyp" />\
      <xs:simpleTyp name = "PLZTyp">\
        <xs:restriction base = "xs:positiveInteger">\
           <xs:minLength = "4" /> <!-- z.B. Schweiz --> \
           <xs:maxLength = "5" /> <!-- z.B. Deutschland --> \
        </xs:restriction>\
      </xs:simpleTyp>\
    </xs:sequence>\
  </xs:complexType>\
\
  <xs:complexType name = "WarenTyp">\
    <xs:sequence>\
      <xs:element name = "Buch" minOccurs = "0" maxOccurs = "unbounded">\
        <xs:complexType>\
          <xs:sequence>\
            <xs:element name = "Titel" type = "xs:string" />\
            <xs:element name = "Autor" type = "xs:string" />\
            <xs:element name = "Anzahl">\
              <xs:simpleType>\
                <xs:restriction base = "xs:positiveInteger">\
                  <xs:maxExclusive value = "100" />\
                </xs:restriction>\
              </xs:simpleType>\
            </xs:element>\
            <xs:element name = "Preis">\
              <xs:complexType>\
                <xs:attribute name = "Währung" type = "WährungsTyp" use = "required" default = "CHF"/>\
              </xs:complexType>\
            </xs:element>\
            <xs:simpleTyp>\
              <xs:restriction base = "xs:positiveInteger">\
                <xs:fractionDigits = "2" /> <!-- Nachkommastellen --> \
                <xs:totalDigits = "8" /> <!-- Gesamtstellen --> \
              </xs:restriction>\
            </xs:simpleTyp>\
          </xs:sequence>\
          <xs:attribute name = "bestellNr" type = "BestellNrTyp" use = "required" /> <!-- optional and prohibited are also possible --> \
        </xs:complexType>\
      </xs:element>\
    </xs:sequence>\
  </xs:complexType>\
\
  <xs:simpleType name = "WährungsTyp">\
    <xs:restriction base = "xs:string">\
      <xs:enumeration value = "CHF" />\
      <xs:enumeration value = "EUR" />\
      <xs:enumeration value = "USD" />\
    </xs:restriction>\
  </xs:simpleTyp>\
\
  <xs:simpleType name = "BestellNrTyp">\
    <xs:restriction base = "xs:string">\
      <xs:pattern value = "\\d{10}" />\
    </xs:restriction>\
  </xs:simpleTyp>\
\
</xs:schema>\

\

  • Ein einfaches Element kann keine Attribute oder Unterelemente besitzen\
  • Mittels type wird festgelegt, welche Werte das Element enthalten kann (z.B.: string, decimal, integer, boolean, date (englischsprachig), time (12:34:56))\
  • default legt den Standardwert fest, wenn keiner vorgegeben wird\
  • Bei der Angabe von fixed ist nur dieser Wert erlaubt\
  • Mit restriction kann man einen Wertebereich eingrenzen. Mit base legt man den Wert fest. Daher wird dieser beim Element selber weggelassen. Die Wertebereiche legt man mit minInclusive/maxInclusive oder minExplusive/maxExclusive fest. Der Unterschied liegt darin, dass die Grenzwerte bei Inclusive mitgelten und sonst nicht mehr erlaubt sind.\
  • Mit einer enumeration kann man die erlaubten Werte der restriction festlegen. Andere Werte sind dann automatisch ungültig\
  • Mit einem Muster (pattern) wird ein regulärer Ausdruck zur Analyse verwendet\
  • Nichtdruckbare Zeichen (Tabulatoren, Zeilenumbrühe, Leerzeichen) werden in der restriction mit dem Schlüsselwort whitespace behandelt (preserve macht nichts, replace ersetzt mit Leerzeichen und collapse ersetzt zusätzlich mehrere Zeichen mit einem und entfernt Leerräume am Anfang und Ende)\
  • Mit length legt man die Zeichenlänge fest. Will man variabel sein, so benutzt man minLength und maxLength\
  • Die Nachkommastellen legt man mit fractionDigits und die Gesamtanzahl mit totalDigits fest\

\ === XML Schema Indikatoren (Verwendung der Elemente festlegen) ===\

  • Reihenfolge -> all, choice, sequence\
  • Vorkommen -> maxOccurs, minOccurs\
  • Gruppen -> group, attributeGroup\

\ ==== Reihenfolge ====\ Verwendet man sequence, so muss die Reihenfolge unbedingt eingehalten werden. Bei all muss jedes Element genau einmal auftreten, doch die Reihenfolge ist egal. Bei choice muss man eines der angegebenen Elemente nehmen, doch man darf nicht mehrere wählen.\ \ ==== Vorkommen ====\ Die Werte werden direkt beim Element vergeben. Benutzt man sie nicht, wird 1 angenommen. Will man die Obergrenze nicht festlegen, so wird als Schlüsselwort unbounded verwendet.\

\
<xs:element name = "Test" maxOccurs = "unbounded" />\

\

\ ==== Gruppen ====\ Dient dazu. Elemente zu bündeln, um diese dann an einer Stelle einzusetzen. Etwa Adresse, welche für eine Lieferadresse oder eine Rechnungsadresse verwendet werden kann. Damit können Verdoppelungen vermieden werden.\ Elementgruppen können keine komplexen Typen enthalten.\

\
<xs:group name = "AdressGruppe">\
  <xs:sequence>\
    <xs:element name = "Strasse"    type = "xs:string" />\
    <xs:element name = "Hausnummer" type = "xs:string" />\
    <xs:element name = "Ort"        type = "xs:string" />\
    <xs:element name = "PLZ"        type = "xs:string" />\
  </xs:sequence>\
</xs:group>\

\

Diese Definition kann man nun mehrfach verwenden:\

\
<xs:element name = "Lieferadresse">\
  <xs:complexType>\
    <xs:group ref = "AdressGruppe" />\
  </xs:complexType>\
</xs:element>\

\

Das Gleiche ist auch mit Attributen möglich. Diese werden dann mit attributeGroup definiert und genau gleich referenziert.\ \ === XML Schema beliebig erweitern ===\ Mit dem any Element kann man beliebige Erweiterungen an dessen Stelle einfügen. Dies bedingt aber, dass man weiss, dass dort noch weitere Elemente eingefügt werden sollen. Es kann auch als Platzhalter für beliebige Attribute (anyAttribute) eingesetzt werden. Es wird folgendermassen verwendet:\

\
<xs:any minOccurs = "0" />\

\

Da es allerdings weitere xml braucht, welche schliesslich den Platzhalter füllen, ist es doch recht aufwendig und meist sollte man in der Praxis direkt das verwendete dtd anpassen können, so dass diese Sonderform hier nicht weiter behandelt wird. \ \ == XSL - Elemente formatiert darstellen ==\ XSL besteht aus Elementen von DSSSL (Formatierungsspreche), HTML und CSS. Mit Hilfe von XSL können Daten in HTML oder ein anderes Textformat transformiert werden. Man kann XML-Daten filtern und sortieren und abhängig vom Wert formatieren.\ \ === XML mit CSS formatieren ===\ Hier werden die Elemente einfach über eine css-Datei formatiert. Dazu muss man alle Elemente entsprechend kennzeichnen:\

\
adresse {\
  disply: block;\
  font-family: Arial, helvetica, sans-serif; \
  font-size: 10pt;\
  color: #00; \
}\
\
name {\
  font-size: 14pt;\
  font-weight: bold;\
}\
\
strasse, ort {\
  font-size: 12pt;\
}\
\
plz {\
  color: #dd; \
}\

\

Auf den Stylesheet wird in der XML-Datei folgendermassen verwiesen:\

\
<?xml-stylesheet href = "datei" type = "text/css"?>\

\

\ === XPath ===\ Bei XPath wird über die Baumstruktur des XML auf einzelne Elemente zugegriffen.\ Es braucht folgende Angaben, um ein Element korrekt zu verarbeiten:\

  • Eine Achse zum navigieren im XML-Baum\
  • Eine Knotenprüfung (node test), um über diese Kriterien bestimmte Elemente zu selektieren\
  • Prädikate, um die Auswahl zu filtern\

Die Achse und die Knotenprüfung sind notwendig, während das Prädikat optional ist.\

\
achse::knotenprüfung[prädikat]\

\

Es wird folgendes XML als Beispiel verwendet:\

\
<musiksammlung>\
  <album>\
    <interpret>Moby</interpret>\
    <titel stil = "Pop">Play</titel>\
    <lied>Anfang</lied>\
    <lied>Mitte</lied>\
    <lied>Ende</lied>\
  </album>\
</musiksammlung>\

\

==== Achsen ====\ Die Achse wird relativ vom aktuellen Knoten aus bestimmt oder absolut von der Wurzel her.\

\
                          |---- vorherige Elemente (Geschwister) ---- Kind\
                          |\
Wurzel - Grosseltern - Eltern - Element ----------------------------- Kind - Enkel\
               |          |\
               |          |---- nachfolgende Elemente (Geschwister) - Kind - Enkel\
               |\
               |------ Eltern - anderes Element --------------------- Kind\

\

\

Achse Abkürzung Erklärung\
self
'.'
Das aktuelle Element.\
ancestor
'..'
Vorfahre -> Kann das Elternelement sein, doch man kann bis zur Wurzel hoch navigieren\
ancestor-or-self Vorfahre oder das aktuelle Element -> Achse enthält immer noch das eigene Element\
attribute Attribute des Knotens bestimmen\
child Kindelement ansprechen\
descendent Nachfahre -> Kind oder auch weitere Unterelemente\
descendent-or-self
'//'
Nachfahre oder das aktuelle Element -> Achse enthält immer noch das eigene Element\
following Nachfolgende Knoten (gleiche Ebene) mit deren Kindern (Geschwister) -> Attribute und Namensräume werden ignoriert.\
following-sibling Nachfolgende Knoten der gleichen Ebene (Geschwister) -> Ist der Knoten ein Attribut- oder Namensraumknoten, ist die folgende Geschwisteranzahl 0.\
namespace Namensraum des Knotens ansprechen\
parent Elternelement ansprechen\
preceding Vorherige Knoten (gleiche Ebene) mit deren Kindern (Geschwister) -> Attribute und Namensräume werden ignoriert.\
preceding-sibling Vorherige Knoten der gleichen Ebene (Geschwister) -> Ist der Knoten ein Attribut- oder Namensraumknoten, ist die folgende Geschwisteranzahl 0.\
'*'
Beliebige Knoten auswählen.\
'/'
Wurzelelement auswählen.\

\

==== Auswertung an Hand der Achsen ====\ Alle Lieder -> Kinder von album\

\
<xsl:for-each select = "//child::album/child::lied"> <!-- die Angabe child:: kann weggelassen werden, da die Kindachse des selektierten Knotens immer angesprochen wird -->\
  <xsl:value-of select = "." />\
</xsl:for-each>\

\

\ Albumtitel, welche Attribut stil gesetzt haben\

\
<xsl:for-each select = "//titel/attribute::stil">\
  <xsl:value-of select = "./parent::titel" />\
</xsl:for-each>\

\

\ Albumtitel, welche Attribut stil auf 'Pop' gesetzt haben\

\
<xsl:for-each select = "//album/titel[@stil = 'Pop']"> <!-- attribute wird mit @ abgekürzt -->\
  <xsl:value-of select = "./parent::titel" />\
</xsl:for-each>\

\

\ Alle Interperterangaben des Album ausgehend vom titel-Element, welches ein Nachfahre vom album ist.\

\
<xsl:for-each select = "//titel/ancestor::*">\
  <xsl:value-of select = "./interpret" />\
</xsl:for-each>\

\

\ ==== Knotentypen ====\ Bei der Auswahl kann man auch die Art der Knotentypen eingrenzen:\

Knotentyp Erklärung\
node() Alle Knoten, welche über die gewählte Achse erreichbar sind (auch Namensräume und Attribute)\
comment() Kommentarknoten\
text() Alle Knoten entlang der Achse, welche einen Inhalt (Text) haben\
processing-instruction() Alle Verarbeitungsanweisungen im xml-Dokument (?xml-stylesheet... ?>\
processing-instruction("xyz") Nur Anweisungen im Format (xyz... ?>\
last() Position des letzten Knotens der Ebene und damit die Gesamtzahl der Knoten dieser Ebene\
position() Aktuelle Position des Knotens in der selektierten Ebene\

\

Alle Textknoten wählen, welche direkte Nachfahren sind.\

\
<xsl:for-each select = "//album/child::*/text()">\
  <xsl:value-of select = "./interpret" />\
</xsl:for-each>\

\

\ ==== Prädikate ====\ Einschränkung der Auswahl mit Hilfe von Vergleichen oder logischen Ausdrücken:\

  • Textvergleiche\
  • Logik (or, and, !, <, >, <=, =>, =, !=)\
  • Arithmetik (+, -, *, div, mod)\

Um die < oder > verarbeiten zu können, muss man die entsprechenden Entities &gt ; verwenden.\ \ Alle Elemente 'album' selektieren und 'interpret' ausgeben. Das letzte Element wird ignoriert.\

\
<xsl:for-each select = "//album[position() != last()]">\
  <xsl:value-of select = ".interpret" />\
</xsl:for-each>\

\

\ Das dritte Lied wählen und seinen Inhalt ausgeben.\

\
<xsl:for-each select = "//lied[position() = 3]">\
  <xsl:value-of select = "." />\
</xsl:for-each>\

\

\ === XSL-Transformation (XSLT) ===\ In einem ersten Schritt wird mittels Vorlagen das XML in FO, XHTML, HTML oder WML transformiert. Die Vorlagen bestehen aus Selektoren, welche die Daten auswählen. Die Formatierungen werden im ersten Schritt noch nicht berücksichtigt. Mit Hilfe eines XSLT-Prozessers können dann aber auch Sachen wie Tabellen, Seiten, Absätze, Farben usw. generiert werden. Dies geschieht mit Hilfe einer zusätzlichen Software wie etwa FOP (Format Object Processor). Es wurde für pdf entwickelt, doch kann es auch SVG, PostScript oder normalen Text erzeugen.\ \ Das Einbinden der XSL-Vorlage geschieht wie bei css über eine Präprozessor Anweisung nach der Startzeile im XML-Dokument.\

\
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">\

\

Das xsl für den Namensraum ist nicht zwingend, doch damit erkennt man gleich, worum es sich handelt. Tags, welche nicht diesem Namensraum entsprechen (etwa html), werden ignoriert.\ \ Ein xsl-Stylesheet wird wie das css-Stylesheet eingebunden.\

\
<?xml-stylesheet href = "datei" type = "text/xsl"?>\

\

\ ==== Templates anlegen ====\ Die Templates legen fest, welche Elemente für die weitere Verarbeitung genutzt werden sollen.\

\
<xsl:template match = "Pattern" name = "foo">\
<!-- Verarbeitung -->\
<xsl:template>\

\

Zuerst wird im xml das Pattern gesucht. Wird es gefunden, so wird damit das gemacht, was in der Verarbeitung beschrieben steht. Das Argument name ist optional\ \ ==== Auf andere Templates zugreifen ====\ Da die XML-Elemente verschachtelt sind, muss man von einem Element (Pattern) auf das nächste zugreifen können.\

\
<xsl:apply-templates select = "Pattern" />\

\

Die Verzweigung findet statt, wenn das Element existiert. Sonst wird die Anweisung ignoriert. Wählt man diese Anweisung ohne select, so wird zum Kindelement gesprungen, wenn ein solches existiert.\ \ ==== Beispiel einer Templateverwendung ====\ Zuerst ein Test-xml.\

\
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>\
<?xml-stylesheet href = "test.xsl" type = "text/xsl"?>\
<haupt>\
  <unter1>Unterelement 1</unter1>\
  <unter2>Unterelement 2</unter2>\
</haupt>\

\

\ Eine xsl-Datei dazu könnte folgendermassen aussehen.\

\
<?xml version = "1.0" encoding = "UTF-8"?>\
<xsl:stylesheet version = "1.0" xmlns:xs = "http://www.w3.org/1999/XSL/Transform">\
\
  <xsl:template match = "/">\
    <html>\
      <head><title>Beispiel</title></head>\
      <body>\
        <h3>xml-Elemente ansprechen</h3>\
        <xsl:apply-templates /><!-- springt zum nächsten Unterelement, da ohne Namen --> \
      </body>\
    </html>\
  </xsl:template>\
\
  <xsl:template match = "haupt">\
    <p>Hauptelement</p>\
    <xsl:apply-templates select = "unter2"/><!-- springt zum Element unter2 --> \
  </xsl:template>\
\
  <xsl:template match = "unter1">\
    <p>Unterelement 1</p>\
  </xsl:template>\
\
  <xsl:template match = "unter2">\
    <p>Unterelement 2</p>\
  </xsl:template>\
\
</xsl:stylesheet>\

\

Durch den Sprung zu "unter2" wird Element unter1 ausgelassen und nicht ausgegeben.\ Will man nicht einfach auf eine nächste Vorlage "springen", kann man mit call-template auch zu einem beliebigen Ort springen.\

\
<xsl:call-template name = "gewünschtes Element"></xsl:call-template>\

\

\ ==== Auswahl mit Filtern ====\ Mittels XPath wird das Filterkriterium definiert. Damit kann nicht einfach nur ein Name ausgewählt werden, sondern der Filter bestimmt, ob das gefundene Kriterium (Element) auch genommen wird, weil es der Anfrage entspricht (Nur bestimmte Bereiche usw.).\

\
<xsl:template match = "">\

\

Filter sucht\
album Alle Elemente album\
album/interpret Alle Elemente interpret, wenn diese direkte Unterelemente von album sind\
album//titelzeit Alle Elemente titelzeit, wenn diese Nachfahren von album sind (hier müssen es nicht direkt Kinder sein)\
album/lied[1] Das erste Elemente lied, das direktes Unterelement von album ist\
//lied Alle Elemente lied, egal wo im dokument\
.//lied Alle Elemente lied unterhalb vom Suchstandort aus gesehen\
album/*/titelzeit Alle Elemente titelzeit, welche irgendwo einen Vorfahren Album haben\
album/titel/@stil Alle Elemente titel, welche ein Attribut stil besitzen und direkte Nachfahren (Kinder) von Album sind\
album/titel/[@stil='Pop'] Wie vorher, doch hier muss der stil Pop sein\
album/interpret|sänger|gruppe Alle Elemente interpret, sänger oder gruppe, welche Kinder von album sind\

\

\ ==== Ausgabe ====\ Während xsl:template dem Knoten auswählt, wird er schlussendlich mit xsl:value-of select = "Muster" ausgegeben.\

\
<xsl:template> <!-- Ohne Namenswahl wird das Hauptelement aktiviert -->\
  <xsl:value-of select = "//lied" /> <!-- Alle Elemente 'lied' werden ausgegeben -->\
</xsl:template>\

\

\ === XSLT - Elemente ===\ Möchte man mehrere Elemente mit gleichem Namen verarbeiten, so wählt man diese mit einer Schleife aus. Zum sortieren der Ausgabe kann auf sort zurückgegriffen werden.\ ==== for-each ====\

\
<xsl:template match = "/">\
  <xsl:for-each select = "//album"> <!-- Jedes Album verarbeiten -->\
    <xsl:value-of select = "./interpret" /> <!-- Interpret ausgeben -->\
    <xsl:value-of select = "./titel" />\
    <xsl:for-each select = "//lied"> <!-- Jedes Lied verarbeiten -->\
      <xsl:value-of select = "." /> <!-- Lied ausgeben -->\
    </xsl:for-each> <!-- end Jedes Lied verarbeiten -->\
  </xsl:for-each> <!-- end Jedes Album verarbeiten -->\
</xsl:template>\

\

\ === sort ===\

\
<xsl:sort select = "Element" [order = "" data-type = "" case-order = ""]>\

\

Das angewählte Element wird sortiert. Bei Order gibt man ascending oder descending an. Asc ist Standard. Mit dem Datentyp legt man die Sortierreihenfolge fest für text (Standard) oder number (Zahl). Bei Texten kann mir lower-first (Standard) oder upper-first festgelegt werden, ob zuerst Gross- oder Kleinbuchstaben kommen.\

\
<xsl:template match = "/">\
  <xsl:for-each select = "//album">\
    <xsl:sort select = "./interpret" order = "descending" />  <!-- Interpreten absteigend sortieren -->\
    <xsl:value-of select = "./interpret" />\
    <xsl:value-of select = "./titel" />\
    <xsl:for-each select = "//lied">\
      <xsl:sort select = "." case-order = "upper-first" />  <!-- zuerst Grossbuchstaben ausgeben (alphabetisch ist implizit). -->\
      <xsl:value-of select = "." />\
    </xsl:for-each>\
  </xsl:for-each>\
</xsl:template>\

\

Wie man sieht, kann man für die Sortierung auch Unterelemente verwenden.\ \ === if ===\ Prüfen, ob das angewählte Element einer Bedingung entspricht. \

\
<xsl:template match = "/">\
  <xsl:for-each select = "//album">\
    <xsl:if test = "interpret = 'Abba'">  <!-- Nur wenn interpret = Abba ausführen -->\
      <xsl:value-of select = "./interpret" />\
      <xsl:value-of select = "./titel" />\
      <xsl:if test = "titel/@stil = 'Pop' or titel/@stil = 'p'">  <!-- Nur wenn titelattribut Pop oder p ausführen -->\
        <xsl:value-of select = "." />\
      </xsl:if>\
    </xsl:if>\
  </xsl:for-each>\
</xsl:template>\

\

\ ==== choose-when-otherwise ====\ Möchte man nicht nur bei einer erfüllten Bedingung etwas ausführen, so wird eine angepasste if then else verwendet.\

\
<xsl:choose>\
  <xsl:when test = "Mustervergleich">\
     <!-- Ausführen, wenn Bedingung erfüllt -->\
  </xsl:when>\
  <xsl:when test = "Mustervergleich2">\
     <!-- Ausführen, wenn Bedingung2 erfüllt -->\
  </xsl:when>\
  <xsl:otherwise>\
     <!-- Ausführen, wenn keine Bedingung erfüllt -->\
  </xsl:otherwise>\
</xsl:choose>\

\

Achtung, nach ausführen einer Bedingung wird die Anweisung verlassen. Es lassen sich also nicht mehrere Anweisungen abarbeiten. Bei Zahlen kann man auch mit grösser und kleiner Vergleichen arbeiten.\ \ == DOM und SAX ==\ === DOM ===\ Das DOM bildet die XML-Datei im Arbeitsspeicher ab. Über eine API kann dann mit einer beliebigen Programmiersprache darauf zugegriffen werden. Da das gesamte Dokument im Arbeitsspeicher gehalten wird, kann der Zugriff mit SAX besser sein.\ Der Zugriff erlaubt die beliebige Manipulation des Dokuments lokal ohne Serverzugriff. Das Problem zwischen den Browsern besteht im unterschiedlichen Zugriff auf die Elemente.\ ==== Zugriff über ActiveX mit IE ====\ Zuerst das Objekt erstellen und danach den Inhalt der Datei einfügen.\

\
<script language = "JavaScript">\
  var ObjektName = new ActiveXObject("microsoft.xmldom");\
  ObjektName.load("XML-Datei");\
</script>\

\

==== Knotenauswahl ====\ Hat man folgende Angabe <p align = "center">Dies ist<i>fett</i>.</p>, so besitzt <p> 4 Knoten:\

  • align = "center" -> Attributknoten\
  • Dies ist -> Inhaltsknoten 1\
  • <i>fett</i> -> Kindknoten i\
  • . -> Inhaltsknoten 2\

Der Zugriff geschieht wie bei XML über Schlüsselworte, wobei es hier keine Abkürzungen gibt.\ \

Element Erklärung\
documentElement Wurzel\
parentNode Elternelement des selektierten Elements\
childNodes Alle Unterknoten des selektierten Elements\
firstChild Erstes Kindelement\
lastChild Letztes Kindelement\
nodeName Name des selektierten Elements\
item() Ein bestimmtes untergeordnetes Element wählen (Zählung beginnt bei 0)\
attributes() Attributwerte wählen (Zählung beginnt bei 0)\
text Inhalt des gewählten Elements/Attributs ausgeben\

\

Ein Element auswählen:\

\
documentElement.childNodes.item(3).text; // Inhalt des 4.Elements ausgeben -> Hier der Punkt "."\

\

Ein Attribut ausgeben:\

\
documentElement.childNodes.item(0).attribut(0).text; // 1. Attribut des 1.Elements ausgeben -> Hier "center"\

\

\ ==== Knoten verarbeiten ====\ Mit dem Attribut length stellt man fest, wie viele Elemente ein Knoten besitzt. Anschliessend können diese mit einer Schlaufe durchlaufen werden.\

\
element = XMLObjekt.documentElement.childNodes; // Elemente zählen und speichern\
for (i = 0; i < element.length; i++) { // Durch alle Elemente durchgehen\
  document.write('element.item(i).nodeName + ' ' + 'element.item(i).text'); // Name des Elementes und dessen Inhalt ausgeben\
} // end for\

\

==== Knoten direkt ansprechen ====\ Möchte man Elemente ansprechen und weiss deren Namen, so geht dies mit:\

\
document.getElementsByTagName('Name'); // Inhalt des Elementes mit Namen 'Name' holen\

\

\ Da es natürlich mehrere Elemente mit dem Namen geben kann, werden diese in einem Array gespeichert und können über den Index angesprochen werden. Weiss man, dass ein Element einmalig ist, genügt der Zugriff aufs Element 0, für Prüfungen sollte aber die Länge getestet werden.\

\
ausgabe = document.getElementsByTagName('Test');\
document.write('ausgabe.item(0).text');\

\

\ Will man alle Elemente behandeln, braucht es halt wieder eine Schleife über die Arraylänge, wie im oberen Kapitel beschrieben.\ \ === SAX ===\ SAX heisst Simple API for XML. Hier wird nicht alles in den Speicher geschaufelt, sondern es gibt einen Ereignis gesteuerten Mechanismus zum Lesen der Elemente.\ Zuerst wird das XML geparst. Je nach Element werden die entsprechenden Ereignisse generiert:\

  • Anfang eines Elements (Start-Tag)\
  • Inhalt eines Elements\
  • Ende eines Elements (Ende-Tag)\
  • Kommentar\
  • Entity-Definition\
  • Fehler / Warnungen\

Da der Parser die Ereignisse nur einmal durchläuft, muss man die Struktur intern abspeichern, womit man wieder beim DOM landet, oder das Dokument nochmals parsen. Aus diesem Grund wird es meist zum einmaligen Einlesen eines XML verwendet.\ \ == XLink ==\ Dieses Kapitel behandelt Links in XML-Dokumenten.\ Interne Verweise werden mit XPath realisiert, während externe Verweise (Ressourcen) mittels XLink adressiert werden.\ \ === Verwendung ===\ Zuerst muss ein Namensraum festgelegt werden. Dieser ist entweder direkt mit dem Element verbunden:\

\
<element xmlns:xlink = "http://www.w3.org/1999/xlink"\
  xlink:type = "simple"\
  xlink:href = "datei.xml"\
>\
  Inhalt des Elements\
</element>\

\

\ oder es gibt einen Bereich, in dem der Link gültig ist:\

\
<xlink:simple xmlns:xlink = "http://www.w3.org/1999/xlink" xlink:href = "datei.xml">\
  </element>Inhalt des Elements</element>\
</xlink:simple>\

\

\ Das bedeutet, dass jedes Element zu einem XLink werden kann. Es muss einfach die entsprechenden globalen Attribute verwenden:\

\
<?xml version = "1.0" encoding = "ISO-8859-1" standalone = "yes" ?>\
<xlink:simple xmlns:xlink = "http://www.w3.org/1999/xlink">\
  <a xlink:type = "simple"\
     xlink:actuate = "onRequest"\
     xlink:show = "replace"\
     xlink:href = "datei.xml"\
  >\
    Das ist ein Link\
  </a>\
</xlink:simple>\

\

Dieser Link wird erst auf Anfrage (Klick) ausgeführt und ersetzt die aktuelle Seite. \ \ Will man ein Bild einbinden, so geht dies folgendermassen:\

\
<?xml version = "1.0" encoding = "ISO-8859-1" standalone = "yes" ?>\
<xlink:simple xmlns:xlink = "http://www.w3.org/1999/xlink">\
  <img xlink:type = "simple"\
     xlink:actuate = "onLoad"\
     xlink:show = "embed"\
     xlink:href = "bild.jpeg"\
  >\
    Ein integriertes Bild.\
  </img>\
</xlink:simple>\

\

\ === Attribute ===\ Folgende Attribute stehen für die Links zur Verfügung:\

Attribut Bedeutung\
type Bezeichnet XML-Elemente, welche als Link behandelt werden sollen. Dieses Attribut kann die Werte simple, extended, locator, arc, resource oder title annehmen.\
href Adresse oder Ressource. Es muss sich um eine absoulte oder relative URL handeln. Besitzt das Attribut type den Wert simple oder locator, so muss href auch angegeben werden.\
role Bezeichnet die Quelle von der aus man verlinkt.\
arcrole Bemerkung zum XLink-Element.\
title Bezeichnet die Funktion des Elements.\
show Legt fest, wie der Link angezeigt werden soll. embed zeigt die externe Ressource direkt dar. new verwendet für die Anzeige ein neues Fenster und replace ersetzt das aktuelle Dokument mit der verlinkten Ressource.\
actuate Legt fest, wann der Link aktiviert werden soll. Möglich ist: onLoad, onRequest, other und none.\
label, from, to Eindeutige Bezeichnung des Elementes, auf das man sich mit from und to direkt beziehen kann.\

\

\ === Erweiterte Links ===\ Werden mit extended aufgebaut. Zuerst werden die möglichen Ziele mit Labeln erstellt. Anschliessend fügt man hinzu, welche lokalen Ressourcen an den Links beteiligt sind und anschliessend werden die Label miteinander verknüpft. Der href wird mit der entsprechenden URL ersetzt, die man dann braucht.\

\
<?xml version = "1.0" encoding = "ISO-8859-1" standalone = "yes" ?>\
<xlink:extended xmlns:xlink = "http://www.w3.org/1999/xlink">\
  <wo xlink:type = "locator" xlink:href = "..." xlink:label = "link1" />\
  <wo xlink:type = "locator" xlink:href = "..." xlink:label = "link2" />\
  <wo xlink:type = "locator" xlink:href = "..." xlink:label = "link3" />\
\
  <was xlink:type = "resource" xlink:label = "Attributswert">lokale Ressource</was>\
  <was xlink:type = "resource" xlink:label = "Bild">bild.jpeg</was>\
\
  <wie xlink:type = "arc" xlink:from = "link1" xlink:to = "link2" />\
  <wie xlink:type = "arc" xlink:from = "link3" xlink:to = "link1" />\
  <wie xlink:type = "arc" xlink:from = "link2" xlink:to = "link3" />\
</xlink:extended>\

\

\ Diese Elemente können auch mit dem title-Element beschriftet werden, damit der Benutzer sieht, was mit dem Element genau gemacht werden kann. Das Element kann auch mehrfach verwendet werden, falls man mehrere Sprachen unterstützen muss.\ \ == Links und Bücher ==\

Link / Buch Beschreibung Niveau\
XML1.1 Grundlagen
ISBN 30-0-14-41-01
15.10.2003
Einführung in XML auf deutsch. Dieser Artikel ist hauptsächlich eine Zusammenfassung dieses Buches. Anfänger\

\