XML validado con Schema

La validación de un documento XML utilizando Schemas requiere dos pasos, al igual que cuando son utilizados DTD's

Declaración en el Documento XML

Debe ser definido en el elemento raíz (el primero del documento XML) el Schema que será empleado através de un Namespace/atributo :

<?xml version="1.0" encoding="UTF-8"?>
<agenda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:noNamespaceSchemaLocation="agenda.xsd">

La primer declaración indica el Namespace utilizado para documentos que serán validados através de Schema; cabe mencionar (de nuevo) que al ser procesado el documento no se visita la pagina de www.w3.org, sino que esta declaración es resuelta a una definición interna en el parser.

El parámetro xsi:noNamespaceSchemaLocation="agenda.xsd", indica que el Schema utilizado para validar el documento es el archivo llamado agenda.xsd el cual se encuentra en el mismo directorio del documento en cuestión.

De acuerdo a las reglas de Namespaces lo anterior también permite que todo elemento anidado dentro de esta declaración pertenezca al "Default Namespace" por lo que no se requiere de ningún prefijo en los elementos del documento XML.

Hasta este punto si es procesado el documento , la única validación que es llevada acabo es la de "Well Formdness" y que el Schema exista en el directorio indicado, para que sea llevada acabo una validación completa "Fully Validated" es necesario pasar unos parámetros de configuración al parser.

Modificación del Parser para utilizar Schemas

Las modificaciones al parser son llevadas acabo através de parámetros al momento de ser inicializado, si recuerda del programa procesando XML vía SAX esta inicialización fue llevada acabo através de SAXParserFactory (parte de JAXP) , para activar la validación completa es necesario definir los siguientes parámetros:

	// Constantes para validación de Schemas 
        static final String JAXP_SCHEMA_LANGUAGE = 
                   "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
	static final String W3C_XML_SCHEMA = 
                   "http://www.w3.org/2001/XMLSchema";
             ...  
             ...
             ...

SAXParserFactory factory = SAXParserFactory.newInstance();
     factory.setValidating(true);
     factory.setNamespaceAware(true); 

	try { 
	    //  Generar un nuevo Stream
	    out = new OutputStreamWriter (System.out, "UTF8");
	    
	    // Procesar y genera un Parser
	    SAXParser saxParser = factory.newSAXParser();
            
            try { 
		saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
	    } catch (SAXNotRecognizedException exc) { 
		System.err.println("Error: Propiedad JAXP no reconocida : " 
				   + JAXP_SCHEMA_LANGUAGE);
		System.err.println("Revise que este utilizando JAXP 1.2");
		System.exit(1);
	    }

Partiendo del programa procesando XML vía SAX es necesario definir dos constantes utilizadas para validar XML con "Schemas", posteriormente es necesario activar las propiedades setValidating y setNamespaceAware de la Clase SAXParserFactory y finalmente es necesario definir las propiedades declaradas inicialmente dentro de un bloque try/catch mediante el método setProperty de la Clase SAXParser.

Para DOM resulta el mismo caso , es cuestión de agregar los siguientes parámetros:

	// Constantes para validación de Schemas 
        static final String JAXP_SCHEMA_LANGUAGE = 
                 "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
	static final String W3C_XML_SCHEMA = 
                 "http://www.w3.org/2001/XMLSchema";
             ...  
             ...
             ...

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     factory.setValidating(true);
     factory.setNamespaceAware(true); 

	try { 
		 factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
	     } catch (IllegalArgumentException exc) { 
		System.err.println("Error: Propiedad JAXP no reconocida : " 
				   + JAXP_SCHEMA_LANGUAGE);
		System.err.println("Revise que este utilizando JAXP 1.2");
		System.exit(1);
	     }

Es necesario definir dos constantes utilizadas para validar XML con "Schemas", posteriormente es necesario activar las propiedades setValidating y setNamespaceAware de la Clase SAXParserFactory y finalmente es necesario activar las propiedades declaradas inicialmente dentro de un bloque try/catch mediante el método setAttribute de la misma Clase SAXParserFactory.

Al utilizar los programas anteriores en realidad se están llevando acabo 2 validaciones completas la del documento en cuestión y la del Schema, esto es, el Schema también debe cumplir con cierta estructura de elementos, una vez realizada la validación al Schema se inicia la validación al documento XML; en un futuro se espera desarrollar la funcionalidad de validar completamente un Schema en Xerces, sin la necesidad de declararlo através de otro documento XML, algunos productos productos integrados para el desarrollo de XML ya ofrecen esta funcionalidad.

Menú Curso

XML y sus Orígenes

Manipulación y Proceso de XML

DOM, SAX y JDOM

Namespaces, Schemas y DTD's

XSL: XSLT, XPath y TraX

XMLRPC y SOAP (Web Services)

Diseño con XMLRPC

Diseño con SOAP .

Apéndice "A" (Procesando XML con parsers).

Apéndice "B" (Validando XML con Schemas y DTD's).

Apéndice "C" (XSL: XPath y "XSL Stylesheets").

Apéndice "D" (XMLRPC: Diseño).

Apéndice "E" (SOAP, WSDL, UDDI y WSIL : Diseño).