Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing Schema in Java With imports and includes?

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.

like image 327
magneticMonster Avatar asked Nov 13 '09 21:11

magneticMonster


2 Answers

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);
like image 139
Peter Avatar answered Sep 23 '22 18:09

Peter


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.

like image 32
bmargulies Avatar answered Sep 20 '22 18:09

bmargulies