Los documentos XML normalmente se refieren a entidades externas, por ejemplo, el ID público y / o del sistema para 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 al tiempo de inactividad de la red tanto planificado como no planificado.
Las URL relativas solo son útiles en el contexto en el que se crearon inicialmente. Por ejemplo, la URL "../../xml/dtd/docbookx.xml" generalmente 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 un mapeo entre referencias de entidades externas y equivalentes en caché local.
Ejemplo Catalog.xml
El siguiente catálogo simple muestra cómo se pueden proporcionar DTD en caché local para una herramienta de validación de página XHTML, por ejemplo.
xml version = "1.0"?> PUBLIC "- // OASIS // DTD Entity Resolution XML Catalog V1.0 // EN" "http://www.oasis-open.org/committees/entity /release/1.0/catalog.dtd "> xmlns = "urn: oasis: names: tc: entity: xmlns: xml: catalog" prefer = "public" > publicId = "- // W3C // DTD XHTML 1.0 Strict // ES" uri = "dtd / xhtml1 / xhtml1-strict.dtd" /> publicId = "- // W3C // DTD XHTML 1.0 Transitional // EN" uri = "dtd / xhtml1 / xhtml1-transitional.dtd" /> publicId = "- // W3C // DTD XHTML 1.1 // ES" uri = "dtd / xhtml11 / xhtml11-flat.dtd" />
Este catálogo permite resolver - // W3C // DTD XHTML 1.0 Strict // EN al URI local dtd / xhtml1 / xhtml1-strict.dtd . Del mismo modo, proporciona URI locales para otros dos ID públicos.
Tenga en cuenta que el documento anterior incluye un DOCTYPE; esto puede hacer 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álogos esté funcionando completamente, 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 declaraciones
xml version = "1.0"?> xmlns = "urn: oasis: names: tc: entity: xmlns: xml: catalog" > systemId = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" uri = "dtd / xhtml1 / xhtml1-strict.dtd" /> systemId = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" uri = "dtd / xhtml1 / xhtml1-transitional.dtd" /> systemId = "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" uri = "dtd / xhtml11 / xhtml11-flat.dtd" />
Usando un catálogo - ejemplo de Java SAX
Los solucionadores de catálogos están disponibles para varios lenguajes de programación. El siguiente ejemplo muestra cómo, en Java, se puede crear un analizador SAX para analizar alguna fuente de entrada en la que org.apache.xml.resolver.tools.CatalogResolver se usa para resolver entidades externas en instancias en caché local. Este solucionador se origina en Apache Xerces, pero ahora se incluye con el tiempo de ejecución de Sun Java.
Es necesario crear un SAXParser de la forma estándar mediante el uso de fábricas. El solucionador de entidades del lector XML debe establecerse en el valor predeterminado o en uno personalizado.
última SAXParser SAXParser = SAXParserFactory . newInstance (). newSAXParser (); Lector final de XMLReader = saxParser . getXMLReader (); controlador final ContentHandler = ...; InputSource final input = ...; lector . setEntityResolver ( new CatalogResolver () ); lector . setContentHandler ( controlador ); lector . analizar ( entrada );
Es importante llamar al método de análisis sintáctico en el lector, no en el analizador SAX.
Referencias
- Catálogos XML. Estándar OASIS, Versión 1.1. 7 de octubre de 2005.
- Solucionadores de entidades XML y URI , Sun
- Proyecto XML Catalog Manager en Sourceforge