I'm attempting to parse load a rather complicated XML schema into a Schema object in Java so I can do some validation on XML messages.
My code looks similar to this:
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd")));
My schema has quite a few imports:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="base_1">
<xs:import namespace="base_1" schemaLocation="common/MessageBase.xsd"/>
</xs:schema>
...etc. When I attempt to load the schema, I get lots of errors. Based on one other question related to this, it looks like I need to specify a resource resolver, but isn't this something that should be handled by default?
If so, is there a specific directory I need to put the schema in relative to where I run the application I'm writing or relative to the base schema file?
Finally, when I load the schema with XMLSpy or similar, it works fine and I can validate XML instances with no problem.
There is no need for a resource resolver if you use an URL instead of a StreamSource.
URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(schemaFileName);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaURL);
I think that the use of StreamSource, without specifying the base location, is the source of your problem.
The parser has no way of knowing where the main schema is, so it can't resolve common/MessageBase.xml.
Use the two-argument constructor and pass in a SystemID that is the pathname where you're starting from.
See the javadoc for StreamSource.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With