Los documentos XML suelen hacer referencia a entidades externas, por ejemplo, el ID público o del sistema de la definición del tipo de documento . Estas relaciones externas se expresan mediante URI, normalmente como URL.
Sin embargo, las URL absolutas solo funcionan cuando la red puede acceder a ellas. Depender de recursos remotos hace que el procesamiento de XML sea susceptible a tiempos de inactividad de la red planificados y no planificados.
Las URL relativas solo son útiles en el contexto en el que se crearon inicialmente. Por ejemplo, la URL "../../xml/dtd/docbookx.xml" normalmente solo será útil en circunstancias muy limitadas.
Una forma de evitar estos problemas es utilizar un solucionador de entidades (una parte estándar de SAX ) o un solucionador de URI (una parte estándar de JAXP ). Un solucionador puede examinar los URI de los recursos que se solicitan y determinar la mejor manera de satisfacer esas solicitudes. El catálogo XML es un documento que describe una correlación entre referencias de entidades externas y equivalentes almacenados en caché local. [1]
Ejemplo de catálogo.xml
El siguiente catálogo simple muestra cómo se pueden proporcionar DTD almacenados en caché localmente para una herramienta de validación de páginas XHTML, por ejemplo.
<?xml version="1.0"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//Catálogo XML de resolución de entidades DTD V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catálogo xmlns= "urn:oasis:nombres:tc:entidad:xmlns:xml:catálogo" prefer= "público" >
<public publicId= "-//W3C//DTD XHTML 1.0 Strict//ES" uri= "dtd/xhtml1/xhtml1-strict.dtd" />
<public publicId= "-//W3C//DTD XHTML 1.0 Transitional//ES" uri= "dtd/xhtml1/xhtml1-transitional.dtd" />
<public publicId= "-//W3C//DTD XHTML 1.1//ES" uri= "dtd/xhtml11/xhtml11-flat.dtd" />
</catálogo>
Este catálogo permite resolver -//W3C//DTD XHTML 1.0 Strict//ENel URI local dtd/xhtml1/xhtml1-strict.dtd. De manera similar, proporciona URI locales para otros dos identificadores públicos.
Tenga en cuenta que el documento anterior incluye un DOCTYPE; esto puede provocar que el analizador intente acceder a la URL de ID del sistema para el DOCTYPE (es decir, http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd) antes de que el solucionador de catálogo esté funcionando por completo, lo que probablemente no sea deseable. Para evitar esto, simplemente elimine la declaración DOCTYPE.
El siguiente ejemplo muestra esto y también muestra las <system/>declaraciones equivalentes como alternativa a <public/>las declaraciones.
<?xml version="1.0"?>
<catálogo xmlns= "urn:oasis:nombres:tc:entidad:xmlns:xml:catálogo" >
<sistema 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" />
<sistema systemId= "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" uri= "dtd/xhtml11/xhtml11-flat.dtd" />
</catálogo>
Uso de un catálogo: ejemplo de Java SAX
Los solucionadores de catálogo están disponibles para varios lenguajes de programación. El siguiente ejemplo muestra cómo, en Java, se puede crear un analizador SAXorg.apache.xml.resolver.tools.CatalogResolver para analizar una fuente de entrada en la que se utiliza para resolver entidades externas en instancias almacenadas en caché local. Este solucionador se origina en Apache Xerces , pero ahora se incluye en el entorno de ejecución Sun Java.
Es necesario crear un XML SAXParserde la forma estándar mediante fábricas. El solucionador de entidades del lector XML debe configurarse con el valor predeterminado o con uno personalizado.
final SAXParser saxParser = SAXParserFactory . newInstance (). newSAXParser (); final XMLReader lector = saxParser . getXMLReader ();
final ContentHandler manejador = ...; final InputSource entrada = ...;
lector . setEntityResolver ( new CatalogResolver () ); lector . setContentHandler ( manejador ); lector . parse ( entrada );
Es importante llamar al parsemétodo en el lector, no en el analizador SAX.
Referencias
- ^ Walsh, Norman (7 de octubre de 2005). «Catálogos XML OASIS Standard V1.1» (PDF) . OASIS (pdf) . Consultado el 4 de noviembre de 2023 .
- Catálogos XML. Estándar OASIS, versión 1.1. 7 de octubre de 2005.
- Resolutores de entidades XML y URI, Sun
- Proyecto XML Catalog Manager en SourceForge