Els documents XML són, generalment, entitats externes, com per exemple identificadors públics o privats de Document Type Definition. Aquestes relacions externes s'expressen mitjançant URIs; generalment com a URLs. Però, si s'especifiquen com a URLs absolutes, aleshores només s'hi poden accedir a través de la xarxa, de manera que el processament de documents XML es torna susceptible a caigudes de xarxa. Per altra banda, si s'especifiquen les URLs de manera relativa, aleshores són de poca utilitat fora del context en què s'han creat. Per exemple, l'URL "../../xml/dtd/docbook.xml" només és útil en circumstàncies molt limitades.
Una de les maneres d'evitar aquests problemes és la de fer servir resolució d'entitats (part de l'estàndard SAX) o resolució de URIs (part de l'estàndard JAXP). Amb un sistema de resolució es pot examinar la URI dels recursos que es demanen i determinar la millor manera de respondre a les peticions. El catàleg XML és un document que descriu la relació entre les referències a entitats externs i les locals equivalents.
Un exemple de Catalog.xml
El següent exemple és un catàleg XML senzill que mostra com es poden relacionar els DTDs locals per validar planes XHTML.
<?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>
Amb aquest catàleg és possible resoldre l'identificador -//W3C//DTD XHTML 1.0 Strict//EN a la URI local dtd/xhtml1/xhtml1-strict.dtd. De manera similar, també pot resoldre dos altres identificadors públics a URIs locals.
Fixa't com el document de més amunt inclou un DOCTYPE que pot ocasionar problemes si s'intenta accedir a l'URL del DOCTYPE (és a dir, [enllaç sense format] http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd) abans que el sistema de resolució de catàlegs estigui completament en marxa. Per evitar aquest problema senzillament s'ha d'esborrar la declaració del DOCTYPE. El següent document n'és un exemple i també mostra declaracions de <system/> com a alternativa a declaracions de <public/>.
<?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>
Exemple Java SAX de com utilitzar un catàleg
La resolució de catàleg és disponible per diversos llenguatges de programació. El següent exemple mostra com es pot fer servir SAX amb Java per llegir un document emprant org.apache.xml.resolver.tools.CatalogResolver per resoldre entitats externes a les seves equivalents locals. El org.apache.xml.resolver.tools.CatalogResolver té els seus orígens en el paquet Xerces de la Funció Apache, però ara es distribueix juntament amb el Java d'Oracle.
Simplement crea un SAXParser de manera normal, recull-ne el lector de XML i estableix la resolució d'entitats fent servir el CatalogResolver estàndard o un que hagis creat tu mateix.
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);
És important cridar el mètode parse del lector i no al de l'analitzador SAX.
Enllaços externs