Předpokládám, že jeho obsah souvisí s validací. Zbytek kódu se mi zdá napsaný klasicky bez ohledu na importní tagy.
Dušan Dne 4. února 2013 15:58 Dušan Rychnovský <[email protected]> napsal(a): > > //Creating an instance of our special handler > > final MyContentHandler handler = new MyContentHandler(); > > Mohl byste prosím přiložit i kód třídy MyContentHandler? > > Děkuji za pomoc > Dušan > > > Dne 4. února 2013 15:36 Vladislav Korecký > <[email protected]>napsal(a): > > Dobrý den, >> řešil jsem stejný problém. >> XSD mám v resource, ale je možné použít i XSD z disku. Ostatní XSD leží >> ve stejné složce jako výchoz XSD. >> >> Java code: >> public static void validateXmlFile(File xmlFile) throws >> ParserConfigurationException, IOException, JAXBException, SAXException { >> //Building a Schema instance >> SchemaFactory schemaFactory = >> SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); >> Source schemaFile = new StreamSource(new >> File(Validator.class.getResource("/xsd/mets.xsd").getPath())); >> Schema schema = schemaFactory.newSchema(schemaFile); >> >> //Creating a SAXParser for our input XML >> //First the factory >> final SAXParserFactory factory = SAXParserFactory.newInstance(); >> //Must be namespace aware to receive element names >> factory.setNamespaceAware(true); >> //Setting the Schema for validation >> factory.setSchema(schema); >> //Now the parser itself >> final SAXParser parser = factory.newSAXParser(); >> >> //Creating an instance of our special handler >> final MyContentHandler handler = new MyContentHandler(); >> >> //Parsing >> parser.parse(xmlFile, handler); >> } >> >> >> V XSD mám: >> <xsd:schema >> targetNamespace="http://www.loc.gov/METS/"<http://www.loc.gov/METS/>xmlns= >> "http://www.loc.gov/METS/" <http://www.loc.gov/METS/> >> >> xmlns:xlink="http://www.w3.org/1999/xlink"<http://www.w3.org/1999/xlink>xmlns:xsd= >> "http://www.w3.org/2001/XMLSchema" <http://www.w3.org/2001/XMLSchema> >> >> xmlns:nsesss="http://www.mvcr.cz/nsesss/v2"<http://www.mvcr.cz/nsesss/v2>elementFormDefault="qualified" >> attributeFormDefault="unqualified"> >> <xsd:import >> namespace="http://www.w3.org/1999/xlink"<http://www.w3.org/1999/xlink> >> schemaLocation="xlink.xsd" /> >> <xsd:import >> namespace="http://www.mvcr.cz/nsesss/v2"<http://www.mvcr.cz/nsesss/v2> >> schemaLocation="nsesss.xsd" /> >> ... >> >> >> S pozdravem, >> Korecký >> >> [image: GORDIC spol. s r.o.] Ing. Vladislav Korecký >> <[email protected]> >> vedoucí týmu POR >> programátor - analytik >> ------------------------------ >> *GORDIC - tým POR (Portálová Řešení)* >> GORDIC spol. s r.o., Erbenova 4, 586 01 Jihlava, Czech Republic >> TEL: +420 567 571 491 >> Dne 4. 2. 2013 14:01, Dušan Rychnovský napsal(a): >> >> Dobrý den, >> >> mám následující problém. >> >> Potřebuji ve své aplikaci validovat XML soubory oproti XSD schématu. >> Toto schéma je ale rozloženo do několika (cca 10ti) souborů propojených >> navzájem pomocí tagů include a import. >> >> Podle rad na internetu jsem sestavil níže uvedený kód (prototypu), >> který ovšem nefunguje dobře. >> >> Kontrolou logů vypisovaných na konzoli se zdá že řešení opravdu >> prochází tagy include/import (a to průchodem do hloubky), nicméně z >> neznámých důvodů občas některé z nich přeskočí. Dlouho jsem hledal rozdíly >> mezi tagy, které se úspěšně zpracují a těmi, které jsou přeskočeny. Nicméně >> na nic jsem nepřišel. >> >> V konkrétním případě například z těchto tří řádků se první a poslední >> úspěšně zpracují, zatímco prostřední je ignorován. Všechna schémata >> existují, jsou dostupná, validní (nicméně to by nemělo mít na chybu vliv, >> protože resolver vůbec nedostane za úkol tento import řešit). >> >> <import namespace="schemas/src/x20130601" >> schemaLocation="../../x20130601/Personalnumber.xsd"/> >> <import namespace="schemas/src/common/2008/01/03" >> schemaLocation="../../../contract/x20080103/Contractnumber.xsd"/> >> <import namespace="schemas/src/20100504" >> schemaLocation="../../../system/x20100504/Contractidentification.xsd" /> >> >> Díky tomu, že se některé importy nezpracují, pak dostávám výjimky >> tohoto charakteru: >> >> Exception in thread "main" org.xml.sax.SAXParseException; systemId: >> file:/z:/--- project path ---/schemas//x20130504/Identification.xsd; >> lineNumber: 18; columnNumber: 61; src-resolve: Cannot resolve the name >> 'dat20080103:Contractnumber' to a(n) 'element declaration' component. >> >> Deklarace chybějícího elementu se nachází v přeskočeném XSDčku. >> >> Prosím poraďte, kde hledat chybu, nebo alternativní řešení. >> >> Předem děkuji za pomoc, >> Dušan Rychnovský >> ------------------ >> Main.java: >> >> private static final String PROJECT_ROOT_DIR_PATH = "--- >> project-root-path ---"; >> private static final String SCHEMAS_ROOT_PATH = "--- schemas root path >> ---"; >> >> private void validate() throws Exception >> { >> DocumentBuilderFactory builderFactory = >> DocumentBuilderFactory.newInstance(); >> builderFactory.setNamespaceAware(true); >> >> DocumentBuilder parser = builderFactory.newDocumentBuilder(); >> >> // parse the XML into a document object >> Document document = parser.parse( >> new File( >> PROJECT_ROOT_DIR_PATH + >> "src\\test\\resources\\example.xml" >> ) >> ); >> >> SchemaFactory factory = >> SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); >> >> // associate the schema factory with the resource resolver, which is >> responsible for resolving the imported XSD's >> factory.setResourceResolver(new ResourceResolver(PROJECT_ROOT_DIR_PATH + >> SCHEMAS_ROOT_PATH)); >> >> Schema schema = factory.newSchema( >> new File( >> PROJECT_ROOT_DIR_PATH + >> SCHEMAS_ROOT_PATH + >> "--- root-xsd-file-path\\root-schema.xsd ---" >> ) >> ); >> >> Validator validator = schema.newValidator(); >> validator.validate(new DOMSource(document)); >> } >> >> ------------------ >> ResourceResolver.java: >> >> public class ResourceResolver implements LSResourceResolver >> { >> @Override >> public LSInput resolveResource(String type, String namespaceURI, >> String publicId, String systemId, String baseURI) >> { >> if (!"http://www.w3.org/2001/XMLSchema".equals(type)) >> { >> throw new IllegalArgumentException( >> "Unexpected resource type [" + type + "]." >> ); >> } >> >> if (systemId == null) >> { >> throw new IllegalArgumentException( >> "Unexpected resource system-id [" + systemId + "]." >> ); >> } >> >> System.out.println("base-uri: " + baseURI); >> System.out.println("system-id: " + systemId); >> >> URI targetURI = getTargetURI(baseURI, systemId); >> System.out.println("target-uri: " + targetURI); >> >> System.out.println("---"); >> >> Input input = null; >> >> try { >> input = new Input(baseURI, publicId, systemId, >> targetURI.toURL().openStream()); >> } >> catch (Exception ex) >> { >> throw new RuntimeException( >> "Could not open resource stream - " + ex.getMessage() >> ); >> } >> >> return input; >> } >> >> private static URI getTargetURI(String baseURI, String relativePath) >> { >> URI targetURI = null; >> >> try { >> targetURI = (new URI(baseURI)).resolve(relativePath); >> } >> catch (URISyntaxException ex) >> { >> throw new RuntimeException( >> "Could not resolve target URI - " + ex.getMessage() >> ); >> } >> >> return targetURI; >> } >> } >> >> ------------------ >> Input.java: >> >> public class Input implements LSInput >> { >> private BufferedInputStream inputStream; >> >> private String baseURI; >> private String publicId; >> private String systemId; >> >> public Input(String baseURI, String publicId, String sysId, InputStream >> input) >> { >> this.baseURI = baseURI; >> this.publicId = publicId; >> this.systemId = sysId; >> this.inputStream = new BufferedInputStream(input); >> } >> >> public String getPublicId() >> { >> return publicId; >> } >> >> public void setPublicId(String publicId) >> { >> this.publicId = publicId; >> } >> >> public String getBaseURI() >> { >> return baseURI; >> } >> >> public InputStream getByteStream() >> { >> return null; >> } >> >> public boolean getCertifiedText() >> { >> return false; >> } >> >> public Reader getCharacterStream() >> { >> return null; >> } >> >> public String getEncoding() >> { >> return null; >> } >> >> public String getStringData() >> { >> synchronized (inputStream) >> { >> try { >> return IOUtils.toString(inputStream); >> } >> catch (IOException e) { >> e.printStackTrace(); >> System.out.println("Exception " + e); >> return null; >> } >> } >> } >> >> public void setBaseURI(String baseURI) { >> } >> >> public void setByteStream(InputStream byteStream) { >> } >> >> public void setCertifiedText(boolean certifiedText) { >> } >> >> public void setCharacterStream(Reader characterStream) { >> } >> >> public void setEncoding(String encoding) { >> } >> >> public void setStringData(String stringData) { >> } >> >> public String getSystemId() { >> return systemId; >> } >> >> public void setSystemId(String systemId) { >> this.systemId = systemId; >> } >> >> public BufferedInputStream getInputStream() >> { >> return inputStream; >> } >> >> public void setInputStream(BufferedInputStream inputStream) >> { >> this.inputStream = inputStream; >> } >> } >> >> >> >
