2012-08-07 11 views
6

Estoy intentando hacer la validación xml. Me están dando una lista de esquemas en tiempo de ejecución (posiblemente envuelto en un contenedor). Pases o failes de validación basados ​​en el orden en que proporciono los esquemas a SchemaFactory.Validar XML con esquemas de carga en tiempo de ejecución, falla según el orden del esquema

Aquí es lo que estoy haciendo:

private void validateXml(String xml, List<URI> schemas){ 
     Source[] source = new StreamSource[schemas.size()]; 
     int i=0; 
     for (URI f : schemas){ 
      source[i++] = new StreamSource(f.openStream()); 
     } 

     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NA_URI); 
     sf.setResourceResolver(new MyClassPathResourceResolver()); 

     Schema schema = schemaFactory.newSchema(source); 
     Validator validator = schema.newValidator(); 
     validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes())); 

de nuevo, esto no funciona si el conjunto pasó de esquema no se inician con el esquema al que el elemento raíz de los referrs XML. ¿Hay una solución a esto o estoy haciendo algo mal?

+0

¿Puedes publicar los esquemas y XML en alguna parte? – davidfmatheson

+0

@davidfmatheson Desafortunadamente eso no es posible, puedo decir que es un conjunto de esquemas, el esquema raíz y un segundo esquema que permite reemplazar el cuerpo del primer esquema con una etiqueta diferente. –

Respuesta

5

De manera predeterminada, Xerces ignorará un documento de esquema si ya tiene un documento de esquema para el mismo espacio de nombres. Este comportamiento se puede cambiar mediante la opción de fábrica

http://apache.org/xml/features/validation/schema/handle-multiple-imports

+0

Recibo un HTTP 404 en este enlace, ¿podría proporcionar algunos detalles adicionales? –

+0

Además, necesito cargar 2 esquemas (cada uno de los cuales importa esquemas adicionales). Si los cargo en el orden correcto, todo está bien. De lo contrario, no hay alegría. Los dos esquemas tienen namspaces de destino diferentes. –

+0

Intenta buscarlo en lugar de usarlo como una URL. Es un nombre de opción JAXP no una URL. (OK, algunos navegadores lo dificultan combinando la barra de direcciones y la barra de búsqueda. Hazlo de la manera antigua yendo a google.com). –

0

En primer lugar, debe establecer una instancia de objeto org.xml.sax.ErrorHandler el lector XML llamando al método registerErrorHandler(). Es posible que reciba advertencias que le darían pistas sobre el problema.

En segundo lugar, debe saber qué biblioteca xml está utilizando. Llame a schemaFactory.getClass(). GetName() en su código e imprímalo. Una vez que conozca la biblioteca, puede consultar su documentación si es compatible con la función para activar/desactivar las importaciones de esquemas múltiples.

+0

La clase es 'com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory' –

Cuestiones relacionadas