2012-08-07 16 views
6

Sto tentando di eseguire la convalida xml. Mi viene data una lista di schemi in fase di esecuzione (possibilmente racchiusa in un barattolo). La convalida passa o fallisce in base all'ordine in cui fornisco gli schemi a SchemaFactory.Convalida XML con schemi di caricamento in fase di esecuzione, errore in base all'ordine dello schema

Ecco quello che sto facendo:

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())); 

di nuovo, questa non riesce se il set passata di schema non iniziare con lo schema a cui l'elemento principale delle referrs xml. C'è una soluzione a questo o sto facendo qualcosa di sbagliato?

+0

Puoi pubblicare gli schemi e XML da qualche parte? – davidfmatheson

+0

@davidfmatheson Sfortunatamente non è possibile, posso dire che è un insieme di schemi, lo schema radice e un secondo schema che consente la sostituzione del corpo del primo schema con un tag diverso. –

risposta

5

Per impostazione predefinita, Xerces ignorerà un documento dello schema se dispone già di un documento schema per lo stesso spazio dei nomi. Questo comportamento può essere modificato utilizzando l'opzione di fabbrica

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

+0

Ricevo un HTTP 404 in questo collegamento, potresti fornire ulteriori dettagli? –

+0

Inoltre, ho bisogno di caricare 2 schemi (ciascuno dei quali importare schemi aggiuntivi). Se li carico nell'ordine corretto, va tutto bene. Altrimenti, nessuna gioia. I due schemi hanno diversi namspace di destinazione. –

+0

Prova a cercarlo invece di usarlo come URL. È un nome di opzione JAXP non un URL. (OK, alcuni browser lo rendono difficile combinando la barra degli indirizzi e la barra di ricerca. Fai il vecchio modo andando a google.com). –

0

In primo luogo, è necessario impostare un'istanza di oggetto org.xml.sax.ErrorHandler il lettore XML chiamando il metodo registerErrorHandler(). Potresti ricevere avvertimenti che ti daranno un indizio sul problema.

In secondo luogo, è necessario sapere quale libreria xml si sta utilizzando. Chiama schemaFactory.getClass(). GetName() nel codice e stampalo. Una volta che conosci la libreria, puoi consultare la sua documentazione se supporta la funzionalità per attivare/disattivare più importazioni di schemi.

+0

La classe è 'com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory' –

Problemi correlati