2012-08-07 12 views
6

Próbuję wykonać sprawdzanie poprawności xml. Otrzymuję listę schematów w czasie wykonywania (ewentualnie zapakowany w słoik). Sprawdzanie poprawności przebiega lub kończy się niepowodzeniem na podstawie kolejności, w jakiej dostarczam schematy do SchemaFactory.Sprawdzanie poprawności XML z ładowaniem schematów w środowisku wykonawczym, awaria w zależności od kolejności schematu

Oto co robię:

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

ponownie, to się nie powiedzie, jeśli przekazany zestaw schematu nie zaczynają się od schematu, do którego element główny z referrs xml. Czy to jest poprawka, czy robię coś nie tak?

+0

Czy umieścisz gdzieś schematy i XML? – davidfmatheson

+0

@davidfmatheson Niestety nie jest to możliwe, mogę powiedzieć, że jest to zestaw schematów, schemat główny i drugi schemat, który pozwala na zastąpienie ciała pierwszego schematu innym znacznikiem. –

Odpowiedz

5

Domyślnie Xerces zignoruje dokument schematu, jeśli ma już dokument schematu dla tej samej przestrzeni nazw. Takie zachowanie można zmienić za pomocą opcji fabrycznych

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

+0

Otrzymuję HTTP 404 w tym łączu, czy mógłbyś podać dodatkowe szczegóły? –

+0

Muszę również załadować 2 schematy (z których każdy importuje dodatkowe schematy). Jeśli załaduję je we właściwej kolejności, wszystko będzie dobrze. W przeciwnym razie nie ma radości. Oba schematy mają różne docelowe przestrzenie docelowe. –

+0

Spróbuj wyszukać, zamiast używać go jako adresu URL. Jest to nazwa opcji JAXP, a nie URL. (OK, niektóre przeglądarki utrudniają, łącząc pasek adresu i pasek wyszukiwania. Zrób to stary sposób, wchodząc na google.com). –

0

Po pierwsze, należy ustawić instancję obiektu org.xml.sax.ErrorHandler na czytniku XML przez wywołanie metody registerErrorHandler(). Możesz otrzymać ostrzeżenia, które dadzą ci wskazówkę na temat problemu.

Po drugie, musisz wiedzieć, której biblioteki XML używasz. Wywołaj kod schemaFactory.getClass(). GetName() w swoim kodzie i wydrukuj go. Gdy znasz już bibliotekę, możesz odesłać jej dokumentację, jeśli obsługuje ona funkcję włączania/wyłączania wielu importów schematu.

+0

Klasa to 'com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory' –

Powiązane problemy