2011-08-10 16 views
7

Tengo dos archivos xsd para validar un xml. Pero el problema es que mi código solo toma una xsd. ¿Cómo usar otras xsd en el siguiente código? No tengo idea sobre dónde debo colocar/llamar al segundo archivo xsd.Validación de XML - Usar múltiples xsd's

   private void validate(File xmlF,File xsd1,File xsd2) { 
        try { 
         url = new URL(xsd.toURI().toString());// xsd1 
        } catch (MalformedURLException e) { 
         e.printStackTrace(); 
        } 


        source = new StreamSource(xml); // xml 
        try { 
         System.out.println(url); 
         schema = schemaFactory.newSchema(url); 
        } catch (SAXException e) { 
         e.printStackTrace(); 
        } 
        validator = schema.newValidator(); 
        System.out.println(xml); 
        try { 
         validator.validate(source); 
        } catch (SAXException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
+4

¿Ya intentó ['newSchema (Source [])'] (http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/SchemaFactory.html#newSchema (javax.xml) .transform.Source []))? –

+0

Sí. Lo intenté de esa manera. No funciona, probablemente porque Source [] se usa para xml. No podemos convertir xsd a la fuente. – freepublicview

+2

Al igual que con la pregunta anterior sobre este proyecto de validación XML, me gustaría dirigirlo a [SSCCE] (http://sscce.org/). Su fragmento de código está lejos de estar completo al definir variables fuera de este método, etc. Prestar atención a la forma en que hace su pregunta, nos ayuda a ayudarlo. – Wivani

Respuesta

20

Un montón de visitas al buscar en SO o Google. Uno de ellos es this cuestión, en el que el autor encontró su propia solución y reporta el siguiente código para agregar varias de XSD para el validador:

Schema schema = factory().newSchema(new Source[] { 
    new StreamSource(stream("foo.xsd")), 
    new StreamSource(stream("Alpha.xsd")), 
    new StreamSource(stream("Mercury.xsd")), 
}); 

Sin embargo, cuando se trabaja directamente con InputStream en StreamSource, la resolución no es capaz de cargar cualquier archivo XSD referenciado. Si, por ejemplo, el archivo xsd1 importa o incluye un tercer archivo (que no es xsd2), la creación del esquema fallará. Debe establecer el identificador del sistema (setSystemId) o (incluso mejor) usar el constructor StreamSource(File f).

ajustar a su ejemplo de código:

try { 
    schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    schema = schemaFactory.newSchema(new Source[] { 
    new StreamSource(xsd1), new StreamSource(xsd2) 
    }); 
} catch (SAXException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Nota:

Si se trabaja con recursos de rutas de clases, preferiría el constructor StreamSource(String systemId) (en lugar de crear un File):

new StreamSource(getClass().getClassLoader().getResource("a.xsd").toExternalForm()); 
+0

Esa es una gran solución. gracias – freepublicview

+0

Esto es exactamente lo mismo que mi pregunta anterior. –

+3

Es la misma solución que ofreciste en tu comentario. Es por eso que voté por encima de tu comentario. Sin embargo, OP tuvo problemas para implementarlo; Tenía el código listo en mi Eclipse al responder a su pregunta anterior y simplemente lo ajusté para mostrar cómo usar Fuente []. Sin resentimientos, espero? – Wivani

Cuestiones relacionadas