WerkzeuggĂĽrtel
Anwendungen, die XML-Dokumente verarbeiten, müssen ihr Handwerkszeug immer parat haben – gerade dann, wenn sie ohne Netz arbeiten. XML-Kataloge halten alle wichtigen Hilfsmittel jederzeit griffbereit.
- Michael Riepe
XML-Dokumente sind selten eigenständig. Die meisten enthalten externe Referenzen, etwa auf die zugehörige Document Type Definition (DTD). Bei weitverbreiteten Dokumenttypen hat die in der Regel die Form einer "öffentlichen" ID:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
etwa deklariert eine Datei als XHTML-Dokument. Der optionale URI-Parameter bietet XML-Parsern die Möglichkeit, die zugehörige DTD aus dem Netz herunterzuladen.
Dateien immer im Zugriff
Wer mit einer eigenen DTD arbeitet, legt sie normalerweise in einer Datei ab: <!DOCTYPE meindok SYSTEM "meindok.dtd"> verweist auf die Datei meindok.dtd im selben Verzeichnis wie das Dokument. Sollen mehrere Nutzer eine DTD verwenden, empfiehlt es sich jedoch, deren Definition in einem Systemverzeichnis wie /usr/share/xml zu speichern oder die DTD-Datei auf einem Webserver im Intra- oder Internet bereitzustellen. </p> <p>
Letzteres erlaubt auch Außendienstmitarbeitern, von ihrem Laptop aus auf die Datei zuzugreifen – sofern sie eine Internetverbindung aufbauen können. Andernfalls müssen sie mit einer lokalen Kopie arbeiten. Allerdings ist es nicht praktikabel, bei jedem Standortwechsel die DOCTYPE-Deklarationen sämtlicher Dokumente zu ändern. Abhilfe schaffen die 2002 von OASIS (Organization for the Advancement of Structured Information Standards) spezifizierten XML-Kataloge.
Mit ihrer Hilfe lassen sich öffentliche und System-Identifier bestimmten URIs zuordnen (Identifier Mapping). Der Katalogeintrag
<public publicId="-//W3C//DTD XHTML 1.0 Strict//EN" uri="file:///usr/share/xml/xhtml1-strict.dtd"/>
etwa informiert Anwendungen, dass Version 1.0 der XHTML-DTD in der genannten Datei zu finden ist. Analog kann man mit <system systemId="<ID>" uri="<URI>"/> dem XML-Parser eine andere Definitionsdatei fĂĽr eine system- oder unternehmensintern verwendete DTD unterjubeln. Legt man fĂĽr unterschiedliche Standorte jeweils einen eigenen Katalog an, kann man leicht zwischen Intranet-, Internet- und Offline-Betrieb wechseln.
System Identifier ändern sich gelegentlich, etwa durch einen Server- oder Domain-Umzug. Will oder kann man nicht alle existierenden Dokumente editieren, hilft ein Katalogeintrag wie <rewriteSystem systemIdStartString="http://alte.dom.ain/" rewritePrefix="http://neue.dom.ain/"/> weiter. Er weist die Anwendung an, den Anfang der System ID zu ersetzen und mit dem Ergebnis eine neue Suche im Katalog zu starten.
Manche Referenzen bestehen lediglich aus einem URI, etwa das href-Attribut eines Hyperlinks. Will man sie umleiten, kann man sich des uri-Elements bedienen.
Oft ist es allerdings effizienter, ganze Verzeichnisse auf einmal zu behandeln. Wer etwa DocBook-XML nutzt und die unterschiedlichen Versionen der DTDs lokal in /usr/share/xml/docbook/<version> gespeichert hat, schlägt mit <rewriteURI uriStartString="http://www.oasis-open.org/docbook/xml/" rewritePrefix="file:///usr/share/xml/docbook/"/> alle Fliegen mit einer Klappe. Wie bei rewriteSystem führt die Anwendung mit dem Ersatz-URI eine neue Suche durch.
Wer eine neuere DocBook-XML-DTD als Zip-Archiv herunterlädt, findet im Paket unter anderem eine Datei namens catalog.xml. Sie enthält ein Katalog-Fragment, das sich mit dem Element nextCatalog in eigenen Katalogen referenzieren lässt. Listing 1 zeigt einen "Master"-Katalog, der Referenzen auf andere Kataloge enthält. Der XML-Parser durchsucht zuerst den Hauptkatalog, dann die Unterkataloge in der angegebenen Reihenfolge, bis er fündig wird.
Listing 1: Master-Katalog
<?xml version="1.0"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<nextCatalog catalog="file:///usr/share/xml/docbook/5.0/catalog.xml"/>
<nextCatalog catalog="file:///usr/share/xml/docbook/4.5/catalog.xml"/>
</catalog>
Delegieren spart Zeit
In umfangreichen hierarchischen Katalogen kann die Suche einige Zeit in Anspruch nehmen – vor allem, wenn Rewrite-Einträge den Parser zwingen, von vorn zu beginnen. Unter Umständen empfiehlt es sich daher, den Suchraum zu partitionieren. Mit
<delegatePublic publicIdStartString="-//OASIS//" catalog="file:///etc/xml/oasis-catalog"/>
<delegatePublic publicIdStartString="-//W3C//" catalog="file:///etc/xml/w3c-catalog"/>
lassen sich zum Beispiel für die von OASIS und dem W3C definierten Standards getrennte Kataloge verwenden. Analog kann <delegateSystem systemIdStartString="http://beispiel.com/" catalog="file:///etc/xml/catalogs/beispiel.com"/> zu einer Katalogdatei mit system- und rewriteSystem-Einträgen für Identifier verzweigen, die mit dem angegebenen Präfix beginnen. <delegateURI uriStartString="http://beispiel.com/" catalog="file:///etc/xml/catalogs/uri.beispiel.com"/> delegiert die Verantwortung für URIs ohne zugehörigen Public- oder System-Identifier.