Parsing Schema in Java With imports and includes?

戏子无情 提交于 2019-12-03 20:10:30

问题


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.


回答1:


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.




回答2:


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



回答3:


In order to resolve the imported XSDs you have to associate the schema factory with a resource resolver:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setResourceResolver(new MyResourceResolver());
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd")));

For further details you can look at this answer.



来源:https://stackoverflow.com/questions/1732161/parsing-schema-in-java-with-imports-and-includes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!