Estoy usando Java 5 javax.xml.validation.Validator para validar el archivo XML. Lo hice por un esquema que usa solo importaciones y todo funciona bien. Ahora intento validar con otro esquema que usa importación y uno incluye. El problema que tengo es que ese elemento en el esquema principal se ignora, la validación dice que no puede encontrar su declaración.¿Cómo validar un archivo XML usando Java con un XSD que tenga un include?
Aquí es cómo construir el esquema:
InputStream includeInputStream = getClass().getClassLoader().getResource("include.xsd").openStream();
InputStream importInputStream = getClass().getClassLoader().getResource("import.xsd").openStream();
InputStream mainInputStream = getClass().getClassLoader().getResource("main.xsd").openStream();
Source[] sourceSchema = new SAXSource[]{includeInputStream , importInputStream,
mainInputStream };
Schema schema = factory.newSchema(sourceSchema);
Ahora aquí es un extracto de la declaración en main.xsd
<xsd:schema xmlns="http://schema.omg.org/spec/BPMN/2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:import="http://www.foo.com/import" targetNamespace="http://main/namespace" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:import namespace="http://www.foo.com/import" schemaLocation="import.xsd"/>
<xsd:include schemaLocation="include.xsd"/>
<xsd:element name="element" type="tElement"/>
<...>
</xsd:schema>
Si copio el código de mi XSD incluido en el principal .xsd, funciona bien. Si no lo hago, la validación no encuentra la declaración de "Elemento".
¡Muchas gracias por esta respuesta integral! Lo implementaré esta tarde y te haré saber cómo funcionó. Necesito crear el objeto Schema ya que no tengo idea de cómo se generará el archivo que se va a validar. No quiero confiar en su declaración. – Melanie
no hay problema, el código de muestra se toma de una prueba unitaria, por lo que es probable que necesite cambiar algunos bits para satisfacer sus necesidades –
Estoy casi allí. Ahora mi validador incluye el archivo incluido y el contenido del archivo principal. Pero tengo una excepción al cargar un archivo de importación, el contenido no está permitido en el prólogo ... Es con un archivo que se importa. Si cargué ese archivo directamente (construyo el esquema desde él en lugar del principal), no obtengo este error. ¿Alguna idea de qué puede causar este tipo de excepción en esa condición? – Melanie