2011-08-10 11 views
7

Mam dwa pliki xsd do sprawdzania poprawności xml. Ale problem polega na tym, że mój kod przyjmuje tylko jeden xsd. Jak korzystać z innych xsd w poniższym kodzie? Nie mam pojęcia, gdzie powinienem umieścić/wywołać drugi plik xsd.Sprawdzanie poprawności XML - używanie wielu xsd z

   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

Czy próbowałeś już ['newSchema (Source [])'] (http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/SchemaFactory.html#newSchema (javax.xml .transform.Source []))? –

+0

Tak. Próbowałem w ten sposób. To nie działa, prawdopodobnie dlatego, że Source [] jest używane dla xml. Nie możemy typować danych XSD do źródła. – freepublicview

+2

Podobnie jak w przypadku poprzedniego pytania dotyczącego tego projektu sprawdzania poprawności XML, chciałbym wskazać [SSCCE] (http://sscce.org/). Twój fragment kodu jest daleki od ukończenia, ponieważ definiujesz zmienne spoza tej metody itp. Zwrócenie uwagi na sposób, w jaki zadajesz swoje pytanie, pomaga nam pomagać. – Wivani

Odpowiedz

20

Mnóstwo hity podczas wyszukiwania w SO lub Google. Jednym z nich jest this pytanie, gdzie autor znalazł swoje własne rozwiązanie i informuje poniższy kod, żeby dodać kilka xsd do walidatora:

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

Jednak podczas pracy bezpośrednio z InputStream na StreamSource, program rozpoznawania nazw nie jest w stanie ładuj wszystkie przywoływane pliki XSD. Jeśli na przykład plik xsd1 importuje lub zawiera trzeci plik (który nie jest xsd2), tworzenie schematu zakończy się niepowodzeniem. Powinieneś ustawić identyfikator systemu (setSystemId) lub (jeszcze lepiej) użyć konstruktora StreamSource(File f).

Dostosowane do kodu Przykład:

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

Uwaga:

przypadku pracy z zasobami ścieżki klasy, wolałbym konstruktora StreamSource(String systemId) (zamiast tworzenia File):

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

To świetne rozwiązanie. dzięki – freepublicview

+0

To jest dokładnie to samo co moje pytanie powyżej. –

+3

To jest to samo rozwiązanie, które zaoferowałeś w swoim komentarzu. Właśnie dlatego przegłosowałem twój komentarz. OP miał jednak problemy z jego wdrożeniem; W moim Eclipse miałem gotowy kod odpowiadający na jego poprzednie pytanie i po prostu dostosowałem go, aby pokazać, jak używać Source []. Czy mam nadzieję, że nie mam żadnych uczuć? – Wivani

Powiązane problemy