XML katalog je dokument popisující korespondenci mezi odkazy na externí entity a jejich lokálně dostupnými ekvivalenty. XML katalog je používán XML resolverem pro zpřístupnění lokálně uložených definičních souborů v případě nedostupnosti sítě.

XML dokumenty se zpravidla odkazují na externí entity, například veřejné a/nebo systémové ID pro definice typu dokumentu. Tyto externí vztahy se vyjadřují pomocí identifikátorů URI, které jsou typicky URL.

Absolutní URL budou fungovat, pouze pokud jsou dosažitelné z vaší sítě. Kvůli odkazům na nelokální prostředky je zpracování XML citlivé na plánované i neplánované výpadky sítě.

Naopak relativní URL fungují pouze v tom kontextu, v jakém byly původně vytvořeny. Například URL „../../xml/dtd/docbookx.xml“ bude fungovat pouze za velmi specifických podmínek.

Těmto problémům lze zabránit používáním resolveru entit (který je standardní součástí balíku SAX) nebo URI Resolveru (standardní součást JAXP). Resolver může kontrolovat použitá URI a určovat, kde lze nalézt potřebné soubory.

Příklad souboru Catalog.xml editovat

Následující jednoduchý katalog ukazuje, jak lze lokálně kešované DTD poskytovat například nástrojům pro validaci XHTML stránek:

 
  <?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"
           prefer="public">

    <public publicId="-//W3C//DTD XHTML 1.0 Strict//EN"
            uri="dtd/xhtml1/xhtml1-strict.dtd"/>

    <public publicId="-//W3C//DTD XHTML 1.0 Transitional//EN"
            uri="dtd/xhtml1/xhtml1-transitional.dtd"/>

    <public publicId="-//W3C//DTD XHTML 1.1//EN"
            uri="dtd/xhtml11/xhtml11-flat.dtd"/>

  </catalog>

Tento katalog umožňuje resolvovat -//W3C//DTD XHTML 1.0 Strict//EN na lokální URI dtd/xhtml1/xhtml1-strict.dtd a poskytuje lokální URI pro další dva veřejné ID.

Výše uvedený dokument však sám obsahuje DOCTYPE, což může způsobit, že se parser pokusí přistupovat k systémovému ID URL pro DOCTYPE (tj. http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd) v okamžiku, kdy resolver katalogu ještě není plně funkční, což může způsobit jeho selhání. Tomu lze zabránit odstraněním deklarace DOCTYPE.

Následující příklad, který ukazuje jak ztotožnit deklarace <system/> s deklaracemi <public/>, proto deklaraci DOCTYPE neobsahuje:

  <?xml version="1.0"?>
  <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

    <system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
            uri="dtd/xhtml1/xhtml1-strict.dtd"/>

    <system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
            uri="dtd/xhtml1/xhtml1-transitional.dtd"/>

    <system systemId="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
            uri="dtd/xhtml11/xhtml11-flat.dtd"/>

  </catalog>

Používání katalogu - příklad v Java SAX editovat

Resolvery katalogů jsou dostupné pro různé programovací jazyky. Následující příklad ukazuje, jak lze v jazyce Java vytvořit SAX parser umožňující zpracovávat vstupy, ve nichž se používá org.apache.xml.resolver.tools.CatalogResolver pro resolvování externích entit na lokálně kešované instance. Tento resolver pochází z Apache Xerces a nyní je obsažen v runtime Javy firmy Sun.

SAXParser vytvoříme obvyklým způsobem pomocí factories. Dostaneme XML reader a jeho entity resolver nastavíme buď na standardní (CatalogResolver) nebo na jiný podle potřeby:

  final SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
  final XMLReader reader = saxParser.getXMLReader();

  final ContentHandler handler = ...;
  final InputSource input = ...;

  reader.setEntityResolver( new CatalogResolver() );
  reader.setContentHandler( handler );
  reader.parse( input );

Metoda parse se musí volat na reader, ne na SAX parser.

Odkazy editovat

Reference editovat

V tomto článku byl použit překlad textu z článku XML Catalog na anglické Wikipedii.

Související články editovat