Java 当XSD驻留在JAR中时,如何在JAXB中使用包含另一个XSD的XSD?

Java 当XSD驻留在JAR中时,如何在JAXB中使用包含另一个XSD的XSD?,java,xml,jar,xsd,jaxb,Java,Xml,Jar,Xsd,Jaxb,我正在将通过XSD文件验证的XML文件读入XJC生成的类中。当我在普通文件系统中引用XSD时,所有这些都可以正常工作。现在我想把XSD捆绑到我的JAR中。只要XSD是独立的,并且具有以下代码,这也可以正常工作: //Use the schema factory to get the schema SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); //Get XSD from JAR

我正在将通过XSD文件验证的XML文件读入XJC生成的类中。当我在普通文件系统中引用XSD时,所有这些都可以正常工作。现在我想把XSD捆绑到我的JAR中。只要XSD是独立的,并且具有以下代码,这也可以正常工作:

//Use the schema factory to get the schema
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

//Get XSD from JAR
InputStream schemaStream = getClass().getResourceAsStream("/schema/myschema.xsd");
Schema schema = sf.newSchema(new StreamSource(schemaStream));

//parse the XML file and fill the data model
Class<T> c = getXmlDataModelClass();
JAXBContext jaxbContext = JAXBContext.newInstance(c);

m_JaxbUnmarshaller = jaxbContext.createUnmarshaller();

//set the schema to be considered
m_JaxbUnmarshaller.setSchema(schema);

return (T)m_JaxbUnmarshaller.unmarshal(file);
//使用架构工厂获取架构
SchemaFactory sf=SchemaFactory.newInstance(xmlstants.W3C\u XML\u SCHEMA\u NS\u URI);
//从JAR获取XSD
InputStream schemaStream=getClass().getResourceAsStream(“/schema/myschema.xsd”);
Schema Schema=sf.newSchema(newstreamsource(schemaStream));
//解析XML文件并填充数据模型
c类=getXmlDataModelClass();
JAXBContext JAXBContext=JAXBContext.newInstance(c);
m_JaxbUnmarshaller=jaxbContext.createUnmarshaller();
//设置要考虑的架构
m_JaxbUnmarshaller.setSchema(schema);
return(T)m_jaxbunmarshal.unmarshal(文件);
现在的问题是:如果myschema.xsd包含另一个xsd:

<xs:include schemaLocation="BaseTypes.xsd"/>

未找到包含的XSD中的类型


我还尝试通过两个XSD将两个
StreamSource
的数组传递到
sf.newSchema()
,但没有帮助。

最简单的方法是使用URL,类似(未测试):

您将获得一个
jar:…
URL,并将其提供给模式工厂。只要包含的模式驻留在同一个JAR中,就应该毫无问题地解决它们

对于更高级的用法,您可以实例化并向架构工厂提供资源解析程序:

sf.setResourceResolver(myResourceResolver);
资源解析器将架构解析为资源。例如,您可以使用
XMLCatalogResolver
之类的工具来使用目录文件重写模式URL。这将允许您将绝对URL重写为本地资源。

sf.setResourceResolver(myResourceResolver);