XML Catalogs: lokální DTD a XSD bez sítě

XML katalog překládá veřejné identifikátory, systémové identifikátory a URI na jiné adresy. Umožňuje používat lokální kopie DTD a schémat místo síťového stahování.

Autor: Aktualizováno

Lokální mapování

Tento catalog.xml mapuje identifikátor DTD na soubor ve složce dtd vedle katalogu. Relativní uri se řeší vůči katalogu. System slouží pro externí systémový identifikátor, uri pro hledání zdroje podle jeho URI.

Lokální mapování
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
 <system systemId="https://example.cz/katalog.dtd" uri="dtd/katalog.dtd"/>
 <uri name="https://example.cz/katalog.xsd" uri="schema/katalog.xsd"/>
</catalog>

Použití v libxml2

Pokud potřebuješ důvěryhodnou DTD, ulož ji lokálně a zapoj katalog. V libxml2 se katalogy určují proměnnou XML_CATALOG_FILES. Ověř návratový kód; jiné knihovny používají vlastní rozhraní pro vyhledávání a načítání souborů (resolver).

Použití v libxml2
XML_CATALOG_FILES=catalog.xml xmllint --noout --valid katalog.xml

Více mapování

Public řeší PUBLIC identifikátory, rewriteSystem a rewriteURI přepisují začátky adres. NextCatalog připojuje další katalog. Pravidla prefer a pořadí kandidátů mají definovaný význam, proto katalog otestuj na přesných URI z reálných dokumentů.

Katalog není firewall

Katalog nemusí zachytit každý odkaz. Pokud katalog odkaz nezná, knihovna se může pokusit načíst soubor přímo z uvedené adresy. Odděleně zakaž nechtěnou síť a lokální soubory, kontroluj i import/include schémat. Pro reprodukovatelnou validaci verzuj katalog společně s lokálními schématy.

Úplná lokální validační sada

dtd/katalog.dtd
<!ELEMENT katalog (kniha*)>
<!ELEMENT kniha (#PCDATA)>
katalog.xml — identifikátor odpovídá catalog.xml v úvodu
<!DOCTYPE katalog SYSTEM "https://example.cz/katalog.dtd">
<katalog><kniha>XML</kniha></katalog>
Validace s lokálním katalogem a zakázanou sítí
XML_CATALOG_FILES=catalog.xml xmllint --nonet --noout --valid katalog.xml

Katalog přesměruje systemId přesně na dtd/katalog.dtd, takže v tomto testu není potřeba síť. Relativní cíl je vztažený ke katalogu. Po změně systémového identifikátoru na jinou URL bez mapování má validace při --nonet selhat. Tím ověříš, že úspěch nebyl závislý na nechtěném síťovém stažení.

Pro rozsáhlé sady udržuj katalog, DTD, XSD a importované soubory společně ve verzované složce. Přesměrování na jinou verzi schématu mění pravidla validace: stejný dokument pak může nově projít nebo být odmítnut. Katalog dokumentuje přesměrování, ale soubory samotné musí být důvěryhodné. Pravidla resolverů jsou v OASIS XML Catalogs; konkrétní integraci ověř v API své knihovny.