Das include-Element

(Auszug aus "XML in a Nutshell" von Elliotte Rusty Harold & W. Scott Means)

Die Schlüsselkomponente von XInclude ist das Element include. Es muss sich im Namensraum "http://www.w3.org/2001/XInclude" befinden. Die Präfixe xi oder xinclude sind frei wählbar. Natürlich kann sich das Präfix wie immer ändern, solange der URI derselbe bleibt. Dieses Element besitzt ein href-Attribut, das eine URL enthält, die auf das Dokument zeigt, das eingeschlossen werden soll. Beispielsweise schließt folgendes Element das Dokument ein, das unter der relativen URL AlanTuring.xml zu finden ist:

<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="AlanTuring.xml"/>

Natürlich können Sie ebenso gut absolute URLs verwenden:

<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="http://cafeconleche.org/books/xian3/examples/12/AlanTuring.xml"/>

Anmerkung: Technisch gesehen, enthält das href-Attribut eher einen IRI als einen URI oder eine URL. Ein IRI ist wie ein URI mit dem Unterschied, dass er Nicht-ASCII-Zeichen wie é und Δ enthalten kann. Üblicherweise sind diese Zeichen in UTF-8 kodiert. Dann wird jedes Byte der UTF-8-Byte-Folge mit einem Prozentzeichen geschützt, um den IRI in einen URI umzuwandeln, bevor er aufgelöst wird. Wenn Sie in Englisch arbeiten und keinen XInclude-Prozessor schreiben, dann können Sie das problemlos ignorieren. Alle Standard-URLs sind zulässige IRIs. Wenn Sie mit nicht-englischen Nicht-ASCII-IRIs arbeiten, bedeutet das einfach, dass Sie sie genau so verwenden können, wie Sie es erwarten würden und sich nicht selbst darum kümmern müssen, die Nicht-ASCII-Zeichen von Hand hexadezimal zu kodieren.

Normalerweise wird die Namensraum-Deklaration in das Wurzelelement des einschließenden Dokuments gepackt und nicht bei jedem xi:include-Element einzeln wiederholt. Im weiteren Verlauf dieses Abschnitts über XInclude werden wir annehmen, dass das Namensraum-Präfix xi an den richtigen Namensraum-URI gebunden ist.

Das folgende Beispiel zeigt ein Dokument, das zwei xi:include-Elemente enthält. Das erste lädt das Dokument, das unter der relativen URL AlanTuring.xml zu finden ist. Das zweite lädt das Dokument unter der relativen URL RichardPFeynman.xml.

<?xml version="1.0"?>
<leute xmlns:xi="http://www.w3.org/2001/XInclude" >
   <xi:include href="AlanTuring.xml"/>
   <xi:include href="RichardPFeynman.xml"/>
</leute>

Code-Beispiel: Ein Dokument, das mit XInclude zwei andere Dokumente lädt

Wenn ein XInclude-Prozessor dieses Dokument liest, parst er die XML-Dokumente, die unter den beiden URLs gefunden werden, und fügt ihren Inhalt (ausschließlich eventuell vorhandener XML- und Dokumenttyp-Deklarationen) an den Positionen in das fertige Dokument ein, die von den xi:include-Elementen angegeben werden. Die xi:include-Elemente werden entfernt. XIncludes werden standardmäßig nicht verarbeitet, und viele Parser verstehen oder unterstützen XInclude nicht. Sie müssen entweder einen Filter verwenden, der die xi:include-Elemente vor der weiteren Verarbeitung auflöst, oder dem Parser sagen, dass er XIncludes verarbeiten soll. Die genauen Details sind bei jedem Parser anders. Beispielsweise sagt dem xmllint-Parser der libxml die Option --xinclude, dass er XIncludes auflösen soll:

$ xmllint --xinclude http://cafeconleche.org/books/xian3/examples/12/12-1.xml
<?xml version="1.0"?>
<leute xmlns:xi="http://www.w3.org/2001/XInclude">
  <person geboren="1912" gestorben="1954" xml:base="http://cafeconleche.org/books/xian3/examples/12/AlanTuring.xml">
    <name>
      <vorname>Alan</vorname>
      <nachname>Turing</nachname>
    </name>
    <beruf>Informatiker</beruf>
    <beruf>Mathematiker</beruf>
    <beruf>Kryptograph</beruf>
  </person>
  <person geboren="1918" gestorben="1988" xml:base="http://cafeconleche.org/books/xian3/examples/12/RichardPFeynman.xml">
    <name>
      <vorname>Richard</vorname>
      <mittelinitial>P</mittelinitial>
      <nachname>Feynman</nachname>
    </name>
    <beruf>Physiker</beruf>
    <hobby>Bongos spielen</hobby>
  </person>
</leute>

Sie sehen, dass der Prozessor xml:base-Attribute hinzugefügt hat, mit denen er versucht, die Basis-URIs der eingeschlossenen Elemente festzuhalten. An dieser Stelle ist das nicht so wichtig, weil sich das einschließende Dokument und die beiden eingeschlossenen Dokumente alle in demselben Verzeichnis befinden. Aber wenn Sie ein Dokument aus unterschiedlichen Quellen auf unterschiedlichen Servern und unterschiedlichen Verzeichnissen zusammenstellen, hilft das sicherzustellen, dass relative URLs, die im Text enthalten sind, korrekt aufgelöst werden.

Es ist auch wichtig festzuhalten, dass das Einschließen auf dem geparsten Dokument basiert. Es ist nicht so, als würde der nackte Text kopiert und eingefügt. XML-Deklarationen werden nicht kopiert. Unbedeutender Whitespace kann nach dem Einschließen nicht mehr so sein wie vorher. Whitespace im Prolog wird überhaupt nicht kopiert. Dokumenttyp-Deklarationen werden nicht kopiert. Aber alle Standardwerte für Attribute, die sie definieren, werden kopiert.

libxml enthält eine ziemlich vollständige Unterstützung für XInclude. Xerces-J 2.7 bietet eine unvollständige Unterstützung für XInclude. Andere Parser bieten überhaupt keine Unterstützung. Deswegen ist es bei ihnen erforderlich, Bibliotheken von Dritten einzusetzen, die XInclude unterstützen wie XOMs nu.xom.xinclude-Package. Das ist immer noch eine ziemlich junge Technologie.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

  


Copyright © 2005 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML in a Nutshell" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de