xmllint und Kataloge
Ist es sinnvoll einen Artikel über ein Software-Feature zu schreiben, wenn die gesamte Aussage des zu schreibenden Artikels in der Software-Dokumentation bereits enthalten ist? Falls Du grundsätzlich “Nein” sagst, kannst Du hier aufhören zu lesen und einfach einen Blick in die Doku von xmllint werfen.
Wenn andererseits immer wieder die gleiche Frage an mich herangetragen wird und ich sie mir gelegentlich selbst stelle (sic!), ist es zumindest für mich sinnvoll den Artikel zu schreiben; in Zukunft kann ich immer wieder darauf verweisen oder nachlesen. Also, hier geht’s los. Es geht um Verwendung von XML-Katalogen mit xmllint.
Ausgangspunkt der Frage ist die Ausgabe, die man erhält, wenn man xmllint ohne Parameter aufruft. Der relevante Ausschnitt sieht so aus:
> xmllint Usage : xmllint [options] XMLfiles ... Parse the XML files and output the result of the parsing --catalogs : use SGML catalogs from $SGML_CATALOG_FILES otherwise XML Catalogs starting from file:///etc/xml/catalog are activated by default --nocatalogs : deactivate all catalogs
Dieser Hilfstext legt die Vermutung nahe, dass es ausschließlich für SGML-Kataloge, die für XML genauso sinnvoll sind, eine Umgebungsvariable gäbe. Für XML-Kataloge müsse es hingegen einen Katalog unter /etc/xml geben.
Das ist falsch. Wie die Doku (s.o.) bestätigt, gibt es für XML-Kataloge eine entsprechende Umgebungsvariable namens XML_CATALOG_FILES
. Ein darin genanntet Katalog kann natürlich weitere Kataloge einbinden. Der Spezifikation ist die Dokumentation für das nextCatalog-Element zu entnehmen. Ein Beispiel:
<nextCatalog id="xhtmlCat" catalog="/linkwerk/.../xhtml_catalog.xml"/>
Wenn man nun anfängt, Kataloge mit xmllint einzusetzen, stößt man durchaus mal auf die Frage, ob der oder alle Kataloge so von xmllint gefunden wurden, wie erwartet. Auch für diese Frage gibt es Hilfe:
Nach Setzen der Variablen XML_DEBUG_CATALOG
ist xmllint sehr mitteilungsfreudig bezüglich des Ladens der Kataloge. Wer nur daran interessiert ist, welche externen Entities xmllint geladen hat, der dürfte bereits mit der folgenden Kommandozeilenoption zufrieden sein:
--load-trace : print trace of all external entites loaded
Abschließend: Wer mit libxml und Katalogen arbeiten möchte, sollte sich xmlcatalog ansehen. Ein kleines, nützliches Programm zur Katalogverwaltung.
Es zeigt sich wieder einmal, wer (Dokumentation) lesen kann, ist klar im Vorteil. Wer darüber hinaus einmal Gelesenes nicht vergisst, ist noch mehr im Vorteil. Alle anderen schreiben Blog-Artikel. Mal sehen, ob’s (mir) hilft.